From 3edc29bd4b83057695cbd0f703895cf29d369612 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 2 Jul 2015 16:15:20 -0700 Subject: [PATCH 001/582] Packet class squeleton --- libraries/networking/src/Packet.cpp | 22 ++++++++++++++++++++ libraries/networking/src/Packet.h | 31 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 libraries/networking/src/Packet.cpp create mode 100644 libraries/networking/src/Packet.h diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp new file mode 100644 index 0000000000..bb5cf98153 --- /dev/null +++ b/libraries/networking/src/Packet.cpp @@ -0,0 +1,22 @@ +// +// Packet.cpp +// +// +// Created by Clement on 7/2/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 "Packet.h" + +#include + +std::unique_ptr Packet::makePacket() { + return std::unique_ptr(new Packet()); +} + +QByteArray Packet::payload() { + return QByteArray(); +} \ No newline at end of file diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h new file mode 100644 index 0000000000..8541bfb881 --- /dev/null +++ b/libraries/networking/src/Packet.h @@ -0,0 +1,31 @@ +// +// Packet.h +// +// +// Created by Clement on 7/2/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_Packet_h +#define hifi_Packet_h + +#include + +class QByteArray; + +class Packet { + std::unique_ptr makePacket(); + QByteArray payload(); + +protected: + Packet(); + Packet(const Packet&) = delete; + Packet(Packet&&) = delete; + Packet& operator=(const Packet&) = delete; + Packet& operator=(Packet&&) = delete; +}; + +#endif // hifi_Packet_h \ No newline at end of file From 3a5701e02efad844d5c44f1e1f04397f1b41c98b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 16:18:44 -0700 Subject: [PATCH 002/582] first changes for new network API --- libraries/audio-client/src/AudioClient.cpp | 17 ++-- libraries/networking/src/PacketHeaders.h | 110 +++++++++++---------- 2 files changed, 65 insertions(+), 62 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a1bb9833bd..5b2c33f5b3 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -795,11 +795,11 @@ void AudioClient::handleAudioInput() { delete[] inputAudioSamples; - // Remove DC offset + // Remove DC offset if (!_isStereoInput && !_audioSourceInjectEnabled) { _inputGate.removeDCOffset(networkAudioSamples, numNetworkSamples); } - + // only impose the noise gate and perform tone injection if we are sending mono audio if (!_isStereoInput && !_audioSourceInjectEnabled && _isNoiseGateEnabled) { _inputGate.gateSamples(networkAudioSamples, numNetworkSamples); @@ -921,22 +921,23 @@ void AudioClient::processReceivedSamples(const QByteArray& inputBuffer, QByteArr void AudioClient::sendMuteEnvironmentPacket() { auto nodeList = DependencyManager::get(); - QByteArray mutePacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeMuteEnvironment); - int headerSize = mutePacket.size(); + int dataSize = sizeof(glm::vec3) + sizeof(float); + + NodeList::Packet mutePacket = nodeList->makePacket(PacketType::MuteEnvironment, dataSize); const float MUTE_RADIUS = 50; glm::vec3 currentSourcePosition = _positionGetter(); - mutePacket.resize(mutePacket.size() + sizeof(glm::vec3) + sizeof(float)); - memcpy(mutePacket.data() + headerSize, ¤tSourcePosition, sizeof(glm::vec3)); - memcpy(mutePacket.data() + headerSize + sizeof(glm::vec3), &MUTE_RADIUS, sizeof(float)); + + memcpy(mutePacket.payload().data(), ¤tSourcePosition, sizeof(glm::vec3)); + memcpy(mutePacket.payload() + sizeof(glm::vec3), &MUTE_RADIUS, sizeof(float)); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); if (audioMixer) { // send off this mute packet - nodeList->writeDatagram(mutePacket, audioMixer); + nodeList->sendPacket(mutePacket, audioMixer); } } diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 789675ec00..7712d83c44 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -26,60 +26,62 @@ // NOTE: if adding a new packet packetType, you can replace one marked usable or add at the end // NOTE: if you want the name of the packet packetType to be available for debugging or logging, update nameForPacketType() as well -enum PacketType { - PacketTypeUnknown, // 0 - PacketTypeStunResponse, - PacketTypeDomainList, - PacketTypePing, - PacketTypePingReply, - PacketTypeKillAvatar, // 5 - PacketTypeAvatarData, - PacketTypeInjectAudio, - PacketTypeMixedAudio, - PacketTypeMicrophoneAudioNoEcho, - PacketTypeMicrophoneAudioWithEcho, // 10 - PacketTypeBulkAvatarData, - PacketTypeSilentAudioFrame, - PacketTypeEnvironmentData, - PacketTypeDomainListRequest, - PacketTypeRequestAssignment, // 15 - PacketTypeCreateAssignment, - PacketTypeDomainConnectionDenied, - PacketTypeMuteEnvironment, - PacketTypeAudioStreamStats, - PacketTypeDataServerConfirm, // 20 - PacketTypeDomainServerPathQuery, - PacketTypeDomainServerPathResponse, - PacketTypeDomainServerAddedNode, - PacketTypeIceServerPeerInformation, - PacketTypeIceServerQuery, // 25 - PacketTypeOctreeStats, - PacketTypeJurisdiction, - PacketTypeJurisdictionRequest, - UNUSED_6, - UNUSED_7, // 30 - UNUSED_8, - UNUSED_9, - PacketTypeNoisyMute, - UNUSED_10, - PacketTypeAvatarIdentity, // 35 - PacketTypeAvatarBillboard, - PacketTypeDomainConnectRequest, - PacketTypeDomainServerRequireDTLS, - PacketTypeNodeJsonStats, - PacketTypeEntityQuery, // 40 - PacketTypeEntityData, - PacketTypeEntityAdd, - PacketTypeEntityErase, - PacketTypeEntityEdit, - PacketTypeOctreeDataNack, // 45 - PacketTypeStopNode, - PacketTypeAudioEnvironment, - PacketTypeEntityEditNack, - PacketTypeSignedTransactionPayment, - PacketTypeIceServerHeartbeat, // 50 - PacketTypeUnverifiedPing, - PacketTypeUnverifiedPingReply +namespace PacketType { + enum Value { + Unknown, // 0 + StunResponse, + DomainList, + Ping, + PingReply, + KillAvatar, // 5 + AvatarData, + InjectAudio, + MixedAudio, + MicrophoneAudioNoEcho, + MicrophoneAudioWithEcho, // 10 + BulkAvatarData, + SilentAudioFrame, + EnvironmentData, + DomainListRequest, + RequestAssignment, // 15 + CreateAssignment, + DomainConnectionDenied, + MuteEnvironment, + AudioStreamStats, + DataServerConfirm, // 20 + DomainServerPathQuery, + DomainServerPathResponse, + DomainServerAddedNode, + IceServerPeerInformation, + IceServerQuery, // 25 + OctreeStats, + Jurisdiction, + JurisdictionRequest, + UNUSED_6, + UNUSED_7, // 30 + UNUSED_8, + UNUSED_9, + NoisyMute, + UNUSED_10, + AvatarIdentity, // 35 + AvatarBillboard, + DomainConnectRequest, + DomainServerRequireDTLS, + NodeJsonStats, + EntityQuery, // 40 + EntityData, + EntityAdd, + EntityErase, + EntityEdit, + OctreeDataNack, // 45 + StopNode, + AudioEnvironment, + EntityEditNack, + SignedTransactionPayment, + IceServerHeartbeat, // 50 + UnverifiedPing, + UnverifiedPingReply + }; }; typedef char PacketVersion; From 1dfa592a134d4a6f1c01831e2249d6ca70549f4e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 16:31:33 -0700 Subject: [PATCH 003/582] use new enum across PacketHeaders --- libraries/networking/src/PacketHeaders.cpp | 198 +++++++++++---------- libraries/networking/src/PacketHeaders.h | 54 +++--- 2 files changed, 128 insertions(+), 124 deletions(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 42ee9f3025..3e254c29f6 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -15,6 +15,22 @@ #include +using namespace PacketType; + +const QSet NON_VERIFIED_PACKETS = QSet() + << DomainServerRequireDTLS << DomainConnectRequest + << DomainList << DomainListRequest << DomainConnectionDenied + << CreateAssignment << RequestAssignment << StunResponse + << NodeJsonStats << EntityQuery + << OctreeDataNack << EntityEditNack + << IceServerHeartbeat << IceServerPeerInformation + << IceServerQuery << UnverifiedPing + << UnverifiedPingReply << StopNode + << DomainServerPathQuery << DomainServerPathResponse + << DomainServerAddedNode; + +const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; + int arithmeticCodingValueFromBuffer(const char* checkValue) { if (((uchar) *checkValue) < 255) { return *checkValue; @@ -43,43 +59,43 @@ int packArithmeticallyCodedValue(int value, char* destination) { } } -PacketVersion versionForPacketType(PacketType packetType) { +PacketVersion versionForPacketType(PacketType::Value packetType) { switch (packetType) { - case PacketTypeMicrophoneAudioNoEcho: - case PacketTypeMicrophoneAudioWithEcho: + case MicrophoneAudioNoEcho: + case MicrophoneAudioWithEcho: return 2; - case PacketTypeSilentAudioFrame: + case SilentAudioFrame: return 4; - case PacketTypeMixedAudio: + case MixedAudio: return 1; - case PacketTypeInjectAudio: + case InjectAudio: return 1; - case PacketTypeAvatarData: + case AvatarData: return 6; - case PacketTypeAvatarIdentity: + case AvatarIdentity: return 1; - case PacketTypeEnvironmentData: + case EnvironmentData: return 2; - case PacketTypeDomainList: - case PacketTypeDomainListRequest: + case DomainList: + case DomainListRequest: return 5; - case PacketTypeCreateAssignment: - case PacketTypeRequestAssignment: + case CreateAssignment: + case RequestAssignment: return 2; - case PacketTypeOctreeStats: + case OctreeStats: return 1; - case PacketTypeStopNode: + case StopNode: return 1; - case PacketTypeEntityAdd: - case PacketTypeEntityEdit: - case PacketTypeEntityData: + case EntityAdd: + case EntityEdit: + case EntityData: return VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE; - case PacketTypeEntityErase: + case EntityErase: return 2; - case PacketTypeAudioStreamStats: + case AudioStreamStats: return 1; - case PacketTypeIceServerHeartbeat: - case PacketTypeIceServerQuery: + case IceServerHeartbeat: + case IceServerQuery: return 1; default: return 0; @@ -88,53 +104,53 @@ PacketVersion versionForPacketType(PacketType packetType) { #define PACKET_TYPE_NAME_LOOKUP(x) case x: return QString(#x); -QString nameForPacketType(PacketType packetType) { +QString nameForPacketType(PacketType::Value packetType) { switch (packetType) { - PACKET_TYPE_NAME_LOOKUP(PacketTypeUnknown); - PACKET_TYPE_NAME_LOOKUP(PacketTypeStunResponse); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainList); - PACKET_TYPE_NAME_LOOKUP(PacketTypePing); - PACKET_TYPE_NAME_LOOKUP(PacketTypePingReply); - PACKET_TYPE_NAME_LOOKUP(PacketTypeKillAvatar); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAvatarData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeInjectAudio); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMixedAudio); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMicrophoneAudioNoEcho); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMicrophoneAudioWithEcho); - PACKET_TYPE_NAME_LOOKUP(PacketTypeBulkAvatarData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeSilentAudioFrame); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEnvironmentData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainListRequest); - PACKET_TYPE_NAME_LOOKUP(PacketTypeRequestAssignment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeCreateAssignment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainConnectionDenied); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMuteEnvironment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAudioStreamStats); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDataServerConfirm); - PACKET_TYPE_NAME_LOOKUP(PacketTypeOctreeStats); - PACKET_TYPE_NAME_LOOKUP(PacketTypeJurisdiction); - PACKET_TYPE_NAME_LOOKUP(PacketTypeJurisdictionRequest); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAvatarIdentity); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAvatarBillboard); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainConnectRequest); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainServerRequireDTLS); - PACKET_TYPE_NAME_LOOKUP(PacketTypeNodeJsonStats); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityQuery); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityErase); - PACKET_TYPE_NAME_LOOKUP(PacketTypeOctreeDataNack); - PACKET_TYPE_NAME_LOOKUP(PacketTypeStopNode); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAudioEnvironment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityEditNack); - PACKET_TYPE_NAME_LOOKUP(PacketTypeSignedTransactionPayment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerHeartbeat); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainServerAddedNode); - PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerQuery); - PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerPeerInformation); - PACKET_TYPE_NAME_LOOKUP(PacketTypeUnverifiedPing); - PACKET_TYPE_NAME_LOOKUP(PacketTypeUnverifiedPingReply); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityAdd); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityEdit); + PACKET_TYPE_NAME_LOOKUP(Unknown); + PACKET_TYPE_NAME_LOOKUP(StunResponse); + PACKET_TYPE_NAME_LOOKUP(DomainList); + PACKET_TYPE_NAME_LOOKUP(Ping); + PACKET_TYPE_NAME_LOOKUP(PingReply); + PACKET_TYPE_NAME_LOOKUP(KillAvatar); + PACKET_TYPE_NAME_LOOKUP(AvatarData); + PACKET_TYPE_NAME_LOOKUP(InjectAudio); + PACKET_TYPE_NAME_LOOKUP(MixedAudio); + PACKET_TYPE_NAME_LOOKUP(MicrophoneAudioNoEcho); + PACKET_TYPE_NAME_LOOKUP(MicrophoneAudioWithEcho); + PACKET_TYPE_NAME_LOOKUP(BulkAvatarData); + PACKET_TYPE_NAME_LOOKUP(SilentAudioFrame); + PACKET_TYPE_NAME_LOOKUP(EnvironmentData); + PACKET_TYPE_NAME_LOOKUP(DomainListRequest); + PACKET_TYPE_NAME_LOOKUP(RequestAssignment); + PACKET_TYPE_NAME_LOOKUP(CreateAssignment); + PACKET_TYPE_NAME_LOOKUP(DomainConnectionDenied); + PACKET_TYPE_NAME_LOOKUP(MuteEnvironment); + PACKET_TYPE_NAME_LOOKUP(AudioStreamStats); + PACKET_TYPE_NAME_LOOKUP(DataServerConfirm); + PACKET_TYPE_NAME_LOOKUP(OctreeStats); + PACKET_TYPE_NAME_LOOKUP(Jurisdiction); + PACKET_TYPE_NAME_LOOKUP(JurisdictionRequest); + PACKET_TYPE_NAME_LOOKUP(AvatarIdentity); + PACKET_TYPE_NAME_LOOKUP(AvatarBillboard); + PACKET_TYPE_NAME_LOOKUP(DomainConnectRequest); + PACKET_TYPE_NAME_LOOKUP(DomainServerRequireDTLS); + PACKET_TYPE_NAME_LOOKUP(NodeJsonStats); + PACKET_TYPE_NAME_LOOKUP(EntityQuery); + PACKET_TYPE_NAME_LOOKUP(EntityData); + PACKET_TYPE_NAME_LOOKUP(EntityErase); + PACKET_TYPE_NAME_LOOKUP(OctreeDataNack); + PACKET_TYPE_NAME_LOOKUP(StopNode); + PACKET_TYPE_NAME_LOOKUP(AudioEnvironment); + PACKET_TYPE_NAME_LOOKUP(EntityEditNack); + PACKET_TYPE_NAME_LOOKUP(SignedTransactionPayment); + PACKET_TYPE_NAME_LOOKUP(IceServerHeartbeat); + PACKET_TYPE_NAME_LOOKUP(DomainServerAddedNode); + PACKET_TYPE_NAME_LOOKUP(IceServerQuery); + PACKET_TYPE_NAME_LOOKUP(IceServerPeerInformation); + PACKET_TYPE_NAME_LOOKUP(UnverifiedPing); + PACKET_TYPE_NAME_LOOKUP(UnverifiedPingReply); + PACKET_TYPE_NAME_LOOKUP(EntityAdd); + PACKET_TYPE_NAME_LOOKUP(EntityEdit); default: return QString("Type: ") + QString::number((int)packetType); } @@ -143,13 +159,13 @@ QString nameForPacketType(PacketType packetType) { -QByteArray byteArrayWithUUIDPopulatedHeader(PacketType packetType, const QUuid& connectionUUID) { +QByteArray byteArrayWithUUIDPopulatedHeader(PacketType::Value packetType, const QUuid& connectionUUID) { QByteArray freshByteArray(MAX_PACKET_HEADER_BYTES, 0); freshByteArray.resize(populatePacketHeaderWithUUID(freshByteArray, packetType, connectionUUID)); return freshByteArray; } -int populatePacketHeaderWithUUID(QByteArray& packet, PacketType packetType, const QUuid& connectionUUID) { +int populatePacketHeaderWithUUID(QByteArray& packet, PacketType::Value packetType, const QUuid& connectionUUID) { if (packet.size() < numBytesForPacketHeaderGivenPacketType(packetType)) { packet.resize(numBytesForPacketHeaderGivenPacketType(packetType)); } @@ -157,7 +173,7 @@ int populatePacketHeaderWithUUID(QByteArray& packet, PacketType packetType, cons return populatePacketHeaderWithUUID(packet.data(), packetType, connectionUUID); } -int populatePacketHeaderWithUUID(char* packet, PacketType packetType, const QUuid& connectionUUID) { +int populatePacketHeaderWithUUID(char* packet, PacketType::Value packetType, const QUuid& connectionUUID) { int numTypeBytes = packArithmeticallyCodedValue(packetType, packet); packet[numTypeBytes] = versionForPacketType(packetType); @@ -185,31 +201,31 @@ int populatePacketHeaderWithUUID(char* packet, PacketType packetType, const QUui } int numBytesForPacketHeader(const QByteArray& packet) { - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); return numBytesForPacketHeaderGivenPacketType(packetType); } int numBytesForPacketHeader(const char* packet) { - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); return numBytesForPacketHeaderGivenPacketType(packetType); } -int numBytesForArithmeticCodedPacketType(PacketType packetType) { +int numBytesForArithmeticCodedPacketType(PacketType::Value packetType) { return (int) ceilf((float) packetType / 255); } -int numBytesForPacketHeaderGivenPacketType(PacketType packetType) { +int numBytesForPacketHeaderGivenPacketType(PacketType::Value packetType) { return numBytesForArithmeticCodedPacketType(packetType) + numHashBytesForType(packetType) + numSequenceNumberBytesForType(packetType) + NUM_STATIC_HEADER_BYTES; } -int numHashBytesForType(PacketType packetType) { +int numHashBytesForType(PacketType::Value packetType) { return (NON_VERIFIED_PACKETS.contains(packetType) ? 0 : NUM_BYTES_MD5_HASH); } -int numSequenceNumberBytesForType(PacketType packetType) { +int numSequenceNumberBytesForType(PacketType::Value packetType) { return (SEQUENCE_NUMBERED_PACKETS.contains(packetType) ? sizeof(PacketSequenceNumber) : 0); } @@ -218,11 +234,11 @@ QUuid uuidFromPacketHeader(const QByteArray& packet) { NUM_BYTES_RFC4122_UUID)); } -int hashOffsetForPacketType(PacketType packetType) { +int hashOffsetForPacketType(PacketType::Value packetType) { return numBytesForArithmeticCodedPacketType(packetType) + NUM_STATIC_HEADER_BYTES; } -int sequenceNumberOffsetForPacketType(PacketType packetType) { +int sequenceNumberOffsetForPacketType(PacketType::Value packetType) { return numBytesForPacketHeaderGivenPacketType(packetType) - sizeof(PacketSequenceNumber); } @@ -235,8 +251,8 @@ QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& QCryptographicHash::Md5); } -PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType packetType) { - if (packetType == PacketTypeUnknown) { +PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType) { + if (packetType == PacketType::Unknown) { packetType = packetTypeForPacket(packet); } @@ -249,8 +265,8 @@ PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketTy return result; } -void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType packetType) { - if (packetType == PacketTypeUnknown) { +void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType::Value packetType) { + if (packetType == PacketType::Unknown) { packetType = packetTypeForPacket(packet); } @@ -258,8 +274,8 @@ void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, Packet hashForPacketAndConnectionUUID(packet, connectionUUID)); } -void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, PacketType packetType) { - if (packetType == PacketTypeUnknown) { +void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, PacketType::Value packetType) { + if (packetType == PacketType::Unknown) { packetType = packetTypeForPacket(packet); } @@ -268,8 +284,8 @@ void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequ } void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, - PacketType packetType) { - if (packetType == PacketTypeUnknown) { + PacketType::Value packetType) { + if (packetType == PacketType::Unknown) { packetType = packetTypeForPacket(packet); } @@ -277,10 +293,10 @@ void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& conne replaceSequenceNumberInPacket(packet, sequenceNumber, packetType); } -PacketType packetTypeForPacket(const QByteArray& packet) { - return (PacketType) arithmeticCodingValueFromBuffer(packet.data()); +PacketType::Value packetTypeForPacket(const QByteArray& packet) { + return (PacketType::Value) arithmeticCodingValueFromBuffer(packet.data()); } -PacketType packetTypeForPacket(const char* packet) { - return (PacketType) arithmeticCodingValueFromBuffer(packet); +PacketType::Value packetTypeForPacket(const char* packet) { + return (PacketType::Value) arithmeticCodingValueFromBuffer(packet); } diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index d2ee278d43..4ac7167c83 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -89,51 +89,39 @@ typedef char PacketVersion; typedef uint16_t PacketSequenceNumber; const PacketSequenceNumber DEFAULT_SEQUENCE_NUMBER = 0; -typedef std::map PacketTypeSequenceMap; +typedef std::map PacketTypeSequenceMap; -const QSet NON_VERIFIED_PACKETS = QSet() - << PacketTypeDomainServerRequireDTLS << PacketTypeDomainConnectRequest - << PacketTypeDomainList << PacketTypeDomainListRequest << PacketTypeDomainConnectionDenied - << PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse - << PacketTypeNodeJsonStats << PacketTypeEntityQuery - << PacketTypeOctreeDataNack << PacketTypeEntityEditNack - << PacketTypeIceServerHeartbeat << PacketTypeIceServerPeerInformation - << PacketTypeIceServerQuery << PacketTypeUnverifiedPing - << PacketTypeUnverifiedPingReply << PacketTypeStopNode - << PacketTypeDomainServerPathQuery << PacketTypeDomainServerPathResponse - << PacketTypeDomainServerAddedNode; - -const QSet SEQUENCE_NUMBERED_PACKETS = QSet() -<< PacketTypeAvatarData; +extern const QSet NON_VERIFIED_PACKETS; +extern const QSet SEQUENCE_NUMBERED_PACKETS; const int NUM_BYTES_MD5_HASH = 16; const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; -const int MAX_PACKET_HEADER_BYTES = sizeof(PacketType) + NUM_BYTES_MD5_HASH + NUM_STATIC_HEADER_BYTES; +const int MAX_PACKET_HEADER_BYTES = sizeof(PacketType::Value) + NUM_BYTES_MD5_HASH + NUM_STATIC_HEADER_BYTES; -PacketType packetTypeForPacket(const QByteArray& packet); -PacketType packetTypeForPacket(const char* packet); +PacketType::Value packetTypeForPacket(const QByteArray& packet); +PacketType::Value packetTypeForPacket(const char* packet); -PacketVersion versionForPacketType(PacketType packetType); -QString nameForPacketType(PacketType packetType); +PacketVersion versionForPacketType(PacketType::Value packetType); +QString nameForPacketType(PacketType::Value packetType); const QUuid nullUUID = QUuid(); -QByteArray byteArrayWithUUIDPopulatedHeader(PacketType packetType, const QUuid& connectionUUID); -int populatePacketHeaderWithUUID(QByteArray& packet, PacketType packetType, const QUuid& connectionUUID); -int populatePacketHeaderWithUUID(char* packet, PacketType packetType, const QUuid& connectionUUID); +QByteArray byteArrayWithUUIDPopulatedHeader(PacketType::Value packetType, const QUuid& connectionUUID); +int populatePacketHeaderWithUUID(QByteArray& packet, PacketType::Value packetType, const QUuid& connectionUUID); +int populatePacketHeaderWithUUID(char* packet, PacketType::Value packetType, const QUuid& connectionUUID); -int numHashBytesForType(PacketType packetType); -int numSequenceNumberBytesForType(PacketType packetType); +int numHashBytesForType(PacketType::Value packetType); +int numSequenceNumberBytesForType(PacketType::Value packetType); int numBytesForPacketHeader(const QByteArray& packet); int numBytesForPacketHeader(const char* packet); -int numBytesForArithmeticCodedPacketType(PacketType packetType); -int numBytesForPacketHeaderGivenPacketType(PacketType packetType); +int numBytesForArithmeticCodedPacketType(PacketType::Value packetType); +int numBytesForPacketHeaderGivenPacketType(PacketType::Value packetType); QUuid uuidFromPacketHeader(const QByteArray& packet); -int hashOffsetForPacketType(PacketType packetType); -int sequenceNumberOffsetForPacketType(PacketType packetType); +int hashOffsetForPacketType(PacketType::Value packetType); +int sequenceNumberOffsetForPacketType(PacketType::Value packetType); QByteArray hashFromPacketHeader(const QByteArray& packet); QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& connectionUUID); @@ -141,15 +129,15 @@ QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& // NOTE: The following four methods accept a PacketType which defaults to PacketTypeUnknown. // If the caller has already looked at the packet type and can provide it then the methods below won't have to look it up. -PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType packetType = PacketTypeUnknown); +PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType = PacketTypeUnknown); -void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType packetType = PacketTypeUnknown); +void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType::Value packetType = PacketTypeUnknown); void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, - PacketType packetType = PacketTypeUnknown); + PacketType::Value packetType = PacketTypeUnknown); void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, - PacketType packetType = PacketTypeUnknown); + PacketType::Value packetType = PacketTypeUnknown); int arithmeticCodingValueFromBuffer(const char* checkValue); int numBytesArithmeticCodingFromBuffer(const char* checkValue); From 5ed332ea2cd4aa43dcf569814c0b4e588b76c0b0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 16:35:17 -0700 Subject: [PATCH 004/582] missed changes in PacketHeaders, comment old header calls --- libraries/networking/src/LimitedNodeList.h | 12 ++++++------ libraries/networking/src/PacketHeaders.h | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 46b631df52..88559578c6 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -118,12 +118,12 @@ public: bool packetVersionAndHashMatch(const QByteArray& packet); - QByteArray byteArrayWithPopulatedHeader(PacketType packetType) - { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } - int populatePacketHeader(QByteArray& packet, PacketType packetType) - { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - int populatePacketHeader(char* packet, PacketType packetType) - { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } + // QByteArray byteArrayWithPopulatedHeader(PacketType packetType) + // { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } + // int populatePacketHeader(QByteArray& packet, PacketType packetType) + // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } + // int populatePacketHeader(char* packet, PacketType packetType) + // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 4ac7167c83..ec1ae8b052 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -126,18 +126,18 @@ int sequenceNumberOffsetForPacketType(PacketType::Value packetType); QByteArray hashFromPacketHeader(const QByteArray& packet); QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& connectionUUID); -// NOTE: The following four methods accept a PacketType which defaults to PacketTypeUnknown. +// NOTE: The following four methods accept a PacketType which defaults to PacketType::Unknown. // If the caller has already looked at the packet type and can provide it then the methods below won't have to look it up. -PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType = PacketTypeUnknown); +PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType = PacketType::Unknown); -void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType::Value packetType = PacketTypeUnknown); +void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType::Value packetType = PacketType::Unknown); void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, - PacketType::Value packetType = PacketTypeUnknown); + PacketType::Value packetType = PacketType::Unknown); void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, - PacketType::Value packetType = PacketTypeUnknown); + PacketType::Value packetType = PacketType::Unknown); int arithmeticCodingValueFromBuffer(const char* checkValue); int numBytesArithmeticCodingFromBuffer(const char* checkValue); From 0d64e82fe2fd20d976aa4dc9f30c08e74ee2f507 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 16:38:52 -0700 Subject: [PATCH 005/582] replace PacketType declarations with PacketType::Value --- assignment-client/src/Agent.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 2 +- .../src/audio/AudioMixerClientData.cpp | 2 +- assignment-client/src/entities/EntityNodeData.h | 2 +- assignment-client/src/entities/EntityServer.h | 4 ++-- .../src/octree/OctreeInboundPacketProcessor.cpp | 2 +- assignment-client/src/octree/OctreeQueryNode.h | 4 ++-- assignment-client/src/octree/OctreeServer.cpp | 2 +- assignment-client/src/octree/OctreeServer.h | 4 ++-- .../src/octree/OctreeServerDatagramProcessor.cpp | 2 +- domain-server/src/DomainServer.cpp | 2 +- ice-server/src/IceServer.cpp | 2 +- interface/src/Application.cpp | 2 +- interface/src/Application.h | 2 +- interface/src/DatagramProcessor.cpp | 2 +- interface/src/octree/OctreePacketProcessor.cpp | 2 +- libraries/audio-client/src/AudioClient.cpp | 2 +- libraries/audio/src/InboundAudioStream.cpp | 2 +- .../entities-renderer/src/EntityTreeRenderer.h | 4 ++-- libraries/entities/src/EntityTree.h | 2 +- libraries/entities/src/EntityTreeHeadlessViewer.h | 4 ++-- libraries/networking/src/Assignment.cpp | 2 +- libraries/networking/src/LimitedNodeList.cpp | 14 +++++++------- libraries/networking/src/LimitedNodeList.h | 6 +++--- libraries/networking/src/Node.h | 2 +- libraries/networking/src/NodeList.cpp | 6 +++--- libraries/networking/src/PacketHeaders.h | 4 ++-- libraries/octree/src/EditPacketBuffer.h | 2 +- libraries/octree/src/Octree.cpp | 8 ++++---- libraries/octree/src/Octree.h | 2 +- libraries/octree/src/OctreeEditPacketSender.cpp | 2 +- libraries/octree/src/OctreeEditPacketSender.h | 2 +- libraries/octree/src/OctreeHeadlessViewer.cpp | 2 +- libraries/octree/src/OctreePacketData.h | 2 +- libraries/octree/src/OctreeRenderer.cpp | 4 ++-- libraries/octree/src/OctreeRenderer.h | 4 ++-- 36 files changed, 57 insertions(+), 57 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index a23c1c0972..b53a58c5c0 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -56,7 +56,7 @@ void Agent::readPendingDatagrams() { while (readAvailableDatagram(receivedPacket, senderSockAddr)) { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType datagramPacketType = packetTypeForPacket(receivedPacket); + PacketType::Value datagramPacketType = packetTypeForPacket(receivedPacket); if (datagramPacketType == PacketTypeJurisdiction) { int headerBytes = numBytesForPacketHeader(receivedPacket); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 0307a88d7f..abbf8071f7 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -535,7 +535,7 @@ void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const Hif if (nodeList->packetVersionAndHashMatch(receivedPacket)) { // pull any new audio data from nodes off of the network stack - PacketType mixerPacketType = packetTypeForPacket(receivedPacket); + PacketType::Value mixerPacketType = packetTypeForPacket(receivedPacket); if (mixerPacketType == PacketTypeMicrophoneAudioNoEcho || mixerPacketType == PacketTypeMicrophoneAudioWithEcho || mixerPacketType == PacketTypeInjectAudio diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index a905256111..6879da8c08 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -50,7 +50,7 @@ AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() const { } int AudioMixerClientData::parseData(const QByteArray& packet) { - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); if (packetType == PacketTypeAudioStreamStats) { const char* dataAt = packet.data(); diff --git a/assignment-client/src/entities/EntityNodeData.h b/assignment-client/src/entities/EntityNodeData.h index 1b6ab7fb22..a31374c4ab 100644 --- a/assignment-client/src/entities/EntityNodeData.h +++ b/assignment-client/src/entities/EntityNodeData.h @@ -22,7 +22,7 @@ public: OctreeQueryNode(), _lastDeletedEntitiesSentAt(0) { } - virtual PacketType getMyPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value getMyPacketType() const { return PacketTypeEntityData; } quint64 getLastDeletedEntitiesSentAt() const { return _lastDeletedEntitiesSentAt; } void setLastDeletedEntitiesSentAt(quint64 sentAt) { _lastDeletedEntitiesSentAt = sentAt; } diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index 9edec7b704..cde3958bf3 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -28,11 +28,11 @@ public: // Subclasses must implement these methods virtual OctreeQueryNode* createOctreeQueryNode(); virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual PacketType getMyQueryMessageType() const { return PacketTypeEntityQuery; } + virtual PacketType::Value getMyQueryMessageType() const { return PacketTypeEntityQuery; } virtual const char* getMyServerName() const { return MODEL_SERVER_NAME; } virtual const char* getMyLoggingServerTargetName() const { return MODEL_SERVER_LOGGING_TARGET_NAME; } virtual const char* getMyDefaultPersistFilename() const { return LOCAL_MODELS_PERSIST_FILE; } - virtual PacketType getMyEditNackType() const { return PacketTypeEntityEditNack; } + virtual PacketType::Value getMyEditNackType() const { return PacketTypeEntityEditNack; } virtual QString getMyDomainSettingsKey() const { return QString("entity_server_settings"); } // subclass may implement these method diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 28506b033e..e486e4f5a7 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -90,7 +90,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin // Ask our tree subclass if it can handle the incoming packet... - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); if (_myServer->getOctree()->handlesEditPacketType(packetType)) { PerformanceWarning warn(debugProcessPacket, "processPacket KNOWN TYPE",debugProcessPacket); _receivedPacketCount++; diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index ff59fb7685..32b09094b9 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -35,7 +35,7 @@ public: virtual ~OctreeQueryNode(); void init(); // called after creation to set up some virtual items - virtual PacketType getMyPacketType() const = 0; + virtual PacketType::Value getMyPacketType() const = 0; void resetOctreePacket(); // resets octree packet to after "V" header @@ -155,7 +155,7 @@ private: quint64 _lastRootTimestamp; - PacketType _myPacketType; + PacketType::Value _myPacketType; bool _isShuttingDown; SentPacketHistory _sentPacketHistory; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 06fb5c4f47..f6d8eaf7c8 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -862,7 +862,7 @@ void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const H if (!_isShuttingDown) { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType packetType = packetTypeForPacket(receivedPacket); + PacketType::Value packetType = packetTypeForPacket(receivedPacket); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); if (packetType == getMyQueryMessageType()) { // If we got a query packet, then we're talking to an agent, and we diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 8bce562889..c84da23008 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -63,11 +63,11 @@ public: // Subclasses must implement these methods virtual OctreeQueryNode* createOctreeQueryNode() = 0; virtual char getMyNodeType() const = 0; - virtual PacketType getMyQueryMessageType() const = 0; + virtual PacketType::Value getMyQueryMessageType() const = 0; virtual const char* getMyServerName() const = 0; virtual const char* getMyLoggingServerTargetName() const = 0; virtual const char* getMyDefaultPersistFilename() const = 0; - virtual PacketType getMyEditNackType() const = 0; + virtual PacketType::Value getMyEditNackType() const = 0; virtual QString getMyDomainSettingsKey() const { return QString("octree_server_settings"); } // subclass may implement these method diff --git a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp index 9f2ae72147..98b50383c7 100644 --- a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp +++ b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp @@ -43,7 +43,7 @@ void OctreeServerDatagramProcessor::readPendingDatagrams() { _nodeSocket.readDatagram(incomingPacket.data(), incomingPacket.size(), senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - PacketType packetType = packetTypeForPacket(incomingPacket); + PacketType::Value packetType = packetTypeForPacket(incomingPacket); if (packetType == PacketTypePing) { DependencyManager::get()->processNodeData(senderSockAddr, incomingPacket); return; // don't emit diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 034b98e8db..6b6a25f7c9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1390,7 +1390,7 @@ void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiS auto nodeList = DependencyManager::get(); if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType requestType = packetTypeForPacket(receivedPacket); + PacketType::Value requestType = packetTypeForPacket(receivedPacket); switch (requestType) { case PacketTypeDomainConnectRequest: handleConnectRequest(receivedPacket, senderSockAddr); diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 8b5e5a4b39..0d9960ed36 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -54,7 +54,7 @@ void IceServer::processDatagrams() { _serverSocket.readDatagram(incomingPacket.data(), incomingPacket.size(), sendingSockAddr.getAddressPointer(), sendingSockAddr.getPortPointer()); - PacketType packetType = packetTypeForPacket(incomingPacket); + PacketType::Value packetType = packetTypeForPacket(incomingPacket); if (packetType == PacketTypeIceServerHeartbeat) { SharedNetworkPeer peer = addOrUpdateHeartbeatingPeer(incomingPacket); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2f1797e649..a4c9a61aad 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2729,7 +2729,7 @@ int Application::sendNackPackets() { return packetsSent; } -void Application::queryOctree(NodeType_t serverType, PacketType packetType, NodeToJurisdictionMap& jurisdictions) { +void Application::queryOctree(NodeType_t serverType, PacketType::Value packetType, NodeToJurisdictionMap& jurisdictions) { //qCDebug(interfaceapp) << ">>> inside... queryOctree()... _viewFrustum.getFieldOfView()=" << _viewFrustum.getFieldOfView(); bool wantExtraDebugging = getLogger()->extraDebugging(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 8dd987fbcd..03487a5306 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -511,7 +511,7 @@ private: void renderLookatIndicator(glm::vec3 pointOfInterest); - void queryOctree(NodeType_t serverType, PacketType packetType, NodeToJurisdictionMap& jurisdictions); + void queryOctree(NodeType_t serverType, PacketType::Value packetType, NodeToJurisdictionMap& jurisdictions); void loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum); glm::vec3 getSunDirection(); diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index f691527186..2808601316 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -52,7 +52,7 @@ void DatagramProcessor::processDatagrams() { if (nodeList->packetVersionAndHashMatch(incomingPacket)) { - PacketType incomingType = packetTypeForPacket(incomingPacket); + PacketType::Value incomingType = packetTypeForPacket(incomingPacket); // only process this packet if we have a match on the packet version switch (incomingType) { case PacketTypeAudioEnvironment: diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 4eac1e6803..498123db00 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -33,7 +33,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, bool wasStatsPacket = false; - PacketType voxelPacketType = packetTypeForPacket(mutablePacket); + PacketType::Value voxelPacketType = packetTypeForPacket(mutablePacket); // note: PacketType_OCTREE_STATS can have PacketType_VOXEL_DATA // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 5b2c33f5b3..60020f3618 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -844,7 +844,7 @@ void AudioClient::handleAudioInput() { glm::quat headOrientation = _orientationGetter(); quint8 isStereo = _isStereoInput ? 1 : 0; - PacketType packetType; + PacketType::Value packetType; if (_lastInputLoudness == 0) { packetType = PacketTypeSilentAudioFrame; } else { diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 3c9033494a..315db2029d 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -98,7 +98,7 @@ void InboundAudioStream::perSecondCallbackForUpdatingStats() { int InboundAudioStream::parseData(const QByteArray& packet) { - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); QUuid senderUUID = uuidFromPacketHeader(packet); // parse header diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index bd6044516f..edbb2d250f 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -43,8 +43,8 @@ public: virtual ~EntityTreeRenderer(); virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual PacketType getMyQueryMessageType() const { return PacketTypeEntityQuery; } - virtual PacketType getExpectedPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value getMyQueryMessageType() const { return PacketTypeEntityQuery; } + virtual PacketType::Value getExpectedPacketType() const { return PacketTypeEntityData; } virtual void renderElement(OctreeElement* element, RenderArgs* args); virtual float getSizeScale() const; virtual int getBoundaryLevelAdjust() const; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index fa72cc7691..43c05763b5 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -62,7 +62,7 @@ public: // These methods will allow the OctreeServer to send your tree inbound edit packets of your // own definition. Implement these to allow your octree based server to support editing virtual bool getWantSVOfileVersions() const { return true; } - virtual PacketType expectedDataPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value expectedDataPacketType() const { return PacketTypeEntityData; } virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion >= VERSION_ENTITIES_USE_METERS_AND_RADIANS; } virtual bool handlesEditPacketType(PacketType packetType) const; diff --git a/libraries/entities/src/EntityTreeHeadlessViewer.h b/libraries/entities/src/EntityTreeHeadlessViewer.h index 3989582c2b..7f4dda3ee1 100644 --- a/libraries/entities/src/EntityTreeHeadlessViewer.h +++ b/libraries/entities/src/EntityTreeHeadlessViewer.h @@ -31,8 +31,8 @@ public: virtual ~EntityTreeHeadlessViewer(); virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual PacketType getMyQueryMessageType() const { return PacketTypeEntityQuery; } - virtual PacketType getExpectedPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value getMyQueryMessageType() const { return PacketTypeEntityQuery; } + virtual PacketType::Value getExpectedPacketType() const { return PacketTypeEntityData; } void update(); diff --git a/libraries/networking/src/Assignment.cpp b/libraries/networking/src/Assignment.cpp index a4fa246c93..0722394807 100644 --- a/libraries/networking/src/Assignment.cpp +++ b/libraries/networking/src/Assignment.cpp @@ -66,7 +66,7 @@ Assignment::Assignment(const QByteArray& packet) : _payload(), _walletUUID() { - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); if (packetType == PacketTypeRequestAssignment) { _command = Assignment::RequestCommand; diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 0903f3613d..faae5594e9 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -164,12 +164,12 @@ void LimitedNodeList::changeSocketBufferSizes(int numBytes) { } bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { - PacketType checkType = packetTypeForPacket(packet); + PacketType::Value checkType = packetTypeForPacket(packet); int numPacketTypeBytes = numBytesArithmeticCodingFromBuffer(packet.data()); if (packet[numPacketTypeBytes] != versionForPacketType(checkType) && checkType != PacketTypeStunResponse) { - PacketType mismatchType = packetTypeForPacket(packet); + PacketType::Value mismatchType = packetTypeForPacket(packet); static QMultiMap versionDebugSuppressMap; @@ -254,7 +254,7 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr) { if (destinationNode) { - PacketType packetType = packetTypeForPacket(datagram); + PacketType::Value packetType = packetTypeForPacket(datagram); if (NON_VERIFIED_PACKETS.contains(packetType)) { return writeUnverifiedDatagram(datagram, destinationNode, overridenSockAddr); @@ -316,7 +316,7 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons } } - PacketType packetType = packetTypeForPacket(datagram); + PacketType::Value packetType = packetTypeForPacket(datagram); // optionally peform sequence number replacement in the header if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { @@ -351,7 +351,7 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const char* data, qint64 size, c return writeUnverifiedDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); } -PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType packetType) { +PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType) { // Thanks to std::map and std::unordered_map this line either default constructs the // PacketTypeSequenceMap and the PacketSequenceNumber or returns the existing value. // We use the postfix increment so that the stored value is incremented and the next @@ -376,7 +376,7 @@ int LimitedNodeList::updateNodeWithDataFromPacket(const SharedNodePointer& match // if this was a sequence numbered packet we should store the last seq number for // a packet of this type for this node - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { matchingNode->setLastSequenceNumberForPacketType(sequenceNumberFromHeader(packet, packetType), packetType); } @@ -546,7 +546,7 @@ QByteArray LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacke quint64 timeFromOriginalPing; pingPacketStream >> timeFromOriginalPing; - PacketType replyType = (packetTypeForPacket(pingPacket) == PacketTypePing) + PacketType::Value replyType = (packetTypeForPacket(pingPacket) == PacketTypePing) ? PacketTypePingReply : PacketTypeUnverifiedPingReply; QUuid packetUUID = packetHeaderID.isNull() ? _sessionUUID : packetHeaderID; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 88559578c6..d4e92a55a0 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -120,9 +120,9 @@ public: // QByteArray byteArrayWithPopulatedHeader(PacketType packetType) // { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } - // int populatePacketHeader(QByteArray& packet, PacketType packetType) + // int populatePacketHeader(QByteArray& packet, PacketType::Value packetType) // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - // int populatePacketHeader(char* packet, PacketType packetType) + // int populatePacketHeader(char* packet, PacketType::Value packetType) // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); @@ -266,7 +266,7 @@ protected: qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); - PacketSequenceNumber getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType packetType); + PacketSequenceNumber getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType); void changeSocketBufferSizes(int numBytes); diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 4c1b6e9d18..be06906527 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -65,7 +65,7 @@ public: void setCanRez(bool canRez) { _canRez = canRez; } bool getCanRez() { return _canRez; } - void setLastSequenceNumberForPacketType(PacketSequenceNumber sequenceNumber, PacketType packetType) + void setLastSequenceNumberForPacketType(PacketSequenceNumber sequenceNumber, PacketType::Value packetType) { _lastSequenceNumbers[packetType] = sequenceNumber; } PacketSequenceNumber getLastSequenceNumberForPacketType(PacketType packetType) const; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index e7bb4fbb6f..eadc0adbfb 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -173,7 +173,7 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& } void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) { - PacketType packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packetTypeForPacket(packet); switch (packetType) { case PacketTypeDomainList: case PacketTypeDomainServerAddedNode: { @@ -309,7 +309,7 @@ void NodeList::sendDomainServerCheckIn() { } else if (!_domainHandler.getIP().isNull()) { bool isUsingDTLS = false; - PacketType domainPacketType = !_domainHandler.isConnected() + PacketType::Value domainPacketType = !_domainHandler.isConnected() ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest; if (!_domainHandler.isConnected()) { @@ -600,7 +600,7 @@ void NodeList::parseNodeFromPacketStream(QDataStream& packetStream) { void NodeList::sendAssignment(Assignment& assignment) { - PacketType assignmentPacketType = assignment.getCommand() == Assignment::CreateCommand + PacketType::Value assignmentPacketType = assignment.getCommand() == Assignment::CreateCommand ? PacketTypeCreateAssignment : PacketTypeRequestAssignment; diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index ec1ae8b052..e5640822fd 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -26,7 +26,7 @@ // NOTE: if adding a new packet packetType, you can replace one marked usable or add at the end // NOTE: if you want the name of the packet packetType to be available for debugging or logging, update nameForPacketType() as well -namespace PacketType { +namespace PacketType::Value { enum Value { Unknown, // 0 StunResponse, @@ -126,7 +126,7 @@ int sequenceNumberOffsetForPacketType(PacketType::Value packetType); QByteArray hashFromPacketHeader(const QByteArray& packet); QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& connectionUUID); -// NOTE: The following four methods accept a PacketType which defaults to PacketType::Unknown. +// NOTE: The following four methods accept a PacketType::Value which defaults to PacketType::Unknown. // If the caller has already looked at the packet type and can provide it then the methods below won't have to look it up. PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType = PacketType::Unknown); diff --git a/libraries/octree/src/EditPacketBuffer.h b/libraries/octree/src/EditPacketBuffer.h index e816bf6558..cc26a2dfe5 100644 --- a/libraries/octree/src/EditPacketBuffer.h +++ b/libraries/octree/src/EditPacketBuffer.h @@ -25,7 +25,7 @@ public: qint64 satoshiCost = 0, const QUuid nodeUUID = QUuid()); QUuid _nodeUUID; - PacketType _currentType; + PacketType::Value _currentType; unsigned char _currentBuffer[MAX_PACKET_SIZE]; size_t _currentSize; qint64 _satoshiCost; diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index adc2040b8a..a48540f082 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1936,7 +1936,7 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr bool wantImportProgress = true; - PacketType expectedType = expectedDataPacketType(); + PacketType::Value expectedType = expectedDataPacketType(); PacketVersion expectedVersion = versionForPacketType(expectedType); bool hasBufferBreaks = versionHasSVOfileBreaks(expectedVersion); @@ -1954,7 +1954,7 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr unsigned long dataLength = HEADER_LENGTH; // if so, read the first byte of the file and see if it matches the expected version code - PacketType gotType; + PacketType::Value gotType; memcpy(&gotType, dataAt, sizeof(gotType)); dataAt += sizeof(expectedType); @@ -2097,7 +2097,7 @@ void Octree::writeToJSONFile(const char* fileName, OctreeElement* element) { } // include the "bitstream" version - PacketType expectedType = expectedDataPacketType(); + PacketType::Value expectedType = expectedDataPacketType(); PacketVersion expectedVersion = versionForPacketType(expectedType); entityDescription["Version"] = (int) expectedVersion; @@ -2118,7 +2118,7 @@ void Octree::writeToSVOFile(const char* fileName, OctreeElement* element) { if(file.is_open()) { qCDebug(octree, "Saving binary SVO to file %s...", fileName); - PacketType expectedType = expectedDataPacketType(); + PacketType::Value expectedType = expectedDataPacketType(); PacketVersion expectedVersion = versionForPacketType(expectedType); bool hasBufferBreaks = versionHasSVOfileBreaks(expectedVersion); diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 6eeb423ddd..3717308008 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -226,7 +226,7 @@ public: // These methods will allow the OctreeServer to send your tree inbound edit packets of your // own definition. Implement these to allow your octree based server to support editing virtual bool getWantSVOfileVersions() const { return false; } - virtual PacketType expectedDataPacketType() const { return PacketTypeUnknown; } + virtual PacketType::Value expectedDataPacketType() const { return PacketTypeUnknown; } virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion == versionForPacketType(expectedDataPacketType()); } virtual PacketVersion expectedVersion() const { return versionForPacketType(expectedDataPacketType()); } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 9b1124a197..be05fbb153 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -327,7 +327,7 @@ void OctreeEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer) _releaseQueuedPacketMutex.unlock(); } -void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type, int nodeClockSkew) { +void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType::Value type, int nodeClockSkew) { packetBuffer._currentSize = DependencyManager::get()->populatePacketHeader(reinterpret_cast(&packetBuffer._currentBuffer[0]), type); diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 79b7a43ac4..077078adeb 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -101,7 +101,7 @@ protected: void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void queuePendingPacketToNodes(PacketType type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void queuePacketToNodes(unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - void initializePacket(EditPacketBuffer& packetBuffer, PacketType type, int nodeClockSkew); + void initializePacket(EditPacketBuffer& packetBuffer, PacketType::Value type, int nodeClockSkew); void releaseQueuedPacket(EditPacketBuffer& packetBuffer); // releases specific queued packet void processPreServerExistsPackets(); diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index 90840854ad..d7daa6e181 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -33,7 +33,7 @@ void OctreeHeadlessViewer::init() { void OctreeHeadlessViewer::queryOctree() { char serverType = getMyNodeType(); - PacketType packetType = getMyQueryMessageType(); + PacketType::Value packetType = getMyQueryMessageType(); NodeToJurisdictionMap& jurisdictions = *_jurisdictionListener->getJurisdictions(); bool wantExtraDebugging = false; diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index e6f86bb861..5ce44a0457 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -42,7 +42,7 @@ typedef quint64 OCTREE_PACKET_SENT_TIME; typedef uint16_t OCTREE_PACKET_INTERNAL_SECTION_SIZE; const int MAX_OCTREE_PACKET_SIZE = MAX_PACKET_SIZE; -// this is overly conservative - sizeof(PacketType) is 8 bytes but a packed PacketType could be as small as one byte +// this is overly conservative - sizeof(PacketType) is 8 bytes but a packed PacketType::Value could be as small as one byte const unsigned int OCTREE_PACKET_EXTRA_HEADERS_SIZE = sizeof(OCTREE_PACKET_FLAGS) + sizeof(OCTREE_PACKET_SEQUENCE) + sizeof(OCTREE_PACKET_SENT_TIME); diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 7852f1d4b4..220f25466a 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -62,10 +62,10 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram()",showTimingDetails); unsigned int packetLength = dataByteArray.size(); - PacketType command = packetTypeForPacket(dataByteArray); + PacketType::Value command = packetTypeForPacket(dataByteArray); unsigned int numBytesPacketHeader = numBytesForPacketHeader(dataByteArray); QUuid sourceUUID = uuidFromPacketHeader(dataByteArray); - PacketType expectedType = getExpectedPacketType(); + PacketType::Value expectedType = getExpectedPacketType(); // packetVersion is the second byte PacketVersion packetVersion = dataByteArray[1]; diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index 98026b732c..a442bb3054 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -36,8 +36,8 @@ public: virtual ~OctreeRenderer(); virtual char getMyNodeType() const = 0; - virtual PacketType getMyQueryMessageType() const = 0; - virtual PacketType getExpectedPacketType() const = 0; + virtual PacketType::Value getMyQueryMessageType() const = 0; + virtual PacketType::Value getExpectedPacketType() const = 0; virtual void renderElement(OctreeElement* element, RenderArgs* args) = 0; virtual float getSizeScale() const { return DEFAULT_OCTREE_SIZE_SCALE; } virtual int getBoundaryLevelAdjust() const { return 0; } From 1c20aa47c311edeeba1494b3f39129f59ae755e6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 16:41:07 -0700 Subject: [PATCH 006/582] remove replacement of namespace itself --- libraries/networking/src/PacketHeaders.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index e5640822fd..7815849863 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -26,7 +26,7 @@ // NOTE: if adding a new packet packetType, you can replace one marked usable or add at the end // NOTE: if you want the name of the packet packetType to be available for debugging or logging, update nameForPacketType() as well -namespace PacketType::Value { +namespace PacketType { enum Value { Unknown, // 0 StunResponse, From b3c3e5a6c81b2c04154990cc92bb5bd999cd332b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 16:49:19 -0700 Subject: [PATCH 007/582] more PacketType to PacketType::Value replacements --- assignment-client/src/audio/AvatarAudioStream.cpp | 2 +- assignment-client/src/audio/AvatarAudioStream.h | 2 +- libraries/audio/src/InboundAudioStream.cpp | 4 ++-- libraries/audio/src/InboundAudioStream.h | 4 ++-- libraries/audio/src/InjectedAudioStream.cpp | 2 +- libraries/audio/src/InjectedAudioStream.h | 2 +- libraries/audio/src/MixedProcessedAudioStream.cpp | 2 +- libraries/audio/src/MixedProcessedAudioStream.h | 2 +- libraries/entities/src/EntityEditPacketSender.cpp | 4 ++-- libraries/entities/src/EntityEditPacketSender.h | 4 ++-- libraries/entities/src/EntityItemProperties.cpp | 2 +- libraries/entities/src/EntityItemProperties.h | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 2 +- libraries/entities/src/EntityScriptingInterface.h | 2 +- libraries/entities/src/EntityTree.cpp | 4 ++-- libraries/entities/src/EntityTree.h | 4 ++-- libraries/networking/src/Assignment.cpp | 4 ++-- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 4 ++-- libraries/networking/src/Node.cpp | 2 +- libraries/networking/src/Node.h | 2 +- libraries/octree/src/EditPacketBuffer.cpp | 2 +- libraries/octree/src/EditPacketBuffer.h | 2 +- libraries/octree/src/Octree.h | 4 ++-- libraries/octree/src/OctreeEditPacketSender.cpp | 4 ++-- libraries/octree/src/OctreeEditPacketSender.h | 6 +++--- 26 files changed, 38 insertions(+), 38 deletions(-) diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index 87581a637c..9fd44d9e85 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -18,7 +18,7 @@ AvatarAudioStream::AvatarAudioStream(bool isStereo, const InboundAudioStream::Se { } -int AvatarAudioStream::parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { +int AvatarAudioStream::parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { int readBytes = 0; if (type == PacketTypeSilentAudioFrame) { diff --git a/assignment-client/src/audio/AvatarAudioStream.h b/assignment-client/src/audio/AvatarAudioStream.h index 482c6fd538..78f57bb18f 100644 --- a/assignment-client/src/audio/AvatarAudioStream.h +++ b/assignment-client/src/audio/AvatarAudioStream.h @@ -25,7 +25,7 @@ private: AvatarAudioStream(const AvatarAudioStream&); AvatarAudioStream& operator= (const AvatarAudioStream&); - int parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); + int parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); }; #endif // hifi_AvatarAudioStream_h diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 315db2029d..3725c22988 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -168,7 +168,7 @@ int InboundAudioStream::parseData(const QByteArray& packet) { return readBytes; } -int InboundAudioStream::parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { +int InboundAudioStream::parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { if (type == PacketTypeSilentAudioFrame) { quint16 numSilentSamples = 0; memcpy(&numSilentSamples, packetAfterSeqNum.constData(), sizeof(quint16)); @@ -181,7 +181,7 @@ int InboundAudioStream::parseStreamProperties(PacketType type, const QByteArray& } } -int InboundAudioStream::parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties, int numAudioSamples) { +int InboundAudioStream::parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int numAudioSamples) { return _ringBuffer.writeData(packetAfterStreamProperties.data(), numAudioSamples * sizeof(int16_t)); } diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index f80961675d..370d853bd2 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -194,11 +194,11 @@ protected: /// parses the info between the seq num and the audio data in the network packet and calculates /// how many audio samples this packet contains (used when filling in samples for dropped packets). /// default implementation assumes no stream properties and raw audio samples after stream propertiess - virtual int parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& networkSamples); + virtual int parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& networkSamples); /// parses the audio data in the network packet. /// default implementation assumes packet contains raw audio samples after stream properties - virtual int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties, int networkSamples); + virtual int parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples); /// writes silent samples to the buffer that may be dropped to reduce latency caused by the buffer virtual int writeDroppableSilentSamples(int silentSamples); diff --git a/libraries/audio/src/InjectedAudioStream.cpp b/libraries/audio/src/InjectedAudioStream.cpp index b405e30df7..b1005fb9db 100644 --- a/libraries/audio/src/InjectedAudioStream.cpp +++ b/libraries/audio/src/InjectedAudioStream.cpp @@ -30,7 +30,7 @@ InjectedAudioStream::InjectedAudioStream(const QUuid& streamIdentifier, const bo const uchar MAX_INJECTOR_VOLUME = 255; -int InjectedAudioStream::parseStreamProperties(PacketType type, +int InjectedAudioStream::parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { // setup a data stream to read from this packet diff --git a/libraries/audio/src/InjectedAudioStream.h b/libraries/audio/src/InjectedAudioStream.h index 60c36dfb12..29a9947a24 100644 --- a/libraries/audio/src/InjectedAudioStream.h +++ b/libraries/audio/src/InjectedAudioStream.h @@ -31,7 +31,7 @@ private: InjectedAudioStream& operator= (const InjectedAudioStream&); AudioStreamStats getAudioStreamStats() const; - int parseStreamProperties(PacketType type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); + int parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); const QUuid _streamIdentifier; float _radius; diff --git a/libraries/audio/src/MixedProcessedAudioStream.cpp b/libraries/audio/src/MixedProcessedAudioStream.cpp index d236ac7aad..2a5b94cac1 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.cpp +++ b/libraries/audio/src/MixedProcessedAudioStream.cpp @@ -42,7 +42,7 @@ int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int samples) { return deviceSamplesWritten; } -int MixedProcessedAudioStream::parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties, int networkSamples) { +int MixedProcessedAudioStream::parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples) { emit addedStereoSamples(packetAfterStreamProperties); diff --git a/libraries/audio/src/MixedProcessedAudioStream.h b/libraries/audio/src/MixedProcessedAudioStream.h index 5ea0157421..efd06b996e 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.h +++ b/libraries/audio/src/MixedProcessedAudioStream.h @@ -35,7 +35,7 @@ public: protected: int writeDroppableSilentSamples(int silentSamples); int writeLastFrameRepeatedWithFade(int samples); - int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties, int networkSamples); + int parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples); private: int networkToDeviceSamples(int networkSamples); diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 8d03ca0fcb..c6c61f70a0 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -18,7 +18,7 @@ #include "EntityItem.h" -void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType type, +void EntityEditPacketSender::adjustEditPacketForClockSkew (PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew) { if (type == PacketTypeEntityAdd || type == PacketTypeEntityEdit) { @@ -26,7 +26,7 @@ void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType type, } } -void EntityEditPacketSender::queueEditEntityMessage(PacketType type, EntityItemID modelID, +void EntityEditPacketSender::queueEditEntityMessage (PacketType::Value type, EntityItemID modelID, const EntityItemProperties& properties) { if (!_shouldSend) { return; // bail early diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 69171ae16b..ff0c02789e 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -24,12 +24,12 @@ public: /// which voxel-server node or nodes the packet should be sent to. Can be called even before voxel servers are known, in /// which case up to MaxPendingMessages will be buffered and processed when voxel servers are known. /// NOTE: EntityItemProperties assumes that all distances are in meter units - void queueEditEntityMessage(PacketType type, EntityItemID modelID, const EntityItemProperties& properties); + void queueEditEntityMessage (PacketType::Value type, EntityItemID modelID, const EntityItemProperties& properties); void queueEraseEntityMessage(const EntityItemID& entityItemID); // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual void adjustEditPacketForClockSkew(PacketType type, unsigned char* editBuffer, size_t length, int clockSkew); + virtual void adjustEditPacketForClockSkew (PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew); }; #endif // hifi_EntityEditPacketSender_h diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 9a1a5494b7..ae021a7b67 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -614,7 +614,7 @@ void EntityItemPropertiesFromScriptValueHonorReadOnly(const QScriptValue &object // // TODO: Implement support for script and visible properties. // -bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItemID id, const EntityItemProperties& properties, +bool EntityItemProperties::encodeEntityEditPacket (PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, unsigned char* bufferOut, int sizeIn, int& sizeOut) { OctreePacketData ourDataPacket(false, sizeIn); // create a packetData object to add out packet details too. OctreePacketData* packetData = &ourDataPacket; // we want a pointer to this so we can use our APPEND_ENTITY_PROPERTY macro diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index b8200d025c..a1f64e03bd 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -174,7 +174,7 @@ public: void setGlowLevel(float value) { _glowLevel = value; _glowLevelChanged = true; } void setLocalRenderAlpha(float value) { _localRenderAlpha = value; _localRenderAlphaChanged = true; } - static bool encodeEntityEditPacket(PacketType command, EntityItemID id, const EntityItemProperties& properties, + static bool encodeEntityEditPacket (PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, unsigned char* bufferOut, int sizeIn, int& sizeOut); static bool encodeEraseEntityMessage(const EntityItemID& entityItemID, diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 7cc2c03dfc..e4b34fc51f 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -32,7 +32,7 @@ EntityScriptingInterface::EntityScriptingInterface() : connect(nodeList.data(), &NodeList::canRezChanged, this, &EntityScriptingInterface::canRezChanged); } -void EntityScriptingInterface::queueEntityMessage(PacketType packetType, +void EntityScriptingInterface::queueEntityMessage (PacketType::Value packetType, EntityItemID entityID, const EntityItemProperties& properties) { getEntityPacketSender()->queueEditEntityMessage(packetType, entityID, properties); } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 5c1e4141a6..378a3cdf4a 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -164,7 +164,7 @@ private: bool actionWorker(const QUuid& entityID, std::function actor); bool setVoxels(QUuid entityID, std::function actor); bool setPoints(QUuid entityID, std::function actor); - void queueEntityMessage(PacketType packetType, EntityItemID entityID, const EntityItemProperties& properties); + void queueEntityMessage (PacketType::Value packetType, EntityItemID entityID, const EntityItemProperties& properties); /// actually does the work of finding the ray intersection, can be called in locking mode or tryLock mode RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index d2b94b3267..5a16f5a003 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -63,7 +63,7 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) { Octree::eraseAllOctreeElements(createNewRoot); } -bool EntityTree::handlesEditPacketType(PacketType packetType) const { +bool EntityTree::handlesEditPacketType (PacketType::Value packetType) const { // we handle these types of "edit" packets switch (packetType) { case PacketTypeEntityAdd: @@ -572,7 +572,7 @@ EntityItemPointer EntityTree::findEntityByEntityItemID(const EntityItemID& entit return foundEntity; } -int EntityTree::processEditPacketData(PacketType packetType, const unsigned char* packetData, int packetLength, +int EntityTree::processEditPacketData (PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode) { if (!getIsServer()) { diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 43c05763b5..99d08fc937 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -65,8 +65,8 @@ public: virtual PacketType::Value expectedDataPacketType() const { return PacketTypeEntityData; } virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion >= VERSION_ENTITIES_USE_METERS_AND_RADIANS; } - virtual bool handlesEditPacketType(PacketType packetType) const; - virtual int processEditPacketData(PacketType packetType, const unsigned char* packetData, int packetLength, + virtual bool handlesEditPacketType (PacketType::Value packetType) const; + virtual int processEditPacketData (PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode); virtual bool rootElementHasData() const { return true; } diff --git a/libraries/networking/src/Assignment.cpp b/libraries/networking/src/Assignment.cpp index 0722394807..3da1fb9a41 100644 --- a/libraries/networking/src/Assignment.cpp +++ b/libraries/networking/src/Assignment.cpp @@ -68,9 +68,9 @@ Assignment::Assignment(const QByteArray& packet) : { PacketType::Value packetType = packetTypeForPacket(packet); - if (packetType == PacketTypeRequestAssignment) { + if (packetType == PacketType::RequestAssignment) { _command = Assignment::RequestCommand; - } else if (packetType == PacketTypeCreateAssignment) { + } else if (packetType == PacketType::CreateAssignment) { _command = Assignment::CreateCommand; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index faae5594e9..2efb8113d5 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -835,7 +835,7 @@ void LimitedNodeList::sendPeerQueryToIceServer(const HifiSockAddr& iceServerSock sendPacketToIceServer(PacketTypeIceServerQuery, iceServerSockAddr, clientID, peerID); } -void LimitedNodeList::sendPacketToIceServer(PacketType packetType, const HifiSockAddr& iceServerSockAddr, +void LimitedNodeList::sendPacketToIceServer (PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& headerID, const QUuid& peerID) { QByteArray iceRequestByteArray = byteArrayWithUUIDPopulatedHeader(packetType, headerID); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index d4e92a55a0..c8ef7c62dd 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -118,7 +118,7 @@ public: bool packetVersionAndHashMatch(const QByteArray& packet); - // QByteArray byteArrayWithPopulatedHeader(PacketType packetType) + // QByteArray byteArrayWithPopulatedHeader (PacketType::Value packetType) // { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } // int populatePacketHeader(QByteArray& packet, PacketType::Value packetType) // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } @@ -274,7 +274,7 @@ protected: void stopInitialSTUNUpdate(bool success); - void sendPacketToIceServer(PacketType packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& headerID, + void sendPacketToIceServer (PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& headerID, const QUuid& peerRequestID = QUuid()); QUuid _sessionUUID; diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index 05da87d69a..fcb22a08b0 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -67,7 +67,7 @@ void Node::updateClockSkewUsec(int clockSkewSample) { _clockSkewUsec = (int)_clockSkewMovingPercentile.getValueAtPercentile(); } -PacketSequenceNumber Node::getLastSequenceNumberForPacketType(PacketType packetType) const { +PacketSequenceNumber Node::getLastSequenceNumberForPacketType (PacketType::Value packetType) const { auto typeMatch = _lastSequenceNumbers.find(packetType); if (typeMatch != _lastSequenceNumbers.end()) { return typeMatch->second; diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index be06906527..83bdf0ebd3 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -67,7 +67,7 @@ public: void setLastSequenceNumberForPacketType(PacketSequenceNumber sequenceNumber, PacketType::Value packetType) { _lastSequenceNumbers[packetType] = sequenceNumber; } - PacketSequenceNumber getLastSequenceNumberForPacketType(PacketType packetType) const; + PacketSequenceNumber getLastSequenceNumberForPacketType(PacketType::Value packetType) const; friend QDataStream& operator<<(QDataStream& out, const Node& node); friend QDataStream& operator>>(QDataStream& in, Node& node); diff --git a/libraries/octree/src/EditPacketBuffer.cpp b/libraries/octree/src/EditPacketBuffer.cpp index c7f66c9b0a..9968990692 100644 --- a/libraries/octree/src/EditPacketBuffer.cpp +++ b/libraries/octree/src/EditPacketBuffer.cpp @@ -20,7 +20,7 @@ EditPacketBuffer::EditPacketBuffer() : } -EditPacketBuffer::EditPacketBuffer(PacketType type, unsigned char* buffer, size_t length, qint64 satoshiCost, QUuid nodeUUID) : +EditPacketBuffer::EditPacketBuffer (PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost, QUuid nodeUUID) : _nodeUUID(nodeUUID), _currentType(type), _currentSize(length), diff --git a/libraries/octree/src/EditPacketBuffer.h b/libraries/octree/src/EditPacketBuffer.h index cc26a2dfe5..e817a07d12 100644 --- a/libraries/octree/src/EditPacketBuffer.h +++ b/libraries/octree/src/EditPacketBuffer.h @@ -21,7 +21,7 @@ class EditPacketBuffer { public: EditPacketBuffer(); - EditPacketBuffer(PacketType type, unsigned char* codeColorBuffer, size_t length, + EditPacketBuffer (PacketType::Value type, unsigned char* codeColorBuffer, size_t length, qint64 satoshiCost = 0, const QUuid nodeUUID = QUuid()); QUuid _nodeUUID; diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 3717308008..2397c6bcae 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -230,8 +230,8 @@ public: virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion == versionForPacketType(expectedDataPacketType()); } virtual PacketVersion expectedVersion() const { return versionForPacketType(expectedDataPacketType()); } - virtual bool handlesEditPacketType(PacketType packetType) const { return false; } - virtual int processEditPacketData(PacketType packetType, const unsigned char* packetData, int packetLength, + virtual bool handlesEditPacketType (PacketType::Value packetType) const { return false; } + virtual int processEditPacketData (PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& sourceNode) { return 0; } virtual bool recurseChildrenWithData() const { return true; } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index be05fbb153..d94d3b613c 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -159,7 +159,7 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { } } -void OctreeEditPacketSender::queuePendingPacketToNodes(PacketType type, unsigned char* buffer, +void OctreeEditPacketSender::queuePendingPacketToNodes (PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost) { // If we're asked to save messages while waiting for voxel servers to arrive, then do so... @@ -213,7 +213,7 @@ void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, size_t le // NOTE: editPacketBuffer - is JUST the octcode/color and does not contain the packet header! -void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, unsigned char* editPacketBuffer, +void OctreeEditPacketSender::queueOctreeEditMessage (PacketType::Value type, unsigned char* editPacketBuffer, size_t length, qint64 satoshiCost) { if (!_shouldSend) { diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 077078adeb..a9b9efb73c 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -30,7 +30,7 @@ public: /// Queues a single edit message. Will potentially send a pending multi-command packet. Determines which server /// node or nodes the packet should be sent to. Can be called even before servers are known, in which case up to /// MaxPendingMessages will be buffered and processed when servers are known. - void queueOctreeEditMessage(PacketType type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); + void queueOctreeEditMessage (PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); /// Releases all queued messages even if those messages haven't filled an MTU packet. This will move the packed message /// packets onto the send queue. If running in threaded mode, the caller does not need to do any further processing to @@ -81,7 +81,7 @@ public: // you must override these... virtual char getMyNodeType() const = 0; - virtual void adjustEditPacketForClockSkew(PacketType type, + virtual void adjustEditPacketForClockSkew (PacketType::Value type, unsigned char* editPacketBuffer, size_t length, int clockSkew) { } bool hasDestinationWalletUUID() const { return !_destinationWalletUUID.isNull(); } @@ -99,7 +99,7 @@ signals: protected: bool _shouldSend; void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - void queuePendingPacketToNodes(PacketType type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); + void queuePendingPacketToNodes (PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void queuePacketToNodes(unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void initializePacket(EditPacketBuffer& packetBuffer, PacketType::Value type, int nodeClockSkew); void releaseQueuedPacket(EditPacketBuffer& packetBuffer); // releases specific queued packet From 8dd91b879506d5fbe7dc9e4fd5d795136b222edf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 17:34:52 -0700 Subject: [PATCH 008/582] don't force source ID on ICE ping packets --- domain-server/src/DomainServer.cpp | 10 ++-- libraries/networking/src/LimitedNodeList.cpp | 61 +++++++++++++------- libraries/networking/src/LimitedNodeList.h | 8 ++- libraries/networking/src/NodeList.cpp | 52 ++++++++--------- libraries/networking/src/PacketHeaders.cpp | 2 + libraries/networking/src/PacketHeaders.h | 7 ++- 6 files changed, 83 insertions(+), 57 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 6b6a25f7c9..203b6842be 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1322,14 +1322,14 @@ void DomainServer::pingPunchForConnectingPeer(const SharedNetworkPeer& peer) { _icePeers.remove(peer->getUUID()); } else { - auto nodeList = DependencyManager::get(); + auto limitedNodeList = DependencyManager::get(); // send the ping packet to the local and public sockets for this node - QByteArray localPingPacket = nodeList->constructPingPacket(PingType::Local, false); - nodeList->writeUnverifiedDatagram(localPingPacket, peer->getLocalSocket()); + auto localPingPacket = nodeList->constructICEPingPacket(PingType::Local, limitedNodeList->getSessionUUID()); + limitedNodeList->sendPacket(localPingPacket, peer->getLocalSocket()); - QByteArray publicPingPacket = nodeList->constructPingPacket(PingType::Public, false); - nodeList->writeUnverifiedDatagram(publicPingPacket, peer->getPublicSocket()); + auto publicPingPacket = nodeList->constructICEPingPacket(PingType::Public, limitedNodeList->getSessionUUID()); + limitedNodeList->sendPacket(publicPingPacket, peer->getPublicSocket()); peer->incrementConnectionAttempts(); } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2efb8113d5..4eaa61b5e3 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -168,10 +168,10 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { int numPacketTypeBytes = numBytesArithmeticCodingFromBuffer(packet.data()); if (packet[numPacketTypeBytes] != versionForPacketType(checkType) - && checkType != PacketTypeStunResponse) { + && checkType != PacketType::StunResponse) { PacketType::Value mismatchType = packetTypeForPacket(packet); - static QMultiMap versionDebugSuppressMap; + static QMultiMap versionDebugSuppressMap; QUuid senderUUID = uuidFromPacketHeader(packet); if (!versionDebugSuppressMap.contains(senderUUID, checkType)) { @@ -195,7 +195,7 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { if (hashFromPacketHeader(packet) == hashForPacketAndConnectionUUID(packet, sendingNode->getConnectionSecret())) { return true; } else { - static QMultiMap hashDebugSuppressMap; + static QMultiMap hashDebugSuppressMap; QUuid senderUUID = uuidFromPacketHeader(packet); if (!hashDebugSuppressMap.contains(senderUUID, checkType)) { @@ -521,14 +521,11 @@ unsigned LimitedNodeList::broadcastToNodes(const QByteArray& packet, const NodeS return n; } -QByteArray LimitedNodeList::constructPingPacket(PingType_t pingType, bool isVerified, const QUuid& packetHeaderID) { +NodeListPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { + int packetSize = sizeof(PingType_t) + sizeof(quint64); + NodeListPacket pingPacket = NodeListPacket::create(PacketType::Ping, packetSize); - QUuid packetUUID = packetHeaderID.isNull() ? _sessionUUID : packetHeaderID; - - QByteArray pingPacket = byteArrayWithUUIDPopulatedHeader(isVerified ? PacketTypePing : PacketTypeUnverifiedPing, - packetUUID); - - QDataStream packetStream(&pingPacket, QIODevice::Append); + QDataStream packetStream(&pingPacket.payload(), QIODevice::Append); packetStream << pingType; packetStream << usecTimestampNow(); @@ -536,7 +533,7 @@ QByteArray LimitedNodeList::constructPingPacket(PingType_t pingType, bool isVeri return pingPacket; } -QByteArray LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacket, const QUuid& packetHeaderID) { +NodeListPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacket) { QDataStream pingPacketStream(pingPacket); pingPacketStream.skipRawData(numBytesForPacketHeader(pingPacket)); @@ -545,20 +542,44 @@ QByteArray LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacke quint64 timeFromOriginalPing; pingPacketStream >> timeFromOriginalPing; - - PacketType::Value replyType = (packetTypeForPacket(pingPacket) == PacketTypePing) - ? PacketTypePingReply : PacketTypeUnverifiedPingReply; - - QUuid packetUUID = packetHeaderID.isNull() ? _sessionUUID : packetHeaderID; - - QByteArray replyPacket = byteArrayWithUUIDPopulatedHeader(replyType, packetUUID); + + int packetSize = sizeof(PingType_t) + sizeof(quint64) + sizeof(quint64); + + NodeListPacket replyPacket = NodeListPacket::create(PacketType::Ping, packetSize); + QDataStream packetStream(&replyPacket, QIODevice::Append); - packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); return replyPacket; } +NodeListPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { + int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); + + NodeListPacket icePingPacket = NodeListPacket::create(PacketType::ICEPing, packetSize); + + icePingPacket.payload().replace(0, NUM_BYTES_RFC4122_UUID, iceID.toRfc4122().data()); + memcpy(icePingPacket.payload() + NUM_BYTES_RFC4122_UUID, &pingType, sizeof(PingType_t)); + + return icePingPacket; +} + +NodeListPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { + // pull out the ping type so we can reply back with that + PingType_t pingType; + + memcpy(&pingType, pingPacket.data() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); + + int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); + NodeListPacket icePingReplyPacket = NodeListPacket::create(PacketType::ICEPingReply, packetSize); + + // pack the ICE ID and then the ping type + memcpy(icePingReplyPacket.payload(), iceID.toRfc4122().data(), NUM_BYTES_RFC4122_UUID); + memcpy(icePingReplyPacket.payload() + NUM_BYTES_RFC4122_UUID, &pingType, sizeof(PingType_t)); + + return icePingReplyPacket; +} + SharedNodePointer LimitedNodeList::soloNodeOfType(char nodeType) { return nodeMatchingPredicate([&](const SharedNodePointer& node){ return node->getType() == nodeType; @@ -835,7 +856,7 @@ void LimitedNodeList::sendPeerQueryToIceServer(const HifiSockAddr& iceServerSock sendPacketToIceServer(PacketTypeIceServerQuery, iceServerSockAddr, clientID, peerID); } -void LimitedNodeList::sendPacketToIceServer (PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, +void LimitedNodeList::sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& headerID, const QUuid& peerID) { QByteArray iceRequestByteArray = byteArrayWithUUIDPopulatedHeader(packetType, headerID); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index c8ef7c62dd..b90918ce9e 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -170,9 +170,11 @@ public: void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); void resetPacketStats(); - QByteArray constructPingPacket(PingType_t pingType = PingType::Agnostic, bool isVerified = true, - const QUuid& packetHeaderID = QUuid()); - QByteArray constructPingReplyPacket(const QByteArray& pingPacket, const QUuid& packetHeaderID = QUuid()); + NodeListPacket&& constructPingPacket(PingType_t pingType = PingType::Agnostic); + NodeListPacket&& constructPingReplyPacket(const QByteArray& pingPacket); + + NodeListPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID); + NodeListPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID); virtual bool processSTUNResponse(const QByteArray& packet); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index eadc0adbfb..11f04e188f 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -175,36 +175,36 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) { PacketType::Value packetType = packetTypeForPacket(packet); switch (packetType) { - case PacketTypeDomainList: - case PacketTypeDomainServerAddedNode: { + case PacketType::DomainList: + case PacketType::DomainServerAddedNode: { if (!_domainHandler.getSockAddr().isNull()) { // only process a packet from domain-server if we're talking to a domain // TODO: how do we make sure this is actually the domain we want the list from (DTLS probably) - if (packetType == PacketTypeDomainList) { + if (packetType == PacketType::DomainList) { processDomainServerList(packet); - } else if (packetType == PacketTypeDomainServerAddedNode) { + } else if (packetType == PacketType::DomainServerAddedNode) { processDomainServerAddedNode(packet); } } break; } - case PacketTypeDomainServerRequireDTLS: { + case PacketType::DomainServerRequireDTLS: { _domainHandler.parseDTLSRequirementPacket(packet); break; } - case PacketTypeIceServerPeerInformation: { + case PacketType::IceServerPeerInformation: { if (!_domainHandler.getICEPeer().hasSockets()) { _domainHandler.processICEResponsePacket(packet); } break; } - case PacketTypePing: { + case PacketType::Ping: { // send back a reply SharedNodePointer matchingNode = sendingNodeForPacket(packet); if (matchingNode) { matchingNode->setLastHeardMicrostamp(usecTimestampNow()); - QByteArray replyPacket = constructPingReplyPacket(packet); - writeDatagram(replyPacket, matchingNode, senderSockAddr); + auto replyPacket = constructPingReplyPacket(packet); + sendPacket(replyPacket, matchingNode, senderSockAddr); // If we don't have a symmetric socket for this node and this socket doesn't match // what we have for public and local then set it as the symmetric. @@ -218,7 +218,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr break; } - case PacketTypePingReply: { + case PacketType::PingReply: { SharedNodePointer sendingNode = sendingNodeForPacket(packet); if (sendingNode) { @@ -233,13 +233,13 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr break; } - case PacketTypeUnverifiedPing: { + case PacketType::ICEPing: { // send back a reply - QByteArray replyPacket = constructPingReplyPacket(packet, _domainHandler.getICEClientID()); - writeUnverifiedDatagram(replyPacket, senderSockAddr); + auto replyPacket = constructICEPingReplyPacket(packet, _domainHandler.getICEClientID()); + sendPacket(replyPacket, senderSockAddr); break; } - case PacketTypeUnverifiedPingReply: { + case PacketType::ICEPingReply: { qCDebug(networking) << "Received reply from domain-server on" << senderSockAddr; if (_domainHandler.getIP().isNull()) { @@ -256,13 +256,13 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr } } - case PacketTypeStunResponse: { + case PacketType::StunResponse: { // a STUN packet begins with 00, we've checked the second zero with packetVersionMatch // pass it along so it can be processed into our public address and port processSTUNResponse(packet); break; } - case PacketTypeDomainServerPathResponse: { + case PacketType::DomainServerPathResponse: { handleDSPathQueryResponse(packet); break; } @@ -518,11 +518,11 @@ void NodeList::pingPunchForDomainServer() { flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendPingsToDS); // send the ping packet to the local and public sockets for this node - QByteArray localPingPacket = constructPingPacket(PingType::Local, false, _domainHandler.getICEClientID()); - writeUnverifiedDatagram(localPingPacket, _domainHandler.getICEPeer().getLocalSocket()); + auto localPingPacket = constructICEPingPacket(PingType::Local); + sendPacket(localPingPacket, _domainHandler.getICEPeer().getLocalSocket()); - QByteArray publicPingPacket = constructPingPacket(PingType::Public, false, _domainHandler.getICEClientID()); - writeUnverifiedDatagram(publicPingPacket, _domainHandler.getICEPeer().getPublicSocket()); + auto publicPingPacket = constructICEPingPacket(PingType::Public); + sendPacket(publicPingPacket, _domainHandler.getICEPeer().getPublicSocket()); _domainHandler.getICEPeer().incrementConnectionAttempts(); } @@ -625,15 +625,15 @@ void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { } // send the ping packet to the local and public sockets for this node - QByteArray localPingPacket = constructPingPacket(PingType::Local); - writeDatagram(localPingPacket, node, node->getLocalSocket()); + auto localPingPacket = constructPingPacket(PingType::Local); + sendPacket(localPingPacket, node, node->getLocalSocket()); - QByteArray publicPingPacket = constructPingPacket(PingType::Public); - writeDatagram(publicPingPacket, node, node->getPublicSocket()); + auto publicPingPacket = constructPingPacket(PingType::Public); + sendPacket(publicPingPacket, node, node->getPublicSocket()); if (!node->getSymmetricSocket().isNull()) { - QByteArray symmetricPingPacket = constructPingPacket(PingType::Symmetric); - writeDatagram(symmetricPingPacket, node, node->getSymmetricSocket()); + auto symmetricPingPacket = constructPingPacket(PingType::Symmetric); + sendPacket(symmetricPingPacket, node, node->getSymmetricSocket()); } node->incrementConnectionAttempts(); diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 3e254c29f6..83b424d44d 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -31,6 +31,8 @@ const QSet NON_VERIFIED_PACKETS = QSet() const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; +const QSet NON_SOURCED_PACKETS = QSet() << ICEPing << ICEPingReply; + int arithmeticCodingValueFromBuffer(const char* checkValue) { if (((uchar) *checkValue) < 255) { return *checkValue; diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 7815849863..298a0f7246 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -78,9 +78,9 @@ namespace PacketType { AudioEnvironment, EntityEditNack, SignedTransactionPayment, - IceServerHeartbeat, // 50 - UnverifiedPing, - UnverifiedPingReply + ICEServerHeartbeat, // 50 + ICEPing, + ICEPingReply }; }; @@ -93,6 +93,7 @@ typedef std::map PacketTypeSequenceMap; extern const QSet NON_VERIFIED_PACKETS; extern const QSet SEQUENCE_NUMBERED_PACKETS; +extern const QSet NON_SOURCED_PACKETS; const int NUM_BYTES_MD5_HASH = 16; const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; From a9420d421263be9d83c48df8108eddbfd1b20d79 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Jul 2015 17:55:26 -0700 Subject: [PATCH 009/582] replace controlled broadcast to nodes in Application --- interface/src/Application.cpp | 26 +++++++++++-------- interface/src/Application.h | 2 -- libraries/networking/src/LimitedNodeList.h | 30 +++++++++++----------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a4c9a61aad..2a5a5a3817 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1097,13 +1097,6 @@ void Application::updateProjectionMatrix(Camera& camera, bool updateViewFrustum) glMatrixMode(GL_MODELVIEW); } -void Application::controlledBroadcastToNodes(const QByteArray& packet, const NodeSet& destinationNodeTypes) { - foreach(NodeType_t type, destinationNodeTypes) { - // Perform the broadcast for one type - DependencyManager::get()->broadcastToNodes(packet, NodeSet() << type); - } -} - bool Application::importSVOFromURL(const QString& urlString) { QUrl url(urlString); emit svoImportRequested(url.url()); @@ -1763,10 +1756,21 @@ bool Application::acceptSnapshot(const QString& urlString) { } void Application::sendPingPackets() { - QByteArray pingPacket = DependencyManager::get()->constructPingPacket(); - controlledBroadcastToNodes(pingPacket, NodeSet() - << NodeType::EntityServer - << NodeType::AudioMixer << NodeType::AvatarMixer); + + auto nodeList = DependencyManager::get(); + + nodeList->eachMatchingNode([](const SharedNodePointer& node)->bool { + switch (node->getType()) { + case NodeType::AvatarMixer: + case NodeType::AudioMixer: + case NodeType::EntityServer: + return true; + default: + return false; + } + }, [nodeList](const SharedNodePointer& node) { + nodeList->sendPacket(std::move(nodeList->constructPingPacket()), node); + }); } // Every second, check the frame rates and other stuff diff --git a/interface/src/Application.h b/interface/src/Application.h index 03487a5306..9a9b4cdea0 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -271,8 +271,6 @@ public: void resetProfile(const QString& username); - void controlledBroadcastToNodes(const QByteArray& packet, const NodeSet& destinationNodeTypes); - virtual void setupWorldLight(); virtual bool shouldRenderMesh(float largestDimension, float distanceToCamera); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index b90918ce9e..b705b0e2ea 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -125,21 +125,21 @@ public: // int populatePacketHeader(char* packet, PacketType::Value packetType) // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); - - qint64 writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr = HifiSockAddr()); - - qint64 writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr = HifiSockAddr()); - - qint64 writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); - - qint64 writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr = HifiSockAddr()); - - qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr = HifiSockAddr()); +// qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); +// +// qint64 writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); +// +// qint64 writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); +// +// qint64 writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); +// +// qint64 writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); +// +// qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); void (*linkedDataCreateCallback)(Node *); From 8dc385bd62b19bd4ef65bba0f77b1addc4a3aff7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 11:08:51 -0700 Subject: [PATCH 010/582] initial setup for a PacketByteArray --- libraries/networking/src/PacketByteArray.cpp | 60 ++++++++++++++++++++ libraries/networking/src/PacketByteArray.h | 29 ++++++++++ 2 files changed, 89 insertions(+) create mode 100644 libraries/networking/src/PacketByteArray.cpp create mode 100644 libraries/networking/src/PacketByteArray.h diff --git a/libraries/networking/src/PacketByteArray.cpp b/libraries/networking/src/PacketByteArray.cpp new file mode 100644 index 0000000000..010a083cfe --- /dev/null +++ b/libraries/networking/src/PacketByteArray.cpp @@ -0,0 +1,60 @@ +// +// PacketByteArray.cpp +// libraries/networking/src +// +// Created by Stephen Birarda on 07/06/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 "PacketByteArray.h" + +PacketByteArray::PacketByteArray(char* data, int maxBytes) : + _data(data) + _maxBytes(maxBytes) +{ + +} + +int PacketByteArray::append(const char* src, int srcBytes) { + // this is a call to write at the current index + int numWrittenBytes = write(src, srcBytes, _index); + + if (numWrittenBytes > 0) { + // we wrote some bytes, push the index + _index += numWrittenBytes; + return numWrittenBytes; + } else { + return numWrittenBytes; + } +} + +const int PACKET_WRITE_ERROR = -1; + +int PacketByteArray::write(const char* src, int srcBytes, int index) { + if (index >= _maxBytes) { + // we were passed a bad index, return -1 + return PACKET_WRITE_ERROR; + } + + // make sure we have the space required to write this block + int bytesAvailable = _maxBytes - index; + + if (bytesAvailable < srcBytes) { + // good to go - write the data + memcpy(_data + index, src, srcBytes); + + // should this cause us to push our index (is this the farthest we've written in data)? + _index = std::max(_data + index + srcBytes, _index); + + // return the number of bytes written + return srcBytes; + } else { + // not enough space left for this write - return an error + return PACKET_WRITE_ERROR; + } +} + + diff --git a/libraries/networking/src/PacketByteArray.h b/libraries/networking/src/PacketByteArray.h new file mode 100644 index 0000000000..23ba55780b --- /dev/null +++ b/libraries/networking/src/PacketByteArray.h @@ -0,0 +1,29 @@ +// +// PacketByteArray.h +// libraries/networking/src +// +// Created by Stephen Birarda on 07/06/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_PacketByteArray_h +#define hifi_PacketByteArray_h + +#pragma once + +class PacketByteArray { +public: + PacketByteArray(char* data, int maxBytes); + + int write(const char* src, int srcBytes, int index = 0); + int append(const char* src, int srcBytes) +private: + char* _data; + int _index = 0; + int _maxBytes = 0; +}; + +#endif // hifi_PacketByteArray_h From 57d76f488cabb8850c36b5c7770b049a764b8eef Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 11:33:46 -0700 Subject: [PATCH 011/582] make PacketPayload a QIODevice subclass --- domain-server/src/DomainServer.cpp | 18 ++-- libraries/networking/src/PacketByteArray.cpp | 10 +-- libraries/networking/src/PacketByteArray.h | 29 ------- libraries/networking/src/PacketPayload.cpp | 89 ++++++++++++++++++++ libraries/networking/src/PacketPayload.h | 42 +++++++++ 5 files changed, 148 insertions(+), 40 deletions(-) delete mode 100644 libraries/networking/src/PacketByteArray.h create mode 100644 libraries/networking/src/PacketPayload.cpp create mode 100644 libraries/networking/src/PacketPayload.h diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 203b6842be..5750a33faf 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -617,11 +617,16 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock QString reason; if (!isAssignment && !shouldAllowConnectionFromNode(username, usernameSignature, senderSockAddr, reason)) { // this is an agent and we've decided we won't let them connect - send them a packet to deny connection - QByteArray connectionDeniedByteArray = limitedNodeList->byteArrayWithPopulatedHeader(PacketTypeDomainConnectionDenied); - QDataStream out(&connectionDeniedByteArray, QIODevice::WriteOnly | QIODevice::Append); - out << reason; + + QByteArray utfString = reason.toUtf8(); + int payloadSize = utfString.size(); + + auto connectionDeniedPacket = NodeListPacket::make(PacketType::DomainConnectionDenied, payloadSize); + + memcpy(connectionDeniedPacket.payload().data(), utfString.data(), utfString.size()); + // tell client it has been refused. - DependencyManager::get()->writeUnverifiedDatagram(connectionDeniedByteArray, senderSockAddr); + limitedNodeList->sendPacket(std::move(connectionDeniedPacket, senderSockAddr); return; } @@ -921,10 +926,11 @@ int DomainServer::parseNodeDataFromByteArray(QDataStream& packetStream, NodeType void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const HifiSockAddr &senderSockAddr, const NodeSet& nodeInterestSet) { auto limitedNodeList = DependencyManager::get(); - QByteArray broadcastPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketTypeDomainList); + + auto listPacket = NodeListPacket::make(PacketType::DomainList); // always send the node their own UUID back - QDataStream broadcastDataStream(&broadcastPacket, QIODevice::Append); + QDataStream broadcastDataStream(&listPacket.payload(), QIODevice::Append); broadcastDataStream << node->getUUID(); broadcastDataStream << node->getCanAdjustLocks(); broadcastDataStream << node->getCanRez(); diff --git a/libraries/networking/src/PacketByteArray.cpp b/libraries/networking/src/PacketByteArray.cpp index 010a083cfe..4d456b9066 100644 --- a/libraries/networking/src/PacketByteArray.cpp +++ b/libraries/networking/src/PacketByteArray.cpp @@ -1,5 +1,5 @@ // -// PacketByteArray.cpp +// PacketPayload.cpp // libraries/networking/src // // Created by Stephen Birarda on 07/06/15. @@ -9,16 +9,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "PacketByteArray.h" +#include "PacketPayload.h" -PacketByteArray::PacketByteArray(char* data, int maxBytes) : +PacketPayload::PacketPayload(char* data, int maxBytes) : _data(data) _maxBytes(maxBytes) { } -int PacketByteArray::append(const char* src, int srcBytes) { +int PacketPayload::append(const char* src, int srcBytes) { // this is a call to write at the current index int numWrittenBytes = write(src, srcBytes, _index); @@ -33,7 +33,7 @@ int PacketByteArray::append(const char* src, int srcBytes) { const int PACKET_WRITE_ERROR = -1; -int PacketByteArray::write(const char* src, int srcBytes, int index) { +int PacketPayload::write(const char* src, int srcBytes, int index) { if (index >= _maxBytes) { // we were passed a bad index, return -1 return PACKET_WRITE_ERROR; diff --git a/libraries/networking/src/PacketByteArray.h b/libraries/networking/src/PacketByteArray.h deleted file mode 100644 index 23ba55780b..0000000000 --- a/libraries/networking/src/PacketByteArray.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// PacketByteArray.h -// libraries/networking/src -// -// Created by Stephen Birarda on 07/06/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_PacketByteArray_h -#define hifi_PacketByteArray_h - -#pragma once - -class PacketByteArray { -public: - PacketByteArray(char* data, int maxBytes); - - int write(const char* src, int srcBytes, int index = 0); - int append(const char* src, int srcBytes) -private: - char* _data; - int _index = 0; - int _maxBytes = 0; -}; - -#endif // hifi_PacketByteArray_h diff --git a/libraries/networking/src/PacketPayload.cpp b/libraries/networking/src/PacketPayload.cpp new file mode 100644 index 0000000000..d6a63364ee --- /dev/null +++ b/libraries/networking/src/PacketPayload.cpp @@ -0,0 +1,89 @@ +// +// PacketPayload.cpp +// libraries/networking/src +// +// Created by Stephen Birarda on 07/06/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 "PacketPayload.h" + +PacketPayload::PacketPayload(char* data, qint64 maxBytes) : + _data(data) + _maxBytes(maxBytes) +{ + +} + +qint64 PacketPayload::append(const char* src, qint64 srcBytes) { + // this is a call to write at the current index + qint64 numWrittenBytes = write(src, srcBytes, _index); + + if (numWrittenBytes > 0) { + // we wrote some bytes, push the index + _index += numWrittenBytes; + return numWrittenBytes; + } else { + return numWrittenBytes; + } +} + +const int PACKET_READ_ERROR = -1; + +qint64 PacketPayload::write(const char* src, qint64 srcBytes, qint64 index) { + if (index >= _maxBytes) { + // we were passed a bad index, return error + return PACKET_WRITE_ERROR; + } + + // make sure we have the space required to write this block + qint64 bytesAvailable = _maxBytes - index; + + if (bytesAvailable < srcBytes) { + // good to go - write the data + memcpy(_data + index, src, srcBytes); + + // should this cause us to push our index (is this the farthest we've written in data)? + _writeIndex = std::max(_data + index + srcBytes, _writeIndex); + + // return the number of bytes written + return srcBytes; + } else { + // not enough space left for this write - return an error + return PACKET_WRITE_ERROR; + } +} + +qint64 PacketPayload::readNext(char* dest, qint64 maxSize) { + // call read at the current _readIndex + int numBytesRead = read(dest, maxSize, _readIndex); + + if (numBytesRead > 0) { + // we read some data, push the read index + _readIndex += numBytesRead; + } + + return numBytesRead; +} + +const qint64 PACKET_READ_ERROR = -1; + +qint64 PacketPayload::read(char* dest, qint64 maxSize, qint64 index) { + if (index >= _maxBytes) { + // we were passed a bad index, return error + return PACKET_READ_ERROR; + } + + // we're either reading what is left from the index or what was asked to be read + qint64 numBytesToRead = std::min(_maxSize - index, maxSize); + + if (numBytesToRead > 0) { + // read out the data + memcpy(dest, _data + index, numBytesToRead); + } + + return numBytesToRead; +} diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h new file mode 100644 index 0000000000..1e84c182d4 --- /dev/null +++ b/libraries/networking/src/PacketPayload.h @@ -0,0 +1,42 @@ +// +// PacketPayload.h +// libraries/networking/src +// +// Created by Stephen Birarda on 07/06/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_PacketPayload_h +#define hifi_PacketPayload_h + +#pragma once + +#include + +class PacketPayload : public QIODevice { +public: + PacketPayload(char* data, qint64 maxBytes); + + qint64 write(const char* src, qint64 srcBytes, qint64 index = 0); + qint64 append(const char* src, qint64 srcBytes); + + qint64 read(char* dest, qint64 maxSize, qint64 index = 0); + qint64 readNext(char* dest, qint64 maxSize); + +protected: + virtual qint64 writeData(const char* data, qint64 maxSize) { return append(data, maxSize) }; + virtual qint64 readData(const char* data, qint64 maxSize) { return readNext(data, maxSize) }; + +private: + char* _data; + + qint64 _writeIndex = 0; + qint64 _readIndex = 0; + + qint64 _maxBytes = 0; +}; + +#endif // hifi_PacketByteArray_h From b660c8098831d7de5060518b8c04b7611369b9f1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 11:51:20 -0700 Subject: [PATCH 012/582] leverage QIODevice for much of PacketPayload functionality --- libraries/networking/src/PacketPayload.cpp | 60 ++++++---------------- libraries/networking/src/PacketPayload.h | 15 ++---- 2 files changed, 21 insertions(+), 54 deletions(-) diff --git a/libraries/networking/src/PacketPayload.cpp b/libraries/networking/src/PacketPayload.cpp index d6a63364ee..6a212f38fc 100644 --- a/libraries/networking/src/PacketPayload.cpp +++ b/libraries/networking/src/PacketPayload.cpp @@ -11,43 +11,28 @@ #include "PacketPayload.h" -PacketPayload::PacketPayload(char* data, qint64 maxBytes) : +PacketPayload::PacketPayload(char* data, qint64 size) : _data(data) - _maxBytes(maxBytes) + _size(size) { } -qint64 PacketPayload::append(const char* src, qint64 srcBytes) { - // this is a call to write at the current index - qint64 numWrittenBytes = write(src, srcBytes, _index); - - if (numWrittenBytes > 0) { - // we wrote some bytes, push the index - _index += numWrittenBytes; - return numWrittenBytes; - } else { - return numWrittenBytes; - } -} - const int PACKET_READ_ERROR = -1; -qint64 PacketPayload::write(const char* src, qint64 srcBytes, qint64 index) { - if (index >= _maxBytes) { - // we were passed a bad index, return error - return PACKET_WRITE_ERROR; - } +qint64 PacketPayload::writeData(const char* data, qint64 maxSize) { + + qint64 currentPos = pos(); // make sure we have the space required to write this block - qint64 bytesAvailable = _maxBytes - index; + qint64 bytesAvailable = _size - currentPos; if (bytesAvailable < srcBytes) { // good to go - write the data - memcpy(_data + index, src, srcBytes); + memcpy(_data + currentPos, src, srcBytes); // should this cause us to push our index (is this the farthest we've written in data)? - _writeIndex = std::max(_data + index + srcBytes, _writeIndex); + seek(currentPos + srcBytes); // return the number of bytes written return srcBytes; @@ -57,32 +42,21 @@ qint64 PacketPayload::write(const char* src, qint64 srcBytes, qint64 index) { } } -qint64 PacketPayload::readNext(char* dest, qint64 maxSize) { - // call read at the current _readIndex - int numBytesRead = read(dest, maxSize, _readIndex); - - if (numBytesRead > 0) { - // we read some data, push the read index - _readIndex += numBytesRead; - } - - return numBytesRead; -} - const qint64 PACKET_READ_ERROR = -1; -qint64 PacketPayload::read(char* dest, qint64 maxSize, qint64 index) { - if (index >= _maxBytes) { - // we were passed a bad index, return error - return PACKET_READ_ERROR; - } +qint64 PacketPayload::readData(char* dest, qint64 maxSize) { - // we're either reading what is left from the index or what was asked to be read - qint64 numBytesToRead = std::min(_maxSize - index, maxSize); + int currentPosition = pos(); + + // we're either reading what is left from the current position or what was asked to be read + qint64 numBytesToRead = std::min(_maxSize - currentPosition, maxSize); if (numBytesToRead > 0) { // read out the data - memcpy(dest, _data + index, numBytesToRead); + memcpy(dest, _data + currentPosition, numBytesToRead); + + // seek to the end of the read + seek(_data + currentPosition + numBytesToRead); } return numBytesToRead; diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h index 1e84c182d4..7407bbd769 100644 --- a/libraries/networking/src/PacketPayload.h +++ b/libraries/networking/src/PacketPayload.h @@ -18,13 +18,10 @@ class PacketPayload : public QIODevice { public: - PacketPayload(char* data, qint64 maxBytes); + PacketPayload(char* data, qint64 size); - qint64 write(const char* src, qint64 srcBytes, qint64 index = 0); - qint64 append(const char* src, qint64 srcBytes); - - qint64 read(char* dest, qint64 maxSize, qint64 index = 0); - qint64 readNext(char* dest, qint64 maxSize); + virtual qint64 size() const { return _size; } + virtual bool isSequential() const { return false; } protected: virtual qint64 writeData(const char* data, qint64 maxSize) { return append(data, maxSize) }; @@ -32,11 +29,7 @@ protected: private: char* _data; - - qint64 _writeIndex = 0; - qint64 _readIndex = 0; - - qint64 _maxBytes = 0; + qint64 _size = 0; }; #endif // hifi_PacketByteArray_h From 1867f259d6858af3b5c228302bff73d0cd9c0f54 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 11:55:49 -0700 Subject: [PATCH 013/582] keep track of max written in PacketPayload --- libraries/networking/src/PacketPayload.cpp | 5 ++++- libraries/networking/src/PacketPayload.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketPayload.cpp b/libraries/networking/src/PacketPayload.cpp index 6a212f38fc..fa7d0bd694 100644 --- a/libraries/networking/src/PacketPayload.cpp +++ b/libraries/networking/src/PacketPayload.cpp @@ -31,9 +31,12 @@ qint64 PacketPayload::writeData(const char* data, qint64 maxSize) { // good to go - write the data memcpy(_data + currentPos, src, srcBytes); - // should this cause us to push our index (is this the farthest we've written in data)? + // seek to the new position based on where our write just finished seek(currentPos + srcBytes); + // keep track of _maxWritten so we can just write the actual data when packet is about to be sent + _maxWritten = std::max(pos() + 1, _maxWritten); + // return the number of bytes written return srcBytes; } else { diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h index 7407bbd769..c12ec18d04 100644 --- a/libraries/networking/src/PacketPayload.h +++ b/libraries/networking/src/PacketPayload.h @@ -30,6 +30,7 @@ protected: private: char* _data; qint64 _size = 0; + qint64 _maxWritten = 0; }; #endif // hifi_PacketByteArray_h From 93ac2704e87d55fcd6ab931700af7905008029a4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 12:38:49 -0700 Subject: [PATCH 014/582] fix header guard comment in PacketPayload --- libraries/networking/src/PacketPayload.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h index c12ec18d04..5885710168 100644 --- a/libraries/networking/src/PacketPayload.h +++ b/libraries/networking/src/PacketPayload.h @@ -33,4 +33,4 @@ private: qint64 _maxWritten = 0; }; -#endif // hifi_PacketByteArray_h +#endif // hifi_PacketPayload_h From cbba8263cdeb38f90b9d90f024e6dd9a85ab49e3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 14:27:20 -0700 Subject: [PATCH 015/582] fix writeData and readData for PacketPayload --- libraries/networking/src/PacketPayload.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h index 5885710168..dceb1f23ce 100644 --- a/libraries/networking/src/PacketPayload.h +++ b/libraries/networking/src/PacketPayload.h @@ -24,8 +24,8 @@ public: virtual bool isSequential() const { return false; } protected: - virtual qint64 writeData(const char* data, qint64 maxSize) { return append(data, maxSize) }; - virtual qint64 readData(const char* data, qint64 maxSize) { return readNext(data, maxSize) }; + virtual qint64 writeData(const char* data, qint64 maxSize); + virtual qint64 readData(const char* data, qint64 maxSize); private: char* _data; From 25e82d4b92da687a2446e46808d8028964eb14f6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 14:29:24 -0700 Subject: [PATCH 016/582] initial version of PacketList QIODevice subclass --- libraries/networking/src/PacketList.cpp | 14 +++++++++++++ libraries/networking/src/PacketList.h | 27 +++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 libraries/networking/src/PacketList.cpp create mode 100644 libraries/networking/src/PacketList.h diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp new file mode 100644 index 0000000000..e0324db7f6 --- /dev/null +++ b/libraries/networking/src/PacketList.cpp @@ -0,0 +1,14 @@ +// +// PacketList.cpp +// libraries/networking/src +// +// Created by Stephen Birarda on 07/06/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 "PacketList.h" + + diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h new file mode 100644 index 0000000000..d035c2bd4d --- /dev/null +++ b/libraries/networking/src/PacketList.h @@ -0,0 +1,27 @@ +// +// PacketList.h +// libraries/networking/src +// +// Created by Stephen Birarda on 07/06/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_PacketList_h +#define hifi_PacketList_h + +#pragma once + +template class PacketList : public QIODevice { +public: + PacketList(PacketType::Value type, bool isOrdered = false); +protected: + virtual qint64 writeData(const char* data, qint64 maxSize); + virtual qint64 readData(const char* data, qint64 maxSize); +private: + std::list> _packets; +} + +#endif // hifi_PacketList_h From 43354c3b2886af2ec05959bb458e064d3345bb7c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 6 Jul 2015 15:03:00 -0700 Subject: [PATCH 017/582] More Packet class work + NLPacket shell --- libraries/networking/src/LimitedNodeList.h | 1 + libraries/networking/src/Packet.cpp | 60 +++++++++++++++++++--- libraries/networking/src/Packet.h | 55 +++++++++++++++++--- 3 files changed, 104 insertions(+), 12 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index b705b0e2ea..785933120f 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -36,6 +36,7 @@ #include "DomainHandler.h" #include "Node.h" +#include "Packet.h" #include "PacketHeaders.h" #include "UUIDHasher.h" diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index bb5cf98153..bbd001f8d8 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -11,12 +11,60 @@ #include "Packet.h" -#include - -std::unique_ptr Packet::makePacket() { - return std::unique_ptr(new Packet()); +int64_t Packet::headerSize() { + return sizeof(Packet::Header); } -QByteArray Packet::payload() { - return QByteArray(); +int64_t Packet::maxPayloadSize() { + return MAX_PACKET_SIZE - Packet::headerSize(); +} + +std::unique_ptr Packet::create(PacketType::Value type, int64_t size) { + if (size == -1) { + size = maxPayloadSize(); + } + if (size <= 0 || size > maxPayloadSize()) { + return std::unique_ptr(); + } + + return std::unique_ptr(new Packet(type, size)); +} + +Packet::Packet(PacketType::Value type, int64_t size) { + _packetSize = headerSize() + size; + _packet = std::unique_ptr(new char(_packetSize)); + _payloadStart = _packet.get() + headerSize(); +} + +const Packet::Header& Packet::getHeader() const { + return *reinterpret_cast(_packet.get()); +} + +Packet::Header& Packet::getHeader() { + return *reinterpret_cast(_packet.get()); +} + +char* Packet::getPayload() { + return _payloadStart; +} + + +int64_t NodeListPacket::headerSize() { + return sizeof(NodeListPacket::Header); +} + +int64_t NodeListPacket::maxPayloadSize() { + return Packet::maxPayloadSize() - NodeListPacket::headerSize(); +} + +std::unique_ptr NodeListPacket::create(PacketType::Value type, int64_t size) { + if (size > maxPayloadSize()) { + return std::unique_ptr(); + } + + return std::unique_ptr(new NodeListPacket(type, size)); +} + +NodeListPacket::NodeListPacket(PacketType::Value type, int64_t size) : Packet(type, headerSize() + size) { + } \ No newline at end of file diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 8541bfb881..1fa634621c 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -14,18 +14,61 @@ #include -class QByteArray; +#include "LimitedNodeList.h" +#include "PacketHeaders.h" class Packet { - std::unique_ptr makePacket(); - QByteArray payload(); +public: + struct Header { + // Required + uint8_t _type; + uint8_t _version; + + // Optionnal + uint16_t _messageNumber; + // 1st bit is the data/control bit, rest is the sequence number + uint32_t _controlBitAndSequenceNumber; + }; + // TODO sanity check Header struct size + + static int64_t headerSize(); + static int64_t maxPayloadSize(); + + static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + + virtual const Header& getHeader() const; + virtual char* getPayload(); protected: - Packet(); - Packet(const Packet&) = delete; + Packet(PacketType::Value type, int64_t size); Packet(Packet&&) = delete; - Packet& operator=(const Packet&) = delete; + Packet(const Packet&) = delete; Packet& operator=(Packet&&) = delete; + Packet& operator=(const Packet&) = delete; + + Header& getHeader(); + +private: + int64_t _packetSize; + std::unique_ptr _packet; + + char* _payloadStart; +}; + +class NodeListPacket : public Packet { +public: + struct Header { + // Required + char _sourceUuid[NUM_BYTES_RFC4122_UUID]; + char _connectionUuid[NUM_BYTES_RFC4122_UUID]; + }; + static int64_t headerSize(); + static int64_t maxPayloadSize(); + + static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + +protected: + NodeListPacket(PacketType::Value type, int64_t size); }; #endif // hifi_Packet_h \ No newline at end of file From 4a777f600f75cf972a978084583927250203f9fd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 6 Jul 2015 15:11:36 -0700 Subject: [PATCH 018/582] Change DDE Packet struct name to avoid collision --- interface/src/devices/DdeFaceTracker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index 6facf44b91..71039475a4 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -118,7 +118,7 @@ static const float DDE_COEFFICIENT_SCALES[] = { 1.0f // CheekSquint_R }; -struct Packet { +struct DDEPacket { //roughly in mm float focal_length[1]; float translation[3]; @@ -347,7 +347,7 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) { bool isFiltering = Menu::getInstance()->isOptionChecked(MenuOption::VelocityFilter); - Packet packet; + DDEPacket packet; int bytesToCopy = glm::min((int)sizeof(packet), buffer.size()); memset(&packet.name, '\n', MAX_NAME_SIZE + 1); memcpy(&packet, buffer.data(), bytesToCopy); From 2ab2888260611a71ca409dc70dea060416861055 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 15:50:54 -0700 Subject: [PATCH 019/582] add the complicated writeData method for PacketList --- libraries/networking/src/PacketList.cpp | 82 +++++++++++++++++++++++++ libraries/networking/src/PacketList.h | 15 ++++- 2 files changed, 94 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index e0324db7f6..94280e752d 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -11,4 +11,86 @@ #include "PacketList.h" +PacketList::PacketList(PacketType::Value packetType, bool isOrdered) : + _packetType(packetType), + _isOrdered(isOrdered) +{ + +} + +qint64 writeData(const char* data, qint64 maxSize) { + if (!_currentPacket) { + // we don't have a current packet, time to set one up + _currentPacket = T::create(_packetType); + } + + // check if this block of data can fit into the currentPacket + if (maxSize <= _currentPacket.size()) { + // it fits, just write it to the current packet + _currentPacket.write(data, maxSize); + + // return the number of bytes written + return maxSize; + } else { + // it does not fit - this may need to be in the next packet + + if (!_isOrdered) { + auto newPacket = T::create(_packetType); + PacketPayload& newPayload = newPacket.payload(); + + if (_segmentStartIndex >= 0) { + // We in the process of writing a segment for an unordered PacketList. + // We need to try and pull the first part of the segment out to our new packet + + PacketPayload& currentPayload = _currentPacket->payload(); + + // check now to see if this is an unsupported write + int numBytesToEnd = currentPayload.size() - _segmentStartIndex; + + if ((newPayload.size() - numBytesToEnd) < maxSize) { + // this is an unsupported case - the segment is bigger than the size of an individual packet + // but the PacketList is not going to be sent ordered + qDebug() << "Error in PacketList::writeData - attempted to write a segment to an unordered packet that is" + << "larger than the payload size."; + return -1; + } + + // copy from currentPacket where the segment started to the beginning of the newPacket + newPayload.write(currentPacket.constData() + _segmentStartIndex, numBytesToEnd); + + // the current segment now starts at the beginning of the new packet + _segmentStartIndex = 0; + + // shrink the current payload to the actual size of the packet + currentPayload.setActualSize(_segmentStartIndex); + } else { + // shrink the current payload to the actual size of the packet + currentPayload.trim(); + } + + // move the current packet to our list of packets + _packets.insert(std::move(_currentPacket)); + + // write the data to the newPacket + newPayload.write(data, maxSize); + + // set our current packet to the new packet + _currentPacket = newPacket; + + } else { + // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover + // into a new packet + PacketPayload& currentPayload = _currentPacket.payload(); + + int numBytesToEnd = _currentPayload.size() - _currentPayload.pos(); + _currentPacket.write(data, numBytesToEnd); + + // move the current packet to our list of packets + _packets.insert(std::move(_currentPacket)); + + // recursively call our writeData method for the remaining data to write to a new packet + writeData(data + numBytesToEnd, maxSize - numBytesToEnd); + } + } +} diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index d035c2bd4d..712ff41438 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -16,12 +16,21 @@ template class PacketList : public QIODevice { public: - PacketList(PacketType::Value type, bool isOrdered = false); + PacketList(PacketType::Value packetType, bool isOrdered = false); + + virtual bool isSequential() const { return true; } + protected: - virtual qint64 writeData(const char* data, qint64 maxSize); - virtual qint64 readData(const char* data, qint64 maxSize); + qint64 writeData(const char* data, qint64 maxSize); + qint64 readData(const char* data, qint64 maxSize) { return 0 }; private: + PacketType::Value _packetType; + bool isOrdered; + + std::unique_ptr _currentPacket; std::list> _packets; + + int _segmentStartIndex = -1; } #endif // hifi_PacketList_h From 3ae8ba2922b0ff3ed1f4cb81834140e9711fc51d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 15:53:26 -0700 Subject: [PATCH 020/582] add segment calls to PacketList --- libraries/networking/src/PacketList.cpp | 4 +++- libraries/networking/src/PacketList.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 94280e752d..3dcdf5a799 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -77,6 +77,8 @@ qint64 writeData(const char* data, qint64 maxSize) { // set our current packet to the new packet _currentPacket = newPacket; + // return the number of bytes written to the new packet + return maxSize; } else { // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover // into a new packet @@ -89,7 +91,7 @@ qint64 writeData(const char* data, qint64 maxSize) { _packets.insert(std::move(_currentPacket)); // recursively call our writeData method for the remaining data to write to a new packet - writeData(data + numBytesToEnd, maxSize - numBytesToEnd); + return numBytesToEnd + writeData(data + numBytesToEnd, maxSize - numBytesToEnd); } } } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 712ff41438..3fffb328d2 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -20,6 +20,8 @@ public: virtual bool isSequential() const { return true; } + void startSegment() { _segmentStartIndex = currentPacket->payload().pos(); } + void endSegment() { _segmentStartIndex = -1; } protected: qint64 writeData(const char* data, qint64 maxSize); qint64 readData(const char* data, qint64 maxSize) { return 0 }; From 33a9a04d9e3ea1a8c2e8399c5366069fb99e7212 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 16:18:49 -0700 Subject: [PATCH 021/582] allow a packet to be created with extended header --- domain-server/src/DomainServer.cpp | 52 +++++++++++-------------- libraries/networking/src/PacketList.cpp | 27 +++++++++++-- libraries/networking/src/PacketList.h | 8 ++++ 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 5750a33faf..35be97d610 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -927,15 +927,22 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif const NodeSet& nodeInterestSet) { auto limitedNodeList = DependencyManager::get(); - auto listPacket = NodeListPacket::make(PacketType::DomainList); + PacketList domainListPackets(PacketType::DomainList); // always send the node their own UUID back - QDataStream broadcastDataStream(&listPacket.payload(), QIODevice::Append); - broadcastDataStream << node->getUUID(); - broadcastDataStream << node->getCanAdjustLocks(); - broadcastDataStream << node->getCanRez(); + QDataStream domainListStream(&domainListPackets); - int numBroadcastPacketLeadBytes = broadcastDataStream.device()->pos(); + const int NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES = NUM_BYTES_RFC4122_UUID + 2; + + // setup the extended header for the domain list packets + // this data is at the beginning of each of the domain list packets + QByteArray extendedHeader(NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES, 0); + extendedHeader.replace(0, NUM_BYTES_RFC4122_UUID, node->getUUID().toRfc4122()); + + extendedHeader[NUM_BYTES_RFC4122_UUID] = (char) node->getCanAdjustLocks(); + extendedHeader[NUM_BYTES_RFC4122_UUID + 1] = (char) node->getCanRez(); + + domainListPackets.setExtendedHeader(extendedHeader); DomainServerNodeData* nodeData = reinterpret_cast(node->getLinkedData()); @@ -944,44 +951,29 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif if (nodeInterestSet.size() > 0) { -// DTLSServerSession* dtlsSession = _isUsingDTLS ? _dtlsSessions[senderSockAddr] : NULL; - int dataMTU = MAX_PACKET_SIZE; - + // DTLSServerSession* dtlsSession = _isUsingDTLS ? _dtlsSessions[senderSockAddr] : NULL; if (nodeData->isAuthenticated()) { // if this authenticated node has any interest types, send back those nodes as well limitedNodeList->eachNode([&](const SharedNodePointer& otherNode){ - // reset our nodeByteArray and nodeDataStream - QByteArray nodeByteArray; - QDataStream nodeDataStream(&nodeByteArray, QIODevice::Append); - if (otherNode->getUUID() != node->getUUID() && nodeInterestSet.contains(otherNode->getType())) { + // since we're about to add a node to the packet we start a segment + domainListStream.startSegment(); // don't send avatar nodes to other avatars, that will come from avatar mixer - nodeDataStream << *otherNode.data(); + domainListStream << *otherNode.data(); // pack the secret that these two nodes will use to communicate with each other - nodeDataStream << connectionSecretForNodes(node, otherNode); + domainListStream << connectionSecretForNodes(node, otherNode); - if (broadcastPacket.size() + nodeByteArray.size() > dataMTU) { - // we need to break here and start a new packet - // so send the current one - - limitedNodeList->writeUnverifiedDatagram(broadcastPacket, node, senderSockAddr); - - // reset the broadcastPacket structure - broadcastPacket.resize(numBroadcastPacketLeadBytes); - broadcastDataStream.device()->seek(numBroadcastPacketLeadBytes); - } - - // append the nodeByteArray to the current state of broadcastDataStream - broadcastPacket.append(nodeByteArray); + // we've added the node we wanted so end the segment now + domainListStream.endSegment(); } }); } } - // always write the last broadcastPacket - limitedNodeList->writeUnverifiedDatagram(broadcastPacket, node); + // write the PacketList to this node + limitedNodeList->sendPacketList(domainListPackets, node); } QUuid DomainServer::connectionSecretForNodes(const SharedNodePointer& nodeA, const SharedNodePointer& nodeB) { diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 3dcdf5a799..2161af679a 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -18,10 +18,21 @@ PacketList::PacketList(PacketType::Value packetType, bool isOrdered) : } +void PacketList::createPacketWithExtendedHeader() { + // use the static create method to create a new packet + _currentPacket = T::create(_packetType); + + // add the extended header to the front of the packet + if (_currentPacket.write(_extendedHeader) == -1) { + qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" + << "- make sure that _extendedHeader is not larger than the payload capacity."; + } +} + qint64 writeData(const char* data, qint64 maxSize) { if (!_currentPacket) { // we don't have a current packet, time to set one up - _currentPacket = T::create(_packetType); + createPacketWithExtendedHeader(); } // check if this block of data can fit into the currentPacket @@ -36,13 +47,13 @@ qint64 writeData(const char* data, qint64 maxSize) { if (!_isOrdered) { auto newPacket = T::create(_packetType); - PacketPayload& newPayload = newPacket.payload(); + PacketPayload& newPayload = newPacket.getPayload(); if (_segmentStartIndex >= 0) { // We in the process of writing a segment for an unordered PacketList. // We need to try and pull the first part of the segment out to our new packet - PacketPayload& currentPayload = _currentPacket->payload(); + PacketPayload& currentPayload = _currentPacket->getPayload(); // check now to see if this is an unsupported write int numBytesToEnd = currentPayload.size() - _segmentStartIndex; @@ -82,7 +93,7 @@ qint64 writeData(const char* data, qint64 maxSize) { } else { // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover // into a new packet - PacketPayload& currentPayload = _currentPacket.payload(); + PacketPayload& currentPayload = _currentPacket.getPayload(); int numBytesToEnd = _currentPayload.size() - _currentPayload.pos(); _currentPacket.write(data, numBytesToEnd); @@ -96,3 +107,11 @@ qint64 writeData(const char* data, qint64 maxSize) { } } +void PacketList::closeCurrentPacket() { + // shrink the current payload to the actual size of the packet + _currentPacket.getPayload().trim(); + + // move the current packet to our list of packets + _packets.insert(std::move(_currentPacket)); +} + diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 3fffb328d2..1b0905a1c8 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -22,10 +22,16 @@ public: void startSegment() { _segmentStartIndex = currentPacket->payload().pos(); } void endSegment() { _segmentStartIndex = -1; } + + void closeCurrentPacket(); + + void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } protected: qint64 writeData(const char* data, qint64 maxSize); qint64 readData(const char* data, qint64 maxSize) { return 0 }; private: + void createPacketWithExtendedHeader(); + PacketType::Value _packetType; bool isOrdered; @@ -33,6 +39,8 @@ private: std::list> _packets; int _segmentStartIndex = -1; + + QByteArray _extendedHeader = extendedHeader; } #endif // hifi_PacketList_h From 6187cff76665ed9096b993569f5b4f53b91c9ec3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 16:20:56 -0700 Subject: [PATCH 022/582] add a constData method to PacketPayload --- libraries/networking/src/PacketPayload.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h index dceb1f23ce..9c331c47a2 100644 --- a/libraries/networking/src/PacketPayload.h +++ b/libraries/networking/src/PacketPayload.h @@ -23,6 +23,7 @@ public: virtual qint64 size() const { return _size; } virtual bool isSequential() const { return false; } + const char* constData() const { return _data; } protected: virtual qint64 writeData(const char* data, qint64 maxSize); virtual qint64 readData(const char* data, qint64 maxSize); From 922dd5a73924d7bc86701c89d00971422d86d163 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 16:35:29 -0700 Subject: [PATCH 023/582] keep track of size used in PacketPayload --- libraries/networking/src/PacketList.cpp | 8 +------- libraries/networking/src/PacketPayload.cpp | 8 ++++---- libraries/networking/src/PacketPayload.h | 15 +++++++++------ 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 2161af679a..bb61dd39d1 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -73,10 +73,7 @@ qint64 writeData(const char* data, qint64 maxSize) { _segmentStartIndex = 0; // shrink the current payload to the actual size of the packet - currentPayload.setActualSize(_segmentStartIndex); - } else { - // shrink the current payload to the actual size of the packet - currentPayload.trim(); + currentPayload.setSizeUsed(_segmentStartIndex); } // move the current packet to our list of packets @@ -108,9 +105,6 @@ qint64 writeData(const char* data, qint64 maxSize) { } void PacketList::closeCurrentPacket() { - // shrink the current payload to the actual size of the packet - _currentPacket.getPayload().trim(); - // move the current packet to our list of packets _packets.insert(std::move(_currentPacket)); } diff --git a/libraries/networking/src/PacketPayload.cpp b/libraries/networking/src/PacketPayload.cpp index fa7d0bd694..5f0bc9b557 100644 --- a/libraries/networking/src/PacketPayload.cpp +++ b/libraries/networking/src/PacketPayload.cpp @@ -11,9 +11,9 @@ #include "PacketPayload.h" -PacketPayload::PacketPayload(char* data, qint64 size) : +PacketPayload::PacketPayload(char* data, qint64 capacity) : _data(data) - _size(size) + _capacity(capacity) { } @@ -25,7 +25,7 @@ qint64 PacketPayload::writeData(const char* data, qint64 maxSize) { qint64 currentPos = pos(); // make sure we have the space required to write this block - qint64 bytesAvailable = _size - currentPos; + qint64 bytesAvailable = _capacity - currentPos; if (bytesAvailable < srcBytes) { // good to go - write the data @@ -35,7 +35,7 @@ qint64 PacketPayload::writeData(const char* data, qint64 maxSize) { seek(currentPos + srcBytes); // keep track of _maxWritten so we can just write the actual data when packet is about to be sent - _maxWritten = std::max(pos() + 1, _maxWritten); + _size = std::max(pos() + 1, _maxWritten); // return the number of bytes written return srcBytes; diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h index 9c331c47a2..a9e3811767 100644 --- a/libraries/networking/src/PacketPayload.h +++ b/libraries/networking/src/PacketPayload.h @@ -18,20 +18,23 @@ class PacketPayload : public QIODevice { public: - PacketPayload(char* data, qint64 size); + PacketPayload(char* data, qint64 capacity); - virtual qint64 size() const { return _size; } + qint64 getSizeUsed() const { return _sizeUsed; } + void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } + + virtual qint64 size() const { return _capacity; } virtual bool isSequential() const { return false; } const char* constData() const { return _data; } protected: - virtual qint64 writeData(const char* data, qint64 maxSize); - virtual qint64 readData(const char* data, qint64 maxSize); + qint64 writeData(const char* data, qint64 maxSize); + qint64 readData(char* data, qint64 maxSize); private: char* _data; - qint64 _size = 0; - qint64 _maxWritten = 0; + qint64 _sizeUsed = 0; + qint64 _capacity = 0; }; #endif // hifi_PacketPayload_h From 5a57e9861caf4994682d8a7ea437f686cbbb73dd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 16:38:33 -0700 Subject: [PATCH 024/582] packet API changes in AssignmentClientMonitor --- assignment-client/src/AssignmentClientMonitor.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 8c6478b59f..97f91566e1 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -195,8 +195,8 @@ void AssignmentClientMonitor::checkSpares() { SharedNodePointer childNode = nodeList->nodeWithUUID(aSpareId); childNode->activateLocalSocket(); - QByteArray diePacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeStopNode); - nodeList->writeUnverifiedDatagram(diePacket, childNode); + NodeListPacket diePacket = NodeListPacket::create(PacketType::StopNode); + nodeList->sendPacket(diePacket, childNode); } } } @@ -229,8 +229,9 @@ void AssignmentClientMonitor::readPendingDatagrams() { } else { // tell unknown assignment-client child to exit. qDebug() << "asking unknown child to exit."; - QByteArray diePacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeStopNode); - nodeList->writeUnverifiedDatagram(diePacket, senderSockAddr); + + NodeListPacket diePacket = NodeListPacket::create(PacketType::StopNode); + nodeList->sendPacket(diePacket, childNode); } } } From 672c5a84147c5d4e4e603736cd4d9629a32f77a1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 16:49:48 -0700 Subject: [PATCH 025/582] use new packet creation for client audio --- assignment-client/src/audio/AudioMixer.cpp | 35 ++++++++++------------ 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index abbf8071f7..60f110fed8 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -712,8 +712,6 @@ void AudioMixer::run() { QElapsedTimer timer; timer.start(); - char clientMixBuffer[MAX_PACKET_SIZE]; - int usecToSleep = AudioConstants::NETWORK_FRAME_USECS; const int TRAILING_AVERAGE_FRAMES = 100; @@ -791,8 +789,8 @@ void AudioMixer::run() { // if the stream should be muted, send mute packet if (nodeData->getAvatarAudioStream() && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { - QByteArray packet = nodeList->byteArrayWithPopulatedHeader(PacketTypeNoisyMute); - nodeList->writeDatagram(packet, node); + auto mutePacket = NodeListPacket::create(PacketType::NoisyMute); + nodeList->sendPacket(mutePacket, node); } if (node->getType() == NodeType::Agent && node->getActiveSocket() @@ -800,41 +798,38 @@ void AudioMixer::run() { int streamsMixed = prepareMixForListeningNode(node.data()); - char* mixDataAt; + std::unique_ptr mixPacket; + if (streamsMixed > 0) { - // pack header - int numBytesMixPacketHeader = nodeList->populatePacketHeader(clientMixBuffer, PacketTypeMixedAudio); - mixDataAt = clientMixBuffer + numBytesMixPacketHeader; + int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO; + mixPacket = NodeListPacket::create(PacketType::MixedAudio); + + PacketPayload mixPacketPayload = mixPacket->getPayload(); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - memcpy(mixDataAt, &sequence, sizeof(quint16)); - mixDataAt += sizeof(quint16); + mixPacketPayload.write(&sequence, sizeof(quint16)); // pack mixed audio samples - memcpy(mixDataAt, _mixSamples, AudioConstants::NETWORK_FRAME_BYTES_STEREO); - mixDataAt += AudioConstants::NETWORK_FRAME_BYTES_STEREO; + mixPacketPayload.write(mixSamples, AudioConstants::NETWORK_FRAME_BYTES_STEREO); } else { - // pack header - int numBytesPacketHeader = nodeList->populatePacketHeader(clientMixBuffer, PacketTypeSilentAudioFrame); - mixDataAt = clientMixBuffer + numBytesPacketHeader; + int silentPacketBytes = sizeof(quint16) + sizeof(quint16); + mixPacket = NodeListPacket::create(PacketType::SilentAudioFrame); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - memcpy(mixDataAt, &sequence, sizeof(quint16)); - mixDataAt += sizeof(quint16); + mixPacketPayload.write(&sequence, sizeof(quint16)); // pack number of silent audio samples quint16 numSilentSamples = AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; - memcpy(mixDataAt, &numSilentSamples, sizeof(quint16)); - mixDataAt += sizeof(quint16); + mixPacketPayload.write(&numSilentSamples, sizeof(quint16)); } // Send audio environment sendAudioEnvironmentPacket(node); // send mixed audio packet - nodeList->writeDatagram(clientMixBuffer, mixDataAt - clientMixBuffer, node); + nodeList->sendPacket(mixPacket, node); nodeData->incrementOutgoingMixedAudioSequenceNumber(); // send an audio stream stats packet if it's time From 9a521fee47474fd70d88511c37eab7ced3db789e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 16:53:53 -0700 Subject: [PATCH 026/582] change audio environment packet creation --- assignment-client/src/audio/AudioMixer.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 60f110fed8..a39cd4a7b3 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -509,24 +509,21 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { if (sendData) { auto nodeList = DependencyManager::get(); - int numBytesEnvPacketHeader = nodeList->populatePacketHeader(clientEnvBuffer, PacketTypeAudioEnvironment); - char* envDataAt = clientEnvBuffer + numBytesEnvPacketHeader; + auto envPacket = NLPacket::create(PacketType::AudioEnvironment); + auto envPacketPayload = envPacket->payload(); unsigned char bitset = 0; if (hasReverb) { setAtBit(bitset, HAS_REVERB_BIT); } - memcpy(envDataAt, &bitset, sizeof(unsigned char)); - envDataAt += sizeof(unsigned char); + envPacketPayload.write(&bitset, sizeof(unsigned char)); if (hasReverb) { - memcpy(envDataAt, &reverbTime, sizeof(float)); - envDataAt += sizeof(float); - memcpy(envDataAt, &wetLevel, sizeof(float)); - envDataAt += sizeof(float); + envPacketPayload.write(&reverbTime, sizeof(float)); + envPacketPayload.write(&wetLevel, sizeof(float)); } - nodeList->writeDatagram(clientEnvBuffer, envDataAt - clientEnvBuffer, node); + nodeList->sendPacket(envPacket, node); } } From 12edec7beadb4f32683f47d74e0efa7b7e06d9f5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 6 Jul 2015 17:02:55 -0700 Subject: [PATCH 027/582] Packet class polishing --- libraries/networking/src/Packet.cpp | 78 ++++++++++++++++------------- libraries/networking/src/Packet.h | 48 +++++------------- 2 files changed, 54 insertions(+), 72 deletions(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index bbd001f8d8..bc5a38b0d8 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -1,6 +1,6 @@ // // Packet.cpp -// +// libraries/networking/src // // Created by Clement on 7/2/15. // Copyright 2015 High Fidelity, Inc. @@ -11,60 +11,66 @@ #include "Packet.h" -int64_t Packet::headerSize() { - return sizeof(Packet::Header); +#include "LimitedNodeList.h" + +int64_t Packet::headerSize(PacketType::Value type) { + int64_t size = numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion) + + ((SEQUENCE_NUMBERED_PACKETS.contains(type)) ? sizeof(SequenceNumber) : 0); + return size; } -int64_t Packet::maxPayloadSize() { - return MAX_PACKET_SIZE - Packet::headerSize(); +int64_t Packet::maxPayloadSize(PacketType::Value type) { + return MAX_PACKET_SIZE - headerSize(type); } std::unique_ptr Packet::create(PacketType::Value type, int64_t size) { + auto maxPayload = maxPayloadSize(type); if (size == -1) { - size = maxPayloadSize(); + // default size of -1, means biggest packet possible + size = maxPayload; } - if (size <= 0 || size > maxPayloadSize()) { + if (size <= 0 || size > maxPayload) { + // Invalid size, return null pointer return std::unique_ptr(); } + // allocate memory return std::unique_ptr(new Packet(type, size)); } -Packet::Packet(PacketType::Value type, int64_t size) { - _packetSize = headerSize() + size; - _packet = std::unique_ptr(new char(_packetSize)); - _payloadStart = _packet.get() + headerSize(); +Packet::Packet(PacketType::Value type, int64_t size) : + _packetSize(headerSize(type) + size), + _packet(new char(_packetSize)), + _payload(_packet.get() + headerSize(type), size) { + Q_ASSERT(size <= maxPayloadSize(type)); } -const Packet::Header& Packet::getHeader() const { - return *reinterpret_cast(_packet.get()); +PacketType::Value Packet::getPacketType() const { + return *reinterpret_cast(_packet.get()); } -Packet::Header& Packet::getHeader() { - return *reinterpret_cast(_packet.get()); +PacketVersion Packet::getPacketTypeVersion() const { + return *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(getPacketType())); } -char* Packet::getPayload() { - return _payloadStart; -} - - -int64_t NodeListPacket::headerSize() { - return sizeof(NodeListPacket::Header); -} - -int64_t NodeListPacket::maxPayloadSize() { - return Packet::maxPayloadSize() - NodeListPacket::headerSize(); -} - -std::unique_ptr NodeListPacket::create(PacketType::Value type, int64_t size) { - if (size > maxPayloadSize()) { - return std::unique_ptr(); +Packet::SequenceNumber Packet::getSequenceNumber() const { + PacketType::Value type{ getPacketType() }; + if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { + SequenceNumber seqNum = *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(type) + + sizeof(PacketVersion)); + + return seqNum & ~(1 << 15); // remove control bit } - - return std::unique_ptr(new NodeListPacket(type, size)); + return -1; } -NodeListPacket::NodeListPacket(PacketType::Value type, int64_t size) : Packet(type, headerSize() + size) { - -} \ No newline at end of file +bool Packet::isControlPacket() const { + PacketType::Value type{ getPacketType() }; + if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { + SequenceNumber seqNum = *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(type) + + sizeof(PacketVersion)); + + return seqNum & (1 << 15); // Only keep control bit + } + return false; +} diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 1fa634621c..49f1bb0a12 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -1,6 +1,6 @@ // // Packet.h -// +// libraries/networking/src // // Created by Clement on 7/2/15. // Copyright 2015 High Fidelity, Inc. @@ -14,30 +14,24 @@ #include -#include "LimitedNodeList.h" #include "PacketHeaders.h" +#include "PacketPayload.h" class Packet { public: - struct Header { - // Required - uint8_t _type; - uint8_t _version; - - // Optionnal - uint16_t _messageNumber; - // 1st bit is the data/control bit, rest is the sequence number - uint32_t _controlBitAndSequenceNumber; - }; - // TODO sanity check Header struct size + using SequenceNumber = uint16_t; - static int64_t headerSize(); - static int64_t maxPayloadSize(); + static int64_t headerSize(PacketType::Value type); + static int64_t maxPayloadSize(PacketType::Value type); static std::unique_ptr create(PacketType::Value type, int64_t size = -1); - virtual const Header& getHeader() const; - virtual char* getPayload(); + PacketType::Value getPacketType() const; + PacketVersion getPacketTypeVersion() const; + SequenceNumber getSequenceNumber() const; + bool isControlPacket() const; + + PacketPayload& payload() { return _payload; } protected: Packet(PacketType::Value type, int64_t size); @@ -46,29 +40,11 @@ protected: Packet& operator=(Packet&&) = delete; Packet& operator=(const Packet&) = delete; - Header& getHeader(); - private: int64_t _packetSize; std::unique_ptr _packet; - char* _payloadStart; -}; - -class NodeListPacket : public Packet { -public: - struct Header { - // Required - char _sourceUuid[NUM_BYTES_RFC4122_UUID]; - char _connectionUuid[NUM_BYTES_RFC4122_UUID]; - }; - static int64_t headerSize(); - static int64_t maxPayloadSize(); - - static std::unique_ptr create(PacketType::Value type, int64_t size = -1); - -protected: - NodeListPacket(PacketType::Value type, int64_t size); + PacketPayload _payload; }; #endif // hifi_Packet_h \ No newline at end of file From 3fa785c54562acc44bbda21d9dd4015edb8d909f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:03:26 -0700 Subject: [PATCH 028/582] fix domain check in packets for new API --- domain-server/src/DomainServer.cpp | 21 +++++++++++---------- libraries/networking/src/NodeList.cpp | 22 ++++++++++++---------- libraries/networking/src/PacketHeaders.cpp | 3 ++- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 35be97d610..d83c93c35c 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -573,33 +573,34 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock QDataStream packetStream(packet); packetStream.skipRawData(numBytesForPacketHeader(packet)); + QUuid connectUUID; + packetStream >> connectUUID; + parseNodeDataFromByteArray(packetStream, nodeType, publicSockAddr, localSockAddr, senderSockAddr); - QUuid packetUUID = uuidFromPacketHeader(packet); - // check if this connect request matches an assignment in the queue - bool isAssignment = _pendingAssignedNodes.contains(packetUUID); + bool isAssignment = _pendingAssignedNodes.contains(connectUUID); SharedAssignmentPointer matchingQueuedAssignment = SharedAssignmentPointer(); PendingAssignedNodeData* pendingAssigneeData = NULL; if (isAssignment) { - pendingAssigneeData = _pendingAssignedNodes.value(packetUUID); + pendingAssigneeData = _pendingAssignedNodes.value(connectUUID); if (pendingAssigneeData) { matchingQueuedAssignment = matchingQueuedAssignmentForCheckIn(pendingAssigneeData->getAssignmentUUID(), nodeType); if (matchingQueuedAssignment) { - qDebug() << "Assignment deployed with" << uuidStringWithoutCurlyBraces(packetUUID) + qDebug() << "Assignment deployed with" << uuidStringWithoutCurlyBraces(connectUUID) << "matches unfulfilled assignment" << uuidStringWithoutCurlyBraces(matchingQueuedAssignment->getUUID()); // remove this unique assignment deployment from the hash of pending assigned nodes // cleanup of the PendingAssignedNodeData happens below after the node has been added to the LimitedNodeList - _pendingAssignedNodes.remove(packetUUID); + _pendingAssignedNodes.remove(connectUUID); } else { // this is a node connecting to fulfill an assignment that doesn't exist // don't reply back to them so they cycle back and re-request an assignment - qDebug() << "No match for assignment deployed with" << uuidStringWithoutCurlyBraces(packetUUID); + qDebug() << "No match for assignment deployed with" << uuidStringWithoutCurlyBraces(connectUUID); return; } } @@ -638,18 +639,18 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock QUuid nodeUUID; HifiSockAddr discoveredSocket = senderSockAddr; - SharedNetworkPeer connectedPeer = _icePeers.value(packetUUID); + SharedNetworkPeer connectedPeer = _icePeers.value(connectUUID); if (connectedPeer) { // this user negotiated a connection with us via ICE, so re-use their ICE client ID - nodeUUID = packetUUID; + nodeUUID = connectUUID; if (connectedPeer->getActiveSocket()) { // set their discovered socket to whatever the activated socket on the network peer object was discoveredSocket = *connectedPeer->getActiveSocket(); } } else { - // we got a packetUUID we didn't recognize, just add the node + // we got a connectUUID we didn't recognize, just add the node with a new UUID nodeUUID = QUuid::createUuid(); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 11f04e188f..dd40927054 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -310,7 +310,7 @@ void NodeList::sendDomainServerCheckIn() { bool isUsingDTLS = false; PacketType::Value domainPacketType = !_domainHandler.isConnected() - ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest; + ? PacketType::DomainConnectRequest : PacketType::DomainListRequest; if (!_domainHandler.isConnected()) { qCDebug(networking) << "Sending connect request to domain-server at" << _domainHandler.getHostname(); @@ -329,24 +329,26 @@ void NodeList::sendDomainServerCheckIn() { } - // construct the DS check in packet - QUuid packetUUID = _sessionUUID; + auto domainPacket = NodeListPacket::create(domainPacketType); + QDataStream packetStream(&domainPacket->getPayload); + + if (domainPacketType == PacketType::DomainConnectRequest) { + QUuid connectUUID; - if (domainPacketType == PacketTypeDomainConnectRequest) { if (!_domainHandler.getAssignmentUUID().isNull()) { // this is a connect request and we're an assigned node // so set our packetUUID as the assignment UUID - packetUUID = _domainHandler.getAssignmentUUID(); + connectUUID = _domainHandler.getAssignmentUUID(); } else if (_domainHandler.requiresICE()) { // this is a connect request and we're an interface client // that used ice to discover the DS // so send our ICE client UUID with the connect request - packetUUID = _domainHandler.getICEClientID(); + connectUUID = _domainHandler.getICEClientID(); } - } - QByteArray domainServerPacket = byteArrayWithUUIDPopulatedHeader(domainPacketType, packetUUID); - QDataStream packetStream(&domainServerPacket, QIODevice::Append); + // pack the connect UUID for this connect request + packetStream << connectUUID; + } // pack our data to send to the domain-server packetStream << _ownerType << _publicSockAddr << _localSockAddr << _nodeTypesOfInterest.toList(); @@ -367,7 +369,7 @@ void NodeList::sendDomainServerCheckIn() { flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendDSCheckIn); if (!isUsingDTLS) { - writeUnverifiedDatagram(domainServerPacket, _domainHandler.getSockAddr()); + sendPacket(domainPacket, _domainHandler.getSockAddr()); } if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 83b424d44d..02097402c6 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -31,7 +31,8 @@ const QSet NON_VERIFIED_PACKETS = QSet() const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; -const QSet NON_SOURCED_PACKETS = QSet() << ICEPing << ICEPingReply; +const QSet NON_SOURCED_PACKETS = QSet() + << ICEPing << ICEPingReply << DomainConnectRequest; int arithmeticCodingValueFromBuffer(const char* checkValue) { if (((uchar) *checkValue) < 255) { From 02f97702d343f1159bc4579e275ecccbfeda602d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:08:12 -0700 Subject: [PATCH 029/582] switch path query packets to new networking API --- libraries/networking/src/NodeList.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index dd40927054..d8f48657d6 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -412,7 +412,7 @@ void NodeList::sendDSPathQuery(const QString& newPath) { // only send a path query if we know who our DS is or is going to be if (_domainHandler.isSocketKnown()) { // construct the path query packet - QByteArray pathQueryPacket = byteArrayWithPopulatedHeader(PacketTypeDomainServerPathQuery); + auto pathQueryPacket = NLPacket::create(PacketType::DomainServerPathQuery); // get the UTF8 representation of path query QByteArray pathQueryUTF8 = newPath.toUtf8(); @@ -420,18 +420,18 @@ void NodeList::sendDSPathQuery(const QString& newPath) { // get the size of the UTF8 representation of the desired path quint16 numPathBytes = pathQueryUTF8.size(); - if (pathQueryPacket.size() + numPathBytes + sizeof(numPathBytes) < MAX_PACKET_SIZE) { + if (numPathBytes + sizeof(numPathBytes) < pathQueryPacket.size() ) { // append the size of the path to the query packet - pathQueryPacket.append(reinterpret_cast(&numPathBytes), sizeof(numPathBytes)); + pathQueryPacket.write(&numPathBytes, sizeof(numPathBytes)); // append the path itself to the query packet - pathQueryPacket.append(pathQueryUTF8); + pathQueryPacket.write(pathQueryUTF8); qCDebug(networking) << "Sending a path query packet for path" << newPath << "to domain-server at" << _domainHandler.getSockAddr(); // send off the path query - writeUnverifiedDatagram(pathQueryPacket, _domainHandler.getSockAddr()); + sendPacket(pathQueryPacket, _domainHandler.getSockAddr()); } else { qCDebug(networking) << "Path" << newPath << "would make PacketTypeDomainServerPathQuery packet > MAX_PACKET_SIZE." << "Will not send query."; From f8e6344678899a15299c1b1c2b7d23749e1f4dab Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:10:55 -0700 Subject: [PATCH 030/582] have PacketList use Packet instead of PacketPayload --- libraries/networking/src/PacketList.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index bb61dd39d1..31b793cc76 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -47,18 +47,15 @@ qint64 writeData(const char* data, qint64 maxSize) { if (!_isOrdered) { auto newPacket = T::create(_packetType); - PacketPayload& newPayload = newPacket.getPayload(); if (_segmentStartIndex >= 0) { // We in the process of writing a segment for an unordered PacketList. // We need to try and pull the first part of the segment out to our new packet - PacketPayload& currentPayload = _currentPacket->getPayload(); - // check now to see if this is an unsupported write - int numBytesToEnd = currentPayload.size() - _segmentStartIndex; + int numBytesToEnd = _currentPacket.size() - _segmentStartIndex; - if ((newPayload.size() - numBytesToEnd) < maxSize) { + if ((newPacket.size() - numBytesToEnd) < maxSize) { // this is an unsupported case - the segment is bigger than the size of an individual packet // but the PacketList is not going to be sent ordered qDebug() << "Error in PacketList::writeData - attempted to write a segment to an unordered packet that is" @@ -67,20 +64,20 @@ qint64 writeData(const char* data, qint64 maxSize) { } // copy from currentPacket where the segment started to the beginning of the newPacket - newPayload.write(currentPacket.constData() + _segmentStartIndex, numBytesToEnd); + newPacket.write(currentPacket.constData() + _segmentStartIndex, numBytesToEnd); // the current segment now starts at the beginning of the new packet _segmentStartIndex = 0; // shrink the current payload to the actual size of the packet - currentPayload.setSizeUsed(_segmentStartIndex); + currentPacket.setSizeUsed(_segmentStartIndex); } // move the current packet to our list of packets _packets.insert(std::move(_currentPacket)); // write the data to the newPacket - newPayload.write(data, maxSize); + newPacket.write(data, maxSize); // set our current packet to the new packet _currentPacket = newPacket; @@ -90,9 +87,8 @@ qint64 writeData(const char* data, qint64 maxSize) { } else { // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover // into a new packet - PacketPayload& currentPayload = _currentPacket.getPayload(); - int numBytesToEnd = _currentPayload.size() - _currentPayload.pos(); + int numBytesToEnd = _currentPacket.size() - _currentPacket.sizeUsed(); _currentPacket.write(data, numBytesToEnd); // move the current packet to our list of packets From d87679f1151e3c9321d5fc3927c8f2f963cdc252 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 6 Jul 2015 17:13:03 -0700 Subject: [PATCH 031/582] Partially fill packet header on construction --- libraries/networking/src/Packet.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index bc5a38b0d8..765267faa9 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -42,7 +42,10 @@ Packet::Packet(PacketType::Value type, int64_t size) : _packetSize(headerSize(type) + size), _packet(new char(_packetSize)), _payload(_packet.get() + headerSize(type), size) { - Q_ASSERT(size <= maxPayloadSize(type)); + + Q_ASSERT(size <= maxPayloadSize(type)); + auto offset = packArithmeticallyCodedValue(type, _packet); + _packet[offset] = versionForPacketType(type); } PacketType::Value Packet::getPacketType() const { From 37fd954066b38c1da2a147bb34759a5fcc1037e5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:15:01 -0700 Subject: [PATCH 032/582] remove used of PacketPayload in AudioMixer --- assignment-client/src/audio/AudioMixer.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index a39cd4a7b3..fdb6c8618e 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -510,18 +510,17 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { if (sendData) { auto nodeList = DependencyManager::get(); auto envPacket = NLPacket::create(PacketType::AudioEnvironment); - auto envPacketPayload = envPacket->payload(); unsigned char bitset = 0; if (hasReverb) { setAtBit(bitset, HAS_REVERB_BIT); } - envPacketPayload.write(&bitset, sizeof(unsigned char)); + envPacket.write(&bitset, sizeof(unsigned char)); if (hasReverb) { - envPacketPayload.write(&reverbTime, sizeof(float)); - envPacketPayload.write(&wetLevel, sizeof(float)); + envPacket.write(&reverbTime, sizeof(float)); + envPacket.write(&wetLevel, sizeof(float)); } nodeList->sendPacket(envPacket, node); } @@ -801,25 +800,23 @@ void AudioMixer::run() { int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO; mixPacket = NodeListPacket::create(PacketType::MixedAudio); - PacketPayload mixPacketPayload = mixPacket->getPayload(); - // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - mixPacketPayload.write(&sequence, sizeof(quint16)); + mixPacket.write(&sequence, sizeof(quint16)); // pack mixed audio samples - mixPacketPayload.write(mixSamples, AudioConstants::NETWORK_FRAME_BYTES_STEREO); + mixPacket.write(mixSamples, AudioConstants::NETWORK_FRAME_BYTES_STEREO); } else { int silentPacketBytes = sizeof(quint16) + sizeof(quint16); mixPacket = NodeListPacket::create(PacketType::SilentAudioFrame); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - mixPacketPayload.write(&sequence, sizeof(quint16)); + mixPacket.write(&sequence, sizeof(quint16)); // pack number of silent audio samples quint16 numSilentSamples = AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; - mixPacketPayload.write(&numSilentSamples, sizeof(quint16)); + mixPacket.write(&numSilentSamples, sizeof(quint16)); } // Send audio environment From d64d49d00402ffb7b90dcd1a9a6b808247609a15 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:15:27 -0700 Subject: [PATCH 033/582] remove PacketByteArray from networking --- libraries/networking/src/PacketByteArray.cpp | 60 -------------------- 1 file changed, 60 deletions(-) delete mode 100644 libraries/networking/src/PacketByteArray.cpp diff --git a/libraries/networking/src/PacketByteArray.cpp b/libraries/networking/src/PacketByteArray.cpp deleted file mode 100644 index 4d456b9066..0000000000 --- a/libraries/networking/src/PacketByteArray.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// PacketPayload.cpp -// libraries/networking/src -// -// Created by Stephen Birarda on 07/06/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 "PacketPayload.h" - -PacketPayload::PacketPayload(char* data, int maxBytes) : - _data(data) - _maxBytes(maxBytes) -{ - -} - -int PacketPayload::append(const char* src, int srcBytes) { - // this is a call to write at the current index - int numWrittenBytes = write(src, srcBytes, _index); - - if (numWrittenBytes > 0) { - // we wrote some bytes, push the index - _index += numWrittenBytes; - return numWrittenBytes; - } else { - return numWrittenBytes; - } -} - -const int PACKET_WRITE_ERROR = -1; - -int PacketPayload::write(const char* src, int srcBytes, int index) { - if (index >= _maxBytes) { - // we were passed a bad index, return -1 - return PACKET_WRITE_ERROR; - } - - // make sure we have the space required to write this block - int bytesAvailable = _maxBytes - index; - - if (bytesAvailable < srcBytes) { - // good to go - write the data - memcpy(_data + index, src, srcBytes); - - // should this cause us to push our index (is this the farthest we've written in data)? - _index = std::max(_data + index + srcBytes, _index); - - // return the number of bytes written - return srcBytes; - } else { - // not enough space left for this write - return an error - return PACKET_WRITE_ERROR; - } -} - - From ea3f61a0c58b5c1394f9a214ed1b56cc1666227f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:17:40 -0700 Subject: [PATCH 034/582] remove use of payload in DomainServer --- domain-server/src/DomainServer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d83c93c35c..63e5f5b1eb 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -622,9 +622,8 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock QByteArray utfString = reason.toUtf8(); int payloadSize = utfString.size(); - auto connectionDeniedPacket = NodeListPacket::make(PacketType::DomainConnectionDenied, payloadSize); - - memcpy(connectionDeniedPacket.payload().data(), utfString.data(), utfString.size()); + auto connectionDeniedPacket = NLPacket::make(PacketType::DomainConnectionDenied, payloadSize); + connectionDeniedPacket.write(utfString); // tell client it has been refused. limitedNodeList->sendPacket(std::move(connectionDeniedPacket, senderSockAddr); From 269bea65fb3b8dd8135144585c2de614a8a433ac Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:20:08 -0700 Subject: [PATCH 035/582] fix AssignmentClientMonitor and AudioMixer to use NLPacket --- assignment-client/src/AssignmentClientMonitor.cpp | 4 ++-- assignment-client/src/audio/AudioMixer.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 97f91566e1..4c034721d1 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -195,7 +195,7 @@ void AssignmentClientMonitor::checkSpares() { SharedNodePointer childNode = nodeList->nodeWithUUID(aSpareId); childNode->activateLocalSocket(); - NodeListPacket diePacket = NodeListPacket::create(PacketType::StopNode); + auto diePacket { NLPacket::create(PacketType::StopNode); } nodeList->sendPacket(diePacket, childNode); } } @@ -230,7 +230,7 @@ void AssignmentClientMonitor::readPendingDatagrams() { // tell unknown assignment-client child to exit. qDebug() << "asking unknown child to exit."; - NodeListPacket diePacket = NodeListPacket::create(PacketType::StopNode); + auto diePacket { NL::create(PacketType::StopNode); } nodeList->sendPacket(diePacket, childNode); } } diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index fdb6c8618e..055294b9bf 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -785,7 +785,7 @@ void AudioMixer::run() { // if the stream should be muted, send mute packet if (nodeData->getAvatarAudioStream() && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { - auto mutePacket = NodeListPacket::create(PacketType::NoisyMute); + auto mutePacket { NLPacket::create(PacketType::NoisyMute); } nodeList->sendPacket(mutePacket, node); } @@ -794,11 +794,11 @@ void AudioMixer::run() { int streamsMixed = prepareMixForListeningNode(node.data()); - std::unique_ptr mixPacket; + std::unique_ptr mixPacket; if (streamsMixed > 0) { int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO; - mixPacket = NodeListPacket::create(PacketType::MixedAudio); + mixPacket = NLPacket::create(PacketType::MixedAudio); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); @@ -808,7 +808,7 @@ void AudioMixer::run() { mixPacket.write(mixSamples, AudioConstants::NETWORK_FRAME_BYTES_STEREO); } else { int silentPacketBytes = sizeof(quint16) + sizeof(quint16); - mixPacket = NodeListPacket::create(PacketType::SilentAudioFrame); + mixPacket = NLPacket::create(PacketType::SilentAudioFrame); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); From c0d1953df3bb1f45ea2571ab83852311b57b22de Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:21:02 -0700 Subject: [PATCH 036/582] use NLPacket in LimitedNodeList --- libraries/networking/src/LimitedNodeList.cpp | 28 ++++++++++---------- libraries/networking/src/LimitedNodeList.h | 10 +++---- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 4eaa61b5e3..a6ac2a10c2 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -521,7 +521,7 @@ unsigned LimitedNodeList::broadcastToNodes(const QByteArray& packet, const NodeS return n; } -NodeListPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { +NLPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { int packetSize = sizeof(PingType_t) + sizeof(quint64); NodeListPacket pingPacket = NodeListPacket::create(PacketType::Ping, packetSize); @@ -533,7 +533,7 @@ NodeListPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { return pingPacket; } -NodeListPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacket) { +NLPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacket) { QDataStream pingPacketStream(pingPacket); pingPacketStream.skipRawData(numBytesForPacketHeader(pingPacket)); @@ -542,41 +542,41 @@ NodeListPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pin quint64 timeFromOriginalPing; pingPacketStream >> timeFromOriginalPing; - + int packetSize = sizeof(PingType_t) + sizeof(quint64) + sizeof(quint64); - + NodeListPacket replyPacket = NodeListPacket::create(PacketType::Ping, packetSize); - + QDataStream packetStream(&replyPacket, QIODevice::Append); packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); return replyPacket; } -NodeListPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { +NLPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); - + NodeListPacket icePingPacket = NodeListPacket::create(PacketType::ICEPing, packetSize); - + icePingPacket.payload().replace(0, NUM_BYTES_RFC4122_UUID, iceID.toRfc4122().data()); memcpy(icePingPacket.payload() + NUM_BYTES_RFC4122_UUID, &pingType, sizeof(PingType_t)); - + return icePingPacket; } -NodeListPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { +NLPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { // pull out the ping type so we can reply back with that PingType_t pingType; - + memcpy(&pingType, pingPacket.data() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); - + int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); NodeListPacket icePingReplyPacket = NodeListPacket::create(PacketType::ICEPingReply, packetSize); - + // pack the ICE ID and then the ping type memcpy(icePingReplyPacket.payload(), iceID.toRfc4122().data(), NUM_BYTES_RFC4122_UUID); memcpy(icePingReplyPacket.payload() + NUM_BYTES_RFC4122_UUID, &pingType, sizeof(PingType_t)); - + return icePingReplyPacket; } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index b705b0e2ea..c72ce4ffd1 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -170,11 +170,11 @@ public: void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); void resetPacketStats(); - NodeListPacket&& constructPingPacket(PingType_t pingType = PingType::Agnostic); - NodeListPacket&& constructPingReplyPacket(const QByteArray& pingPacket); - - NodeListPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID); - NodeListPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID); + NLPacket&& constructPingPacket(PingType_t pingType = PingType::Agnostic); + NLPacket&& constructPingReplyPacket(const QByteArray& pingPacket); + + NLPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID); + NLPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID); virtual bool processSTUNResponse(const QByteArray& packet); From 453f8605c016e4d53840391883e2ab41be09b07c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:22:55 -0700 Subject: [PATCH 037/582] finish cleanup of NodeListPacket in LimitedNodeList --- libraries/networking/src/LimitedNodeList.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a6ac2a10c2..6cecf4e14a 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -523,7 +523,7 @@ unsigned LimitedNodeList::broadcastToNodes(const QByteArray& packet, const NodeS NLPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { int packetSize = sizeof(PingType_t) + sizeof(quint64); - NodeListPacket pingPacket = NodeListPacket::create(PacketType::Ping, packetSize); + auto pingPacket { NLPacket::create(PacketType::Ping, packetSize); } QDataStream packetStream(&pingPacket.payload(), QIODevice::Append); @@ -545,7 +545,7 @@ NLPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacke int packetSize = sizeof(PingType_t) + sizeof(quint64) + sizeof(quint64); - NodeListPacket replyPacket = NodeListPacket::create(PacketType::Ping, packetSize); + auto replyPacket { NLPacket::create(PacketType::Ping, packetSize); } QDataStream packetStream(&replyPacket, QIODevice::Append); packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); @@ -556,7 +556,7 @@ NLPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacke NLPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); - NodeListPacket icePingPacket = NodeListPacket::create(PacketType::ICEPing, packetSize); + auto icePingPacket { NLPacket::create(PacketType::ICEPing, packetSize); } icePingPacket.payload().replace(0, NUM_BYTES_RFC4122_UUID, iceID.toRfc4122().data()); memcpy(icePingPacket.payload() + NUM_BYTES_RFC4122_UUID, &pingType, sizeof(PingType_t)); @@ -571,7 +571,7 @@ NLPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid memcpy(&pingType, pingPacket.data() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); - NodeListPacket icePingReplyPacket = NodeListPacket::create(PacketType::ICEPingReply, packetSize); + auto icePingReplyPacket { NLPacket::create(PacketType::ICEPingReply, packetSize); } // pack the ICE ID and then the ping type memcpy(icePingReplyPacket.payload(), iceID.toRfc4122().data(), NUM_BYTES_RFC4122_UUID); From 76fb120f67855954d7cd03bd81180620bf15efbe Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:23:48 -0700 Subject: [PATCH 038/582] remove call to NodeListPacket in NodeList --- libraries/networking/src/NodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index d8f48657d6..dc21826f2c 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -329,7 +329,7 @@ void NodeList::sendDomainServerCheckIn() { } - auto domainPacket = NodeListPacket::create(domainPacketType); + auto domainPacket { NLPacket::create(domainPacketType); } QDataStream packetStream(&domainPacket->getPayload); if (domainPacketType == PacketType::DomainConnectRequest) { From 61c4e6d72e58bdc828f79c18031438cfe7d5b680 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:37:41 -0700 Subject: [PATCH 039/582] some network API reworking in AvatarMixer --- assignment-client/src/avatars/AvatarMixer.cpp | 223 +++++++++--------- 1 file changed, 107 insertions(+), 116 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 7ef9c42524..af9328cd12 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -30,7 +30,7 @@ const QString AVATAR_MIXER_LOGGING_NAME = "avatar-mixer"; -const int AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND = 60; +const int AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND = 60; const unsigned int AVATAR_DATA_SEND_INTERVAL_MSECS = (1.0f / (float) AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND) * 1000; AvatarMixer::AvatarMixer(const QByteArray& packet) : @@ -63,73 +63,70 @@ const float BILLBOARD_AND_IDENTITY_SEND_PROBABILITY = 1.0f / 300.0f; // 1) use the view frustum to cull those avatars that are out of view. Since avatar data doesn't need to be present // if the avatar is not in view or in the keyhole. void AvatarMixer::broadcastAvatarData() { - + int idleTime = QDateTime::currentMSecsSinceEpoch() - _lastFrameTimestamp; - + ++_numStatFrames; - + const float STRUGGLE_TRIGGER_SLEEP_PERCENTAGE_THRESHOLD = 0.10f; const float BACK_OFF_TRIGGER_SLEEP_PERCENTAGE_THRESHOLD = 0.20f; - + const float RATIO_BACK_OFF = 0.02f; - + const int TRAILING_AVERAGE_FRAMES = 100; int framesSinceCutoffEvent = TRAILING_AVERAGE_FRAMES; - + const float CURRENT_FRAME_RATIO = 1.0f / TRAILING_AVERAGE_FRAMES; const float PREVIOUS_FRAMES_RATIO = 1.0f - CURRENT_FRAME_RATIO; - + // NOTE: The following code calculates the _performanceThrottlingRatio based on how much the avatar-mixer was // able to sleep. This will eventually be used to ask for an additional avatar-mixer to help out. Currently the value // is unused as it is assumed this should not be hit before the avatar-mixer hits the desired bandwidth limit per client. // It is reported in the domain-server stats for the avatar-mixer. - + _trailingSleepRatio = (PREVIOUS_FRAMES_RATIO * _trailingSleepRatio) + (idleTime * CURRENT_FRAME_RATIO / (float) AVATAR_DATA_SEND_INTERVAL_MSECS); - + float lastCutoffRatio = _performanceThrottlingRatio; bool hasRatioChanged = false; - + if (framesSinceCutoffEvent >= TRAILING_AVERAGE_FRAMES) { if (_trailingSleepRatio <= STRUGGLE_TRIGGER_SLEEP_PERCENTAGE_THRESHOLD) { // we're struggling - change our performance throttling ratio _performanceThrottlingRatio = _performanceThrottlingRatio + (0.5f * (1.0f - _performanceThrottlingRatio)); - + qDebug() << "Mixer is struggling, sleeping" << _trailingSleepRatio * 100 << "% of frame time. Old cutoff was" << lastCutoffRatio << "and is now" << _performanceThrottlingRatio; hasRatioChanged = true; } else if (_trailingSleepRatio >= BACK_OFF_TRIGGER_SLEEP_PERCENTAGE_THRESHOLD && _performanceThrottlingRatio != 0) { // we've recovered and can back off the performance throttling _performanceThrottlingRatio = _performanceThrottlingRatio - RATIO_BACK_OFF; - + if (_performanceThrottlingRatio < 0) { _performanceThrottlingRatio = 0; } - + qDebug() << "Mixer is recovering, sleeping" << _trailingSleepRatio * 100 << "% of frame time. Old cutoff was" << lastCutoffRatio << "and is now" << _performanceThrottlingRatio; hasRatioChanged = true; } - + if (hasRatioChanged) { framesSinceCutoffEvent = 0; } } - + if (!hasRatioChanged) { ++framesSinceCutoffEvent; } - - static QByteArray mixedAvatarByteArray; - + auto nodeList = DependencyManager::get(); - int numPacketHeaderBytes = nodeList->populatePacketHeader(mixedAvatarByteArray, PacketTypeBulkAvatarData); - - // setup for distributed random floating point values + + // setup for distributed random floating point values std::random_device randomDevice; std::mt19937 generator(randomDevice()); std::uniform_real_distribution distribution; - + nodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { if (!node->getLinkedData()) { @@ -150,25 +147,22 @@ void AvatarMixer::broadcastAvatarData() { return; } ++_sumListeners; - - // reset packet pointers for this node - mixedAvatarByteArray.resize(numPacketHeaderBytes); AvatarData& avatar = nodeData->getAvatar(); glm::vec3 myPosition = avatar.getPosition(); // reset the internal state for correct random number distribution distribution.reset(); - + // reset the max distance for this frame float maxAvatarDistanceThisFrame = 0.0f; - + // reset the number of sent avatars nodeData->resetNumAvatarsSentLastFrame(); // keep a counter of the number of considered avatars int numOtherAvatars = 0; - + // keep track of outbound data rate specifically for avatar data int numAvatarDataBytes = 0; @@ -185,7 +179,7 @@ void AvatarMixer::broadcastAvatarData() { // bandwidth to this node. We do this once a second, which is also the window for // the bandwidth reported by node->getOutboundBandwidth(); if (nodeData->getNumFramesSinceFRDAdjustment() > AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND) { - + const float FRD_ADJUSTMENT_ACCEPTABLE_RATIO = 0.8f; const float HYSTERISIS_GAP = (1 - FRD_ADJUSTMENT_ACCEPTABLE_RATIO); const float HYSTERISIS_MIDDLE_PERCENTAGE = (1 - (HYSTERISIS_GAP * 0.5f)); @@ -195,22 +189,22 @@ void AvatarMixer::broadcastAvatarData() { if (avatarDataRateLastSecond > _maxKbpsPerNode) { - // is the FRD greater than the farthest avatar? + // is the FRD greater than the farthest avatar? // if so, before we calculate anything, set it to that distance currentFullRateDistance = std::min(currentFullRateDistance, nodeData->getMaxAvatarDistance()); // we're adjusting the full rate distance to target a bandwidth in the middle // of the hysterisis gap - currentFullRateDistance *= (_maxKbpsPerNode * HYSTERISIS_MIDDLE_PERCENTAGE) / avatarDataRateLastSecond; - + currentFullRateDistance *= (_maxKbpsPerNode * HYSTERISIS_MIDDLE_PERCENTAGE) / avatarDataRateLastSecond; + nodeData->setFullRateDistance(currentFullRateDistance); nodeData->resetNumFramesSinceFRDAdjustment(); - } else if (currentFullRateDistance < nodeData->getMaxAvatarDistance() + } else if (currentFullRateDistance < nodeData->getMaxAvatarDistance() && avatarDataRateLastSecond < _maxKbpsPerNode * FRD_ADJUSTMENT_ACCEPTABLE_RATIO) { - // we are constrained AND we've recovered to below the acceptable ratio + // we are constrained AND we've recovered to below the acceptable ratio // lets adjust the full rate distance to target a bandwidth in the middle of the hyterisis gap currentFullRateDistance *= (_maxKbpsPerNode * HYSTERISIS_MIDDLE_PERCENTAGE) / avatarDataRateLastSecond; - + nodeData->setFullRateDistance(currentFullRateDistance); nodeData->resetNumFramesSinceFRDAdjustment(); } @@ -218,6 +212,9 @@ void AvatarMixer::broadcastAvatarData() { nodeData->incrementNumFramesSinceFRDAdjustment(); } + // setup a PacketList for the avatarPackets + PacketList avatarPacketList(PacketType::AvatarData); + // this is an AGENT we have received head data from // send back a packet with other active node data to this node nodeList->eachMatchingNode( @@ -233,16 +230,16 @@ void AvatarMixer::broadcastAvatarData() { }, [&](const SharedNodePointer& otherNode) { ++numOtherAvatars; - + AvatarMixerClientData* otherNodeData = reinterpret_cast(otherNode->getLinkedData()); MutexTryLocker lock(otherNodeData->getMutex()); if (!lock.isLocked()) { return; } - + AvatarData& otherAvatar = otherNodeData->getAvatar(); // Decide whether to send this avatar's data based on it's distance from us - + // The full rate distance is the distance at which EVERY update will be sent for this avatar // at twice the full rate distance, there will be a 50% chance of sending this avatar's update glm::vec3 otherPosition = otherAvatar.getPosition(); @@ -251,24 +248,24 @@ void AvatarMixer::broadcastAvatarData() { // potentially update the max full rate distance for this frame maxAvatarDistanceThisFrame = std::max(maxAvatarDistanceThisFrame, distanceToAvatar); - if (distanceToAvatar != 0.0f + if (distanceToAvatar != 0.0f && distribution(generator) > (nodeData->getFullRateDistance() / distanceToAvatar)) { return; } PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); - PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketTypeAvatarData); + PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData); if (lastSeqToReceiver > lastSeqFromSender) { // Did we somehow get out of order packets from the sender? // We don't expect this to happen - in RELEASE we add this to a trackable stat // and in DEBUG we crash on the assert - + otherNodeData->incrementNumOutOfOrderSends(); assert(false); } - + // make sure we haven't already sent this data from this sender to this receiver // or that somehow we haven't sent if (lastSeqToReceiver == lastSeqFromSender && lastSeqToReceiver != 0) { @@ -277,76 +274,70 @@ void AvatarMixer::broadcastAvatarData() { } else if (lastSeqFromSender - lastSeqToReceiver > 1) { // this is a skip - we still send the packet but capture the presence of the skip so we see it happening ++numAvatarsWithSkippedFrames; - } - + } + // we're going to send this avatar - + // increment the number of avatars sent to this reciever nodeData->incrementNumAvatarsSentLastFrame(); - + // set the last sent sequence number for this sender on the receiver - nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(), - otherNode->getLastSequenceNumberForPacketType(PacketTypeAvatarData)); + nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(), + otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData)); - QByteArray avatarByteArray; - avatarByteArray.append(otherNode->getUUID().toRfc4122()); - avatarByteArray.append(otherAvatar.toByteArray()); - - if (avatarByteArray.size() + mixedAvatarByteArray.size() > MAX_PACKET_SIZE) { - nodeList->writeDatagram(mixedAvatarByteArray, node); + // start a new segment in the PacketList for this avatar + avatarPacketList.startSegment(); + + numAvatarDataBytes += avatarPacketList.write(otherNode->getUUID().toRfc4122()); + numAvatarDataBytes += avatarPacketList.write(otherAvatar.toByteArray()); + + avatarPacketList.endSegment(); - numAvatarDataBytes += mixedAvatarByteArray.size(); - - // reset the packet - mixedAvatarByteArray.resize(numPacketHeaderBytes); - } - - // copy the avatar into the mixedAvatarByteArray packet - mixedAvatarByteArray.append(avatarByteArray); - // if the receiving avatar has just connected make sure we send out the mesh and billboard // for this avatar (assuming they exist) bool forceSend = !nodeData->checkAndSetHasReceivedFirstPackets(); - + // we will also force a send of billboard or identity packet // if either has changed in the last frame - + if (otherNodeData->getBillboardChangeTimestamp() > 0 && (forceSend || otherNodeData->getBillboardChangeTimestamp() > _lastFrameTimestamp || randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) { - QByteArray billboardPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarBillboard); - billboardPacket.append(otherNode->getUUID().toRfc4122()); - billboardPacket.append(otherNodeData->getAvatar().getBillboard()); - nodeList->writeDatagram(billboardPacket, node); - + auto billboardPacket { NLPacket::create(PacketType::AvatarBillboard); } + billboardPacket.write(otherNode->getUUID().toRfc4122()); + billboardPacket.write(otherNodeData->getAvatar().getBillboard()); + + nodeList->sendPacket(billboardPacket, node); + ++_sumBillboardPackets; } - + if (otherNodeData->getIdentityChangeTimestamp() > 0 && (forceSend || otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp || randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) { - - QByteArray identityPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity); - + + auto identityPacket { NLPacket::create(PacketType::AvatarIdentity); } + QByteArray individualData = otherNodeData->getAvatar().identityByteArray(); individualData.replace(0, NUM_BYTES_RFC4122_UUID, otherNode->getUUID().toRfc4122()); - identityPacket.append(individualData); - - nodeList->writeDatagram(identityPacket, node); - + + identityPacket.write(individualData); + + nodeList->sendPacket(identityPacket, node); + ++_sumIdentityPackets; } }); - - // send the last packet - nodeList->writeDatagram(mixedAvatarByteArray, node); - + + // send the avatar data PacketList + nodeList->sendPacketList(avatarPacketList, node); + // record the bytes sent for other avatar data in the AvatarMixerClientData - nodeData->recordSentAvatarData(numAvatarDataBytes + mixedAvatarByteArray.size()); - + nodeData->recordSentAvatarData(numAvatarDataBytes); + // record the number of avatars held back this frame nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack); nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames); @@ -359,7 +350,7 @@ void AvatarMixer::broadcastAvatarData() { } } ); - + _lastFrameTimestamp = QDateTime::currentMSecsSinceEpoch(); } @@ -370,9 +361,9 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { // this was an avatar we were sending to other people // send a kill packet for it to our other nodes - QByteArray killPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeKillAvatar); - killPacket += killedNode->getUUID().toRfc4122(); - + auto killPacket { NLPacket::create(PacketType::KillAvatar); } + killPacket.write(killedNode->getUUID().toRfc4122()); + nodeList->broadcastToNodes(killPacket, NodeSet() << NodeType::Agent); // we also want to remove sequence number data for this avatar on our other avatars @@ -402,9 +393,9 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { void AvatarMixer::readPendingDatagrams() { QByteArray receivedPacket; HifiSockAddr senderSockAddr; - + auto nodeList = DependencyManager::get(); - + while (readAvailableDatagram(receivedPacket, senderSockAddr)) { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { switch (packetTypeForPacket(receivedPacket)) { @@ -413,14 +404,14 @@ void AvatarMixer::readPendingDatagrams() { break; } case PacketTypeAvatarIdentity: { - + // check if we have a matching node in our list SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); - + if (avatarNode && avatarNode->getLinkedData()) { AvatarMixerClientData* nodeData = reinterpret_cast(avatarNode->getLinkedData()); AvatarData& avatar = nodeData->getAvatar(); - + // parse the identity packet and update the change timestamp if appropriate if (avatar.hasIdentityChangedAfterParsing(receivedPacket)) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); @@ -430,20 +421,20 @@ void AvatarMixer::readPendingDatagrams() { break; } case PacketTypeAvatarBillboard: { - + // check if we have a matching node in our list SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); - + if (avatarNode && avatarNode->getLinkedData()) { AvatarMixerClientData* nodeData = static_cast(avatarNode->getLinkedData()); AvatarData& avatar = nodeData->getAvatar(); - + // parse the billboard packet and update the change timestamp if appropriate if (avatar.hasBillboardChangedAfterParsing(receivedPacket)) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); nodeData->setBillboardChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); } - + } break; } @@ -463,15 +454,15 @@ void AvatarMixer::readPendingDatagrams() { void AvatarMixer::sendStatsPacket() { QJsonObject statsObject; statsObject["average_listeners_last_second"] = (float) _sumListeners / (float) _numStatFrames; - + statsObject["average_billboard_packets_per_frame"] = (float) _sumBillboardPackets / (float) _numStatFrames; statsObject["average_identity_packets_per_frame"] = (float) _sumIdentityPackets / (float) _numStatFrames; - + statsObject["trailing_sleep_percentage"] = _trailingSleepRatio * 100; statsObject["performance_throttling_ratio"] = _performanceThrottlingRatio; QJsonObject avatarsObject; - + auto nodeList = DependencyManager::get(); // add stats for each listerner nodeList->eachNode([&](const SharedNodePointer& node) { @@ -482,7 +473,7 @@ void AvatarMixer::sendStatsPacket() { // add the key to ask the domain-server for a username replacement, if it has it avatarStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuidStringWithoutCurlyBraces(node->getUUID()); avatarStats[NODE_OUTBOUND_KBPS_STAT_KEY] = node->getOutboundBandwidth(); - + AvatarMixerClientData* clientData = static_cast(node->getLinkedData()); if (clientData) { MutexTryLocker lock(clientData->getMutex()); @@ -490,9 +481,9 @@ void AvatarMixer::sendStatsPacket() { clientData->loadJSONStats(avatarStats); // add the diff between the full outbound bandwidth and the measured bandwidth for AvatarData send only - avatarStats["delta_full_vs_avatar_data_kbps"] = + avatarStats["delta_full_vs_avatar_data_kbps"] = avatarStats[NODE_OUTBOUND_KBPS_STAT_KEY].toDouble() - avatarStats[OUTBOUND_AVATAR_DATA_STATS_KEY].toDouble(); - } + } } avatarsObject[uuidStringWithoutCurlyBraces(node->getUUID())] = avatarStats; @@ -500,7 +491,7 @@ void AvatarMixer::sendStatsPacket() { statsObject["avatars"] = avatarsObject; ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject); - + _sumListeners = 0; _sumBillboardPackets = 0; _sumIdentityPackets = 0; @@ -509,41 +500,41 @@ void AvatarMixer::sendStatsPacket() { void AvatarMixer::run() { ThreadedAssignment::commonInit(AVATAR_MIXER_LOGGING_NAME, NodeType::AvatarMixer); - + auto nodeList = DependencyManager::get(); nodeList->addNodeTypeToInterestSet(NodeType::Agent); - + nodeList->linkedDataCreateCallback = [] (Node* node) { node->setLinkedData(new AvatarMixerClientData()); }; - + // setup the timer that will be fired on the broadcast thread _broadcastTimer = new QTimer; _broadcastTimer->setInterval(AVATAR_DATA_SEND_INTERVAL_MSECS); _broadcastTimer->moveToThread(&_broadcastThread); - + // connect appropriate signals and slots connect(_broadcastTimer, &QTimer::timeout, this, &AvatarMixer::broadcastAvatarData, Qt::DirectConnection); connect(&_broadcastThread, SIGNAL(started()), _broadcastTimer, SLOT(start())); // wait until we have the domain-server settings, otherwise we bail DomainHandler& domainHandler = nodeList->getDomainHandler(); - + qDebug() << "Waiting for domain settings from domain-server."; - + // block until we get the settingsRequestComplete signal QEventLoop loop; connect(&domainHandler, &DomainHandler::settingsReceived, &loop, &QEventLoop::quit); connect(&domainHandler, &DomainHandler::settingsReceiveFail, &loop, &QEventLoop::quit); domainHandler.requestDomainSettings(); loop.exec(); - + if (domainHandler.getSettingsObject().isEmpty()) { qDebug() << "Failed to retreive settings object from domain-server. Bailing on assignment."; setFinished(true); return; } - + // parse the settings to pull out the values we need parseDomainServerSettings(domainHandler.getSettingsObject()); @@ -554,13 +545,13 @@ void AvatarMixer::run() { void AvatarMixer::parseDomainServerSettings(const QJsonObject& domainSettings) { const QString AVATAR_MIXER_SETTINGS_KEY = "avatar_mixer"; const QString NODE_SEND_BANDWIDTH_KEY = "max_node_send_bandwidth"; - + const float DEFAULT_NODE_SEND_BANDWIDTH = 1.0f; QJsonValue nodeBandwidthValue = domainSettings[AVATAR_MIXER_SETTINGS_KEY].toObject()[NODE_SEND_BANDWIDTH_KEY]; if (!nodeBandwidthValue.isDouble()) { qDebug() << NODE_SEND_BANDWIDTH_KEY << "is not a double - will continue with default value"; - } + } _maxKbpsPerNode = nodeBandwidthValue.toDouble(DEFAULT_NODE_SEND_BANDWIDTH) * KILO_PER_MEGA; - qDebug() << "The maximum send bandwidth per node is" << _maxKbpsPerNode << "kbps."; + qDebug() << "The maximum send bandwidth per node is" << _maxKbpsPerNode << "kbps."; } From ac6c8c9c3aab9460aa606499574523390467ad2b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:40:53 -0700 Subject: [PATCH 040/582] add stubs for new send methods in LNL --- libraries/networking/src/LimitedNodeList.cpp | 24 ++++++++++---------- libraries/networking/src/LimitedNodeList.h | 8 ++++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 6cecf4e14a..235427d705 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -508,18 +508,18 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t } } -unsigned LimitedNodeList::broadcastToNodes(const QByteArray& packet, const NodeSet& destinationNodeTypes) { - unsigned n = 0; - - eachNode([&](const SharedNodePointer& node){ - if (destinationNodeTypes.contains(node->getType())) { - writeDatagram(packet, node); - ++n; - } - }); - - return n; -} +// unsigned LimitedNodeList::broadcastToNodes(PacketList& packetList, const NodeSet& destinationNodeTypes) { + // unsigned n = 0; + // + // eachNode([&](const SharedNodePointer& node){ + // if (destinationNodeTypes.contains(node->getType())) { + // writeDatagram(packet, node); + // ++n; + // } + // }); + // + // return n; +// } NLPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { int packetSize = sizeof(PingType_t) + sizeof(quint64); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index c72ce4ffd1..92b03fd238 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -140,6 +140,12 @@ public: // // qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, // const HifiSockAddr& overridenSockAddr = HifiSockAddr()); +// + + qint64 sendPacket(NLPacket&& packet, const SharedNodePointer& destinationNode) {}; + qint64 sendPacket(NLPacket&& packet, const HifiSockAddr& sockAddr) {}; + qint64 sendPacketList(PacketList& packetList, const SharedNodePointer& destinationNode) {}; + qint64 sendPacketList(PacketList& packetList, const HifiSockAddr& sockAddr) {}; void (*linkedDataCreateCallback)(Node *); @@ -164,7 +170,7 @@ public: int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray& packet); int findNodeAndUpdateWithDataFromPacket(const QByteArray& packet); - unsigned broadcastToNodes(const QByteArray& packet, const NodeSet& destinationNodeTypes); + unsigned broadcastToNodes(PacketList& packetList, const NodeSet& destinationNodeTypes) {}; SharedNodePointer soloNodeOfType(char nodeType); void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); From 9a31b2224378c754dda60cca517d62a53ce1e824 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 17:48:21 -0700 Subject: [PATCH 041/582] use NLPacket and sendPacket for audio stream stats --- .../src/audio/AudioMixerClientData.cpp | 43 ++++++++----------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 6879da8c08..05dc54665f 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -111,7 +111,7 @@ void AudioMixerClientData::checkBuffersBeforeFrameSend() { QHash::ConstIterator i; for (i = _audioStreams.constBegin(); i != _audioStreams.constEnd(); i++) { PositionalAudioStream* stream = i.value(); - + if (stream->popFrames(1, true) > 0) { stream->updateLastPopOutputLoudnessAndTrailingLoudness(); } @@ -147,53 +147,46 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& // since audio stream stats packets are sent periodically, this is a good place to remove our dead injected streams. removeDeadInjectedStreams(); - char packet[MAX_PACKET_SIZE]; auto nodeList = DependencyManager::get(); - // The append flag is a boolean value that will be packed right after the header. The first packet sent + // The append flag is a boolean value that will be packed right after the header. The first packet sent // inside this method will have 0 for this flag, while every subsequent packet will have 1 for this flag. // The sole purpose of this flag is so the client can clear its map of injected audio stream stats when // it receives a packet with an appendFlag of 0. This prevents the buildup of dead audio stream stats in the client. quint8 appendFlag = 0; - // pack header - int numBytesPacketHeader = nodeList->populatePacketHeader(packet, PacketTypeAudioStreamStats); - char* headerEndAt = packet + numBytesPacketHeader; - - // calculate how many stream stat structs we can fit in each packet - const int numStreamStatsRoomFor = (MAX_PACKET_SIZE - numBytesPacketHeader - sizeof(quint8) - sizeof(quint16)) / sizeof(AudioStreamStats); - // pack and send stream stats packets until all audio streams' stats are sent int numStreamStatsRemaining = _audioStreams.size(); QHash::ConstIterator audioStreamsIterator = _audioStreams.constBegin(); while (numStreamStatsRemaining > 0) { - char* dataAt = headerEndAt; + auto statsPacket { NLPacket::create(PacketType::AudioStreamStats); } - // pack the append flag - memcpy(dataAt, &appendFlag, sizeof(quint8)); + // pack the append flag in this packet + statsPacket.write(&appendFlag, sizeof(quint8)); appendFlag = 1; - dataAt += sizeof(quint8); + + int numStreamStatsRoomFor = (statsPacket.size() - sizeof(quint8) - sizeof(quint16)) / sizeof(AudioStreamStats); // calculate and pack the number of stream stats to follow quint16 numStreamStatsToPack = std::min(numStreamStatsRemaining, numStreamStatsRoomFor); - memcpy(dataAt, &numStreamStatsToPack, sizeof(quint16)); - dataAt += sizeof(quint16); + statsPacket.write(&numStreamStatsToPack, sizeof(quint16)); // pack the calculated number of stream stats for (int i = 0; i < numStreamStatsToPack; i++) { PositionalAudioStream* stream = audioStreamsIterator.value(); + stream->perSecondCallbackForUpdatingStats(); + AudioStreamStats streamStats = stream->getAudioStreamStats(); - memcpy(dataAt, &streamStats, sizeof(AudioStreamStats)); - dataAt += sizeof(AudioStreamStats); + statsPacket.write(&streamStats, sizeof(AudioStreamStats)); audioStreamsIterator++; } numStreamStatsRemaining -= numStreamStatsToPack; // send the current packet - nodeList->writeDatagram(packet, dataAt - packet, destinationNode); + nodeList->sendPacket(statsPacket, destinationNode); } } @@ -220,7 +213,7 @@ QJsonObject AudioMixerClientData::getAudioStreamStats() const { result["downstream"] = downstreamStats; AvatarAudioStream* avatarAudioStream = getAvatarAudioStream(); - + if (avatarAudioStream) { QJsonObject upstreamStats; @@ -246,7 +239,7 @@ QJsonObject AudioMixerClientData::getAudioStreamStats() const { } else { result["upstream"] = "mic unknown"; } - + QHash::ConstIterator i; QJsonArray injectorArray; for (i = _audioStreams.constBegin(); i != _audioStreams.constEnd(); i++) { @@ -270,7 +263,7 @@ QJsonObject AudioMixerClientData::getAudioStreamStats() const { upstreamStats["min_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMin); upstreamStats["max_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMax); upstreamStats["avg_gap_30s"] = formatUsecTime(streamStats._timeGapWindowAverage); - + injectorArray.push_back(upstreamStats); } } @@ -304,7 +297,7 @@ void AudioMixerClientData::printAudioStreamStats(const AudioStreamStats& streamS streamStats._desiredJitterBufferFrames, streamStats._framesAvailableAverage, streamStats._framesAvailable); - + printf(" Ringbuffer stats | starves: %u, prev_starve_lasted: %u, frames_dropped: %u, overflows: %u\n", streamStats._starveCount, streamStats._consecutiveNotMixedCount, @@ -323,10 +316,10 @@ void AudioMixerClientData::printAudioStreamStats(const AudioStreamStats& streamS } -PerListenerSourcePairData* AudioMixerClientData::getListenerSourcePairData(const QUuid& sourceUUID) { +PerListenerSourcePairData* AudioMixerClientData::getListenerSourcePairData(const QUuid& sourceUUID) { if (!_listenerSourcePairData.contains(sourceUUID)) { PerListenerSourcePairData* newData = new PerListenerSourcePairData(); _listenerSourcePairData[sourceUUID] = newData; } - return _listenerSourcePairData[sourceUUID]; + return _listenerSourcePairData[sourceUUID]; } From e1c098233a044bd0ac665522764dd617431d8ff4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jul 2015 18:03:41 -0700 Subject: [PATCH 042/582] use sendUnreliablePacket for repeated send in AI --- libraries/audio/src/AudioInjector.cpp | 62 +++++++++++----------- libraries/networking/src/LimitedNodeList.h | 2 + 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 36b0345d34..96bca798e3 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -153,54 +153,56 @@ void AudioInjector::injectToMixer() { // make sure we actually have samples downloaded to inject if (_audioData.size()) { + auto audioPacket { NLPacket::create(PacketType::InjectAudio); } + // setup the packet for injected audio - QByteArray injectAudioPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeInjectAudio); - QDataStream packetStream(&injectAudioPacket, QIODevice::Append); + QDataStream audioPacketStream(&audioPacket); // pack some placeholder sequence number for now - int numPreSequenceNumberBytes = injectAudioPacket.size(); - packetStream << (quint16)0; + audioPacketStream << (quint16) 0; // pack stream identifier (a generated UUID) - packetStream << QUuid::createUuid(); + audioPacketStream << QUuid::createUuid(); // pack the stereo/mono type of the stream - packetStream << _options.stereo; + audioPacketStream << _options.stereo; // pack the flag for loopback uchar loopbackFlag = (uchar) true; - packetStream << loopbackFlag; + audioPacketStream << loopbackFlag; // pack the position for injected audio - int positionOptionOffset = injectAudioPacket.size(); - packetStream.writeRawData(reinterpret_cast(&_options.position), + int positionOptionOffset = audioPacket.pos(); + audioPacketStream.writeRawData(reinterpret_cast(&_options.position), sizeof(_options.position)); // pack our orientation for injected audio - int orientationOptionOffset = injectAudioPacket.size(); - packetStream.writeRawData(reinterpret_cast(&_options.orientation), + int orientationOptionOffset = audioPacket.pos(); + audioPacketStream.writeRawData(reinterpret_cast(&_options.orientation), sizeof(_options.orientation)); // pack zero for radius float radius = 0; - packetStream << radius; + audioPacketStream << radius; // pack 255 for attenuation byte - int volumeOptionOffset = injectAudioPacket.size(); + int volumeOptionOffset = audioPacket.pos(); quint8 volume = MAX_INJECTOR_VOLUME * _options.volume; - packetStream << volume; + audioPacketStream << volume; - packetStream << _options.ignorePenumbra; + audioPacketStream << _options.ignorePenumbra; + + int audioDataOffset = audioPacket.pos(); QElapsedTimer timer; timer.start(); int nextFrame = 0; - int numPreAudioDataBytes = injectAudioPacket.size(); bool shouldLoop = _options.loop; // loop to send off our audio in NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL byte chunks quint16 outgoingInjectedAudioSequenceNumber = 0; + while (_currentSendPosition < _audioData.size() && !_shouldStop) { int bytesToCopy = std::min(((_options.stereo) ? 2 : 1) * AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL, @@ -214,31 +216,29 @@ void AudioInjector::injectToMixer() { } _loudness /= (float)(bytesToCopy / sizeof(int16_t)); - memcpy(injectAudioPacket.data() + positionOptionOffset, - &_options.position, - sizeof(_options.position)); - memcpy(injectAudioPacket.data() + orientationOptionOffset, - &_options.orientation, - sizeof(_options.orientation)); - volume = MAX_INJECTOR_VOLUME * _options.volume; - memcpy(injectAudioPacket.data() + volumeOptionOffset, &volume, sizeof(volume)); + audioPacket.seek(positionOptionOffset); + audioPacket.write(&_options.position, sizeof(_options.position)); - // resize the QByteArray to the right size - injectAudioPacket.resize(numPreAudioDataBytes + bytesToCopy); + audioPacket.seek(orientationOptionOffset); + audioPacket.write(&_options.orientation, sizeof(_options.orientation)); + + volume = MAX_INJECTOR_VOLUME * _options.volume; + audioPacket.seek(volumeOptionOffset); + audioPacket.write(&volume, sizeof(volume)); + + audioPacket.seek(audioDataOffset); // pack the sequence number - memcpy(injectAudioPacket.data() + numPreSequenceNumberBytes, - &outgoingInjectedAudioSequenceNumber, sizeof(quint16)); + audioPacket.write(&outgoingInjectedAudioSequenceNumber, sizeof(quint16)); // copy the next NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL bytes to the packet - memcpy(injectAudioPacket.data() + numPreAudioDataBytes, - _audioData.data() + _currentSendPosition, bytesToCopy); + audioPacket.write(_audioData.data() + _currentSendPosition, bytesToCopy); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); // send off this audio packet - nodeList->writeDatagram(injectAudioPacket, audioMixer); + nodeList->sendUnreliablePacket(audioPacket, audioMixer); outgoingInjectedAudioSequenceNumber++; _currentSendPosition += bytesToCopy; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 92b03fd238..686beebe60 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -142,6 +142,8 @@ public: // const HifiSockAddr& overridenSockAddr = HifiSockAddr()); // + qint64 sendUnreliablePacket(NLPacket& packet, const SharedNodePointer& destinationNode) {}; + qint64 sendUnreliablePacket(NLPacket& packet, const HifiSockAddr& sockAddr) {}; qint64 sendPacket(NLPacket&& packet, const SharedNodePointer& destinationNode) {}; qint64 sendPacket(NLPacket&& packet, const HifiSockAddr& sockAddr) {}; qint64 sendPacketList(PacketList& packetList, const SharedNodePointer& destinationNode) {}; From 91496d37c78af9f1fffa28bc89a80340404785df Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 10:31:54 -0700 Subject: [PATCH 043/582] Move NLPacket to its own file --- libraries/networking/src/NLPacket.cpp | 48 +++++++++++++++++++++++++++ libraries/networking/src/NLPacket.h | 32 ++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 libraries/networking/src/NLPacket.cpp create mode 100644 libraries/networking/src/NLPacket.h diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp new file mode 100644 index 0000000000..df91b4fdbe --- /dev/null +++ b/libraries/networking/src/NLPacket.cpp @@ -0,0 +1,48 @@ +// +// NLPacket.cpp +// libraries/networking/src +// +// Created by Clement on 7/6/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 "NLPacket.h" + +int64_t NLPacket::headerSize(PacketType::Value type) { + int64_t size = ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID) + + ((NON_VERIFIED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID); + return size; +} + +int64_t NLPacket::maxPayloadSize(PacketType::Value type) { + return Packet::maxPayloadSize(type) - headerSize(type); +} + +std::unique_ptr NLPacket::create(PacketType::Value type, int64_t size) { + if (size > maxPayloadSize(type)) { + return std::unique_ptr(); + } + + return std::unique_ptr(new NLPacket(type, size)); +} + +NLPacket::NLPacket(PacketType::Value type, int64_t size) : Packet(type, headerSize(type) + size) { +} + +void NLPacket::setSourceUuid(QUuid sourceUuid) { + auto type = getPacketType(); + Q_ASSERT(!NON_SOURCED_PACKETS.contains(type)); + auto offset = Packet::headerSize(type) + NLPacket::headerSize(type); + memcpy(_packet.get() + offset, sourceUuid.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); +} + +void NLPacket::setConnectionUuid(QUuid connectionUuid) { + auto type = getPacketType(); + Q_ASSERT(!NON_VERIFIED_PACKETS.contains(type)); + auto offset = Packet::headerSize(type) + NLPacket::headerSize(type) + + ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID); + memcpy(_packet.get() + offset, connectionUuid.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); +} \ No newline at end of file diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h new file mode 100644 index 0000000000..b1ceee9e83 --- /dev/null +++ b/libraries/networking/src/NLPacket.h @@ -0,0 +1,32 @@ +// +// NLPacket.h +// libraries/networking/src +// +// Created by Clement on 7/6/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_NLPacket_h +#define hifi_NLPacket_h + +#include "Packet.h" + +class NLPacket : public Packet { +public: + static int64_t headerSize(PacketType::Value type); + static int64_t maxPayloadSize(PacketType::Value type); + + static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + +protected: + NLPacket(PacketType::Value type, int64_t size); + + void setSourceUuid(QUuid sourceUuid); + void setConnectionUuid(QUuid connectionUuid); + +}; + +#endif // hifi_NLPacket_h \ No newline at end of file From 8e5b040627c46dc1bb671a487caf21ecfbe1e945 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 10:32:31 -0700 Subject: [PATCH 044/582] Packet setters --- libraries/networking/src/Packet.cpp | 39 +++++++++++++++++++++++------ libraries/networking/src/Packet.h | 4 ++- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 765267faa9..05291f719f 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -43,9 +43,16 @@ Packet::Packet(PacketType::Value type, int64_t size) : _packet(new char(_packetSize)), _payload(_packet.get() + headerSize(type), size) { + // Sanity check Q_ASSERT(size <= maxPayloadSize(type)); - auto offset = packArithmeticallyCodedValue(type, _packet); - _packet[offset] = versionForPacketType(type); + + // copy packet type and version in header + setPacketTypeAndVersion(type); + + // Set control bit and sequence number to 0 if necessary + if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { + setSequenceNumber(0); + } } PacketType::Value Packet::getPacketType() const { @@ -59,21 +66,39 @@ PacketVersion Packet::getPacketTypeVersion() const { Packet::SequenceNumber Packet::getSequenceNumber() const { PacketType::Value type{ getPacketType() }; if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { - SequenceNumber seqNum = *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(type) + + SequenceNumber seqNum = *reinterpret_cast(_packet.get() + + numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion)); - return seqNum & ~(1 << 15); // remove control bit } return -1; } bool Packet::isControlPacket() const { - PacketType::Value type{ getPacketType() }; + auto type = getPacketType(); if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { - SequenceNumber seqNum = *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(type) + + SequenceNumber seqNum = *reinterpret_cast(_packet.get() + + numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion)); - return seqNum & (1 << 15); // Only keep control bit } return false; } + +void Packet::setPacketTypeAndVersion(PacketType::Value type) { + // Pack the packet type + auto offset = packArithmeticallyCodedValue(type, _packet.get()); + + // Pack the packet version + auto version { versionForPacketType(type) }; + memcpy(_packet.get() + offset, &version, sizeof(version)); +} + +void Packet::setSequenceNumber(SequenceNumber seqNum) { + auto type = getPacketType(); + // Here we are overriding the control bit to 0. + // But that is not an issue since we should only ever set the seqNum + // for data packets going out + memcpy(_packet.get() + numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion), + &seqNum, sizeof(seqNum)); +} diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 49f1bb0a12..dd275aeb15 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -40,7 +40,9 @@ protected: Packet& operator=(Packet&&) = delete; Packet& operator=(const Packet&) = delete; -private: + void setPacketTypeAndVersion(PacketType::Value type); + void setSequenceNumber(SequenceNumber seqNum); + int64_t _packetSize; std::unique_ptr _packet; From c23e3c0ec2f521e262bb7cfbd4cf10c373afd453 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 10:35:11 -0700 Subject: [PATCH 045/582] Change Packet.h header to NLPacket --- libraries/networking/src/LimitedNodeList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index b1905fd593..40d43ec02f 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -36,7 +36,7 @@ #include "DomainHandler.h" #include "Node.h" -#include "Packet.h" +#include "NLPacket.h" #include "PacketHeaders.h" #include "UUIDHasher.h" From a07a24788d4118336e273fda13a9ddb63ce299bf Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 10:36:15 -0700 Subject: [PATCH 046/582] Cast type to int before arithmetique packing --- libraries/networking/src/Packet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 05291f719f..717a79f2ff 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -87,7 +87,7 @@ bool Packet::isControlPacket() const { void Packet::setPacketTypeAndVersion(PacketType::Value type) { // Pack the packet type - auto offset = packArithmeticallyCodedValue(type, _packet.get()); + auto offset = packArithmeticallyCodedValue((int)type, _packet.get()); // Pack the packet version auto version { versionForPacketType(type) }; From edf7a96b58af0b1965103ffa274df9e7a3e0c714 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 10:53:55 -0700 Subject: [PATCH 047/582] update audio client packet send to NLPacket --- libraries/audio-client/src/AudioClient.cpp | 70 ++++++++++------------ libraries/audio-client/src/AudioClient.h | 2 + libraries/networking/src/NodeList.cpp | 1 + 3 files changed, 33 insertions(+), 40 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 60020f3618..b058d8b79b 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -724,20 +724,18 @@ void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { } void AudioClient::handleAudioInput() { - static char audioDataPacket[MAX_PACKET_SIZE]; - - static int numBytesPacketHeader = numBytesForPacketHeaderGivenPacketType(PacketTypeMicrophoneAudioNoEcho); - - // NOTE: we assume PacketTypeMicrophoneAudioWithEcho has same size headers as - // PacketTypeMicrophoneAudioNoEcho. If not, then networkAudioSamples will be pointing to the wrong place for writing - // audio samples with echo. - static int leadingBytes = numBytesPacketHeader + sizeof(quint16) + sizeof(glm::vec3) + sizeof(glm::quat) + sizeof(quint8); - static int16_t* networkAudioSamples = (int16_t*)(audioDataPacket + leadingBytes); + if (!_audioPacket) { + // we don't have an audioPacket yet - set that up now + _audioPacket = NLPacket::create(PacketType::MicrophoneAudioNoEcho); + } float inputToNetworkInputRatio = calculateDeviceToNetworkInputRatio(); int inputSamplesRequired = (int)((float)AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * inputToNetworkInputRatio); + static int leadingBytes = sizeof(quint16) + sizeof(glm::vec3) + sizeof(glm::quat) + sizeof(quint8); + int16_t* networkAudioSamples = (int16_t*)(_audioPacket->payload() + leadingBytes); + QByteArray inputByteArray = _inputDevice->readAll(); // Add audio source injection if enabled @@ -769,7 +767,7 @@ void AudioClient::handleAudioInput() { while (_inputRingBuffer.samplesAvailable() >= inputSamplesRequired) { const int numNetworkBytes = _isStereoInput - ? AudioConstants::NETWORK_FRAME_BYTES_STEREO + ? AudioConstants::NETWORK_FRAME_BYTES_STEREO` : AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL; const int numNetworkSamples = _isStereoInput ? AudioConstants::NETWORK_FRAME_SAMPLES_STEREO @@ -846,57 +844,49 @@ void AudioClient::handleAudioInput() { PacketType::Value packetType; if (_lastInputLoudness == 0) { - packetType = PacketTypeSilentAudioFrame; + _audioPacket->setType(PacketType::SilentAudioFrame); } else { if (_shouldEchoToServer) { - packetType = PacketTypeMicrophoneAudioWithEcho; + _audioPacket->setType(PacketType::MicrophoneAudioWithEcho); } else { - packetType = PacketTypeMicrophoneAudioNoEcho; + _audioPacket->setType(PacketType::MicrophoneAudioNoEcho); } } - char* currentPacketPtr = audioDataPacket + nodeList->populatePacketHeader(audioDataPacket, packetType); + // seek to the beginning of the audio packet payload + _audioPacket->seek(0); - // pack sequence number - memcpy(currentPacketPtr, &_outgoingAvatarAudioSequenceNumber, sizeof(quint16)); - currentPacketPtr += sizeof(quint16); + // reset the size used in this packet so it will be correct once we are done writing + _audioPacket->setSizeUsed(0); - if (packetType == PacketTypeSilentAudioFrame) { + // write sequence number + _audioPacket->write(&_outgoingAvatarAudioSequenceNumber, sizeof(quint16)); + + if (packetType == PacketType::SilentAudioFrame) { // pack num silent samples - quint16 numSilentSamples = numNetworkSamples; - memcpy(currentPacketPtr, &numSilentSamples, sizeof(quint16)); - currentPacketPtr += sizeof(quint16); - - // memcpy the three float positions - memcpy(currentPacketPtr, &headPosition, sizeof(headPosition)); - currentPacketPtr += (sizeof(headPosition)); - - // memcpy our orientation - memcpy(currentPacketPtr, &headOrientation, sizeof(headOrientation)); - currentPacketPtr += sizeof(headOrientation); - + _audioPacket->write(&numSilentSamples, sizeof(quint16)); } else { // set the mono/stereo byte - *currentPacketPtr++ = isStereo; + _audioPacket->write(&isStereo, sizeof(isStereo)); + } - // memcpy the three float positions - memcpy(currentPacketPtr, &headPosition, sizeof(headPosition)); - currentPacketPtr += (sizeof(headPosition)); + // pack the three float positions + _audioPacket->write(&headPosition, sizeof(headPosition)); - // memcpy our orientation - memcpy(currentPacketPtr, &headOrientation, sizeof(headOrientation)); - currentPacketPtr += sizeof(headOrientation); + // pack the orientation + _audioPacket->write(&headOrientation, sizeof(headOrientation)); + if (packetType != PacketType::SilentAudioFrame) { // audio samples have already been packed (written to networkAudioSamples) - currentPacketPtr += numNetworkBytes; + _audioPacket->setSizeUsed(_audioPacket->getSizeUsed() + numNetworkBytes); } _stats.sentPacket(); nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendAudioPacket); - int packetBytes = currentPacketPtr - audioDataPacket; - nodeList->writeDatagram(audioDataPacket, packetBytes, audioMixer); + nodeList->sendUnreliablePacket(_audioPacket, audioMixer); + _outgoingAvatarAudioSequenceNumber++; } } diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index aeea7c07c1..484e3a14e8 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -308,6 +308,8 @@ private: void checkDevices(); bool _hasReceivedFirstPacket = false; + + std::unique_ptr _audioPacket; }; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index dc21826f2c..9da78095a7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -552,6 +552,7 @@ int NodeList::processDomainServerList(const QByteArray& packet) { packetStream >> newUUID; setSessionUUID(newUUID); + // TODO: when fixing this read these are actually chars now, not bools bool thisNodeCanAdjustLocks; packetStream >> thisNodeCanAdjustLocks; setThisNodeCanAdjustLocks(thisNodeCanAdjustLocks); From e05470a11c2796840923458e4d3e94fce68c73c8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 11:11:20 -0700 Subject: [PATCH 048/582] change to new packet sending in Application --- interface/src/Application.cpp | 98 +++++++++++++++-------------------- 1 file changed, 43 insertions(+), 55 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2a5a5a3817..06aa5cd36d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -378,7 +378,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _runningScriptsWidget = new RunningScriptsWidget(_window); _renderEngine->addTask(render::TaskPointer(new RenderDeferredTask())); _renderEngine->registerScene(_main3DScene); - + // start the nodeThread so its event loop is running QThread* nodeThread = new QThread(this); nodeThread->setObjectName("Datagram Processor Thread"); @@ -537,7 +537,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // the GL surface _glWidget->setCursor(Qt::BlankCursor); #endif - + // enable mouse tracking; otherwise, we only get drag events _glWidget->setMouseTracking(true); @@ -606,7 +606,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _settingsTimer.setSingleShot(false); _settingsTimer.setInterval(SAVE_SETTINGS_INTERVAL); _settingsThread.start(); - + if (Menu::getInstance()->isOptionChecked(MenuOption::IndependentMode)) { Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, true); cameraMenuChanged(); @@ -637,7 +637,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : ddeTracker->init(); connect(ddeTracker.data(), &FaceTracker::muteToggled, this, &Application::faceTrackerMuteToggled); #endif - + auto applicationUpdater = DependencyManager::get(); connect(applicationUpdater.data(), &AutoUpdater::newVersionIsAvailable, dialogsManager.data(), &DialogsManager::showUpdateDialog); applicationUpdater->checkForUpdate(); @@ -879,7 +879,7 @@ void Application::paintGL() { OculusManager::beginFrameTiming(); } - + PerformanceWarning::setSuppressShortTimings(Menu::getInstance()->isOptionChecked(MenuOption::SuppressShortTimings)); bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::paintGL()"); @@ -897,7 +897,7 @@ void Application::paintGL() { } glEnable(GL_LINE_SMOOTH); - + if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON || _myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, _myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN); Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, !(_myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN)); @@ -982,7 +982,7 @@ void Application::paintGL() { renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - renderRearViewMirror(&renderArgs, _mirrorViewRect); + renderRearViewMirror(&renderArgs, _mirrorViewRect); } renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; @@ -1756,9 +1756,9 @@ bool Application::acceptSnapshot(const QString& urlString) { } void Application::sendPingPackets() { - + auto nodeList = DependencyManager::get(); - + nodeList->eachMatchingNode([](const SharedNodePointer& node)->bool { switch (node->getType()) { case NodeType::AvatarMixer: @@ -1855,7 +1855,7 @@ void Application::idle() { // After finishing all of the above work, ensure the idle timer is set to the proper interval, // depending on whether we're throttling or not idleTimer->start(_glWidget->isThrottleRendering() ? THROTTLED_IDLE_TIMER_DELAY : 0); - } + } // check for any requested background downloads. emit checkBackgroundDownloads(); @@ -2661,7 +2661,8 @@ int Application::sendNackPackets() { } int packetsSent = 0; - char packet[MAX_PACKET_SIZE]; + + auto nackPacket { NLPacket::create(PacketType::OctreeDataNack); } // iterates thru all nodes in NodeList auto nodeList = DependencyManager::get(); @@ -2698,33 +2699,26 @@ int Application::sendNackPackets() { QSet::const_iterator missingSequenceNumbersIterator = missingSequenceNumbers.constBegin(); while (numSequenceNumbersAvailable > 0) { - char* dataAt = packet; - int bytesRemaining = MAX_PACKET_SIZE; - - // pack header - int numBytesPacketHeader = nodeList->populatePacketHeader(packet, PacketTypeOctreeDataNack); - dataAt += numBytesPacketHeader; - bytesRemaining -= numBytesPacketHeader; + // reset the position we are writing at and the size we have used + nackPacket->seek(0); + nackPacket->setSizeUsed(0); // calculate and pack the number of sequence numbers - int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(OCTREE_PACKET_SEQUENCE); + int numSequenceNumbersRoomFor = (nackPacket->size() - sizeof(uint16_t)) / sizeof(OCTREE_PACKET_SEQUENCE); uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor); - uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt; - *numSequenceNumbersAt = numSequenceNumbers; - dataAt += sizeof(uint16_t); + + nackPacket->write(&numSequenceNumbers, sizeof(numSequenceNumbers)); // pack sequence numbers for (int i = 0; i < numSequenceNumbers; i++) { - OCTREE_PACKET_SEQUENCE* sequenceNumberAt = (OCTREE_PACKET_SEQUENCE*)dataAt; - *sequenceNumberAt = *missingSequenceNumbersIterator; - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - + OCTREE_PACKET_SEQUENCE missingNumber = *missingSequenceNumbersIterator; + nackPacket->write(&missingNumber, sizeof(OCTREE_PACKET_SEQUENCE)); missingSequenceNumbersIterator++; } numSequenceNumbersAvailable -= numSequenceNumbers; - // send it - nodeList->writeUnverifiedDatagram(packet, dataAt - packet, node); + // send the packet + nodeList->sendUnreliablePacket(packet, node); packetsSent++; } } @@ -2756,9 +2750,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale()); _octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust()); - unsigned char queryPacket[MAX_PACKET_SIZE]; - - // Iterate all of the nodes, and get a count of how many voxel servers we have... + // Iterate all of the nodes, and get a count of how many octree servers we have... int totalServers = 0; int inViewServers = 0; int unknownJurisdictionServers = 0; @@ -2825,6 +2817,8 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp qCDebug(interfaceapp, "perServerPPS: %d perUnknownServer: %d", perServerPPS, perUnknownServer); } + auto queryPacket { NLPacket::create(packetType); } + nodeList->eachNode([&](const SharedNodePointer& node){ // only send to the NodeTypes that are serverType if (node->getActiveSocket() && node->getType() == serverType) { @@ -2899,19 +2893,13 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp } else { _octreeQuery.setMaxQueryPacketsPerSecond(0); } - // set up the packet for sending... - unsigned char* endOfQueryPacket = queryPacket; - // insert packet type/version and node UUID - endOfQueryPacket += nodeList->populatePacketHeader(reinterpret_cast(endOfQueryPacket), packetType); - - // encode the query data... - endOfQueryPacket += _octreeQuery.getBroadcastData(endOfQueryPacket); - - int packetLength = endOfQueryPacket - queryPacket; + // encode the query data + int packetSize = _octreeQuery.getBroadcastData(queryPacket.payload()); + queryPacket.setSizeUsed(packetSize); // make sure we still have an active socket - nodeList->writeUnverifiedDatagram(reinterpret_cast(queryPacket), packetLength, node); + nodeList->sendUnreliablePacket(queryPacket, node); } }); } @@ -3310,7 +3298,7 @@ namespace render { const float APPROXIMATE_DISTANCE_FROM_HORIZON = 0.1f; const float DOUBLE_APPROXIMATE_DISTANCE_FROM_HORIZON = 0.2f; - glm::vec3 sunDirection = (args->_viewFrustum->getPosition()/*getAvatarPosition()*/ - closestData.getSunLocation()) + glm::vec3 sunDirection = (args->_viewFrustum->getPosition()/*getAvatarPosition()*/ - closestData.getSunLocation()) / closestData.getAtmosphereOuterRadius(); float height = glm::distance(args->_viewFrustum->getPosition()/*theCamera.getPosition()*/, closestData.getAtmosphereCenter()); if (height < closestData.getAtmosphereInnerRadius()) { @@ -3318,20 +3306,20 @@ namespace render { alpha = 0.0f; if (sunDirection.y > -APPROXIMATE_DISTANCE_FROM_HORIZON) { - float directionY = glm::clamp(sunDirection.y, - -APPROXIMATE_DISTANCE_FROM_HORIZON, APPROXIMATE_DISTANCE_FROM_HORIZON) + float directionY = glm::clamp(sunDirection.y, + -APPROXIMATE_DISTANCE_FROM_HORIZON, APPROXIMATE_DISTANCE_FROM_HORIZON) + APPROXIMATE_DISTANCE_FROM_HORIZON; alpha = (directionY / DOUBLE_APPROXIMATE_DISTANCE_FROM_HORIZON); } - + } else if (height < closestData.getAtmosphereOuterRadius()) { alpha = (height - closestData.getAtmosphereInnerRadius()) / (closestData.getAtmosphereOuterRadius() - closestData.getAtmosphereInnerRadius()); if (sunDirection.y > -APPROXIMATE_DISTANCE_FROM_HORIZON) { - float directionY = glm::clamp(sunDirection.y, - -APPROXIMATE_DISTANCE_FROM_HORIZON, APPROXIMATE_DISTANCE_FROM_HORIZON) + float directionY = glm::clamp(sunDirection.y, + -APPROXIMATE_DISTANCE_FROM_HORIZON, APPROXIMATE_DISTANCE_FROM_HORIZON) + APPROXIMATE_DISTANCE_FROM_HORIZON; alpha = (directionY / DOUBLE_APPROXIMATE_DISTANCE_FROM_HORIZON); } @@ -3358,7 +3346,7 @@ namespace render { } } else if (skyStage->getBackgroundMode() == model::SunSkyStage::SKY_BOX) { PerformanceTimer perfTimer("skybox"); - + skybox = skyStage->getSkybox(); if (skybox) { model::Skybox::render(batch, *(Application::getInstance()->getDisplayViewFrustum()), *skybox); @@ -3465,7 +3453,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); - + // Assuming nothing get's rendered through that if (!selfAvatarOnly) { @@ -3508,8 +3496,8 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se pendingChanges.resetItem(WorldBoxRenderData::_item, worldBoxRenderPayload); } else { - pendingChanges.updateItem(WorldBoxRenderData::_item, - [](WorldBoxRenderData& payload) { + pendingChanges.updateItem(WorldBoxRenderData::_item, + [](WorldBoxRenderData& payload) { payload._val++; }); } @@ -3528,7 +3516,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se } { - PerformanceTimer perfTimer("SceneProcessPendingChanges"); + PerformanceTimer perfTimer("SceneProcessPendingChanges"); _main3DScene->enqueuePendingChanges(pendingChanges); _main3DScene->processPendingChangesQueue(); @@ -3560,7 +3548,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se // Before the deferred pass, let's try to use the render engine _renderEngine->run(); - + auto engineRC = _renderEngine->getRenderContext(); sceneInterface->setEngineFeedOpaqueItems(engineRC->_numFeedOpaqueItems); sceneInterface->setEngineDrawnOpaqueItems(engineRC->_numDrawnOpaqueItems); @@ -4835,8 +4823,8 @@ qreal Application::getDevicePixelRatio() { mat4 Application::getEyeProjection(int eye) const { if (isHMDMode()) { return OculusManager::getEyeProjection(eye); - } - + } + return _viewFrustum.getProjection(); } From a9d37f22663f241039ff52e60889d40d6ace7504 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 11:15:27 -0700 Subject: [PATCH 049/582] update packet sending in AudioIOStats --- libraries/audio-client/src/AudioIOStats.cpp | 55 +++++++++------------ 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index 0a6c94671b..b4b7165b60 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -31,7 +31,7 @@ AudioIOStats::AudioIOStats(MixedProcessedAudioStream* receivedAudioStream) : _lastSentAudioPacket(0), _packetSentTimeGaps(1, APPROXIMATELY_30_SECONDS_OF_AUDIO_PACKETS) { - + } AudioStreamStats AudioIOStats::getMixerDownstreamStats() const { @@ -40,13 +40,13 @@ AudioStreamStats AudioIOStats::getMixerDownstreamStats() const { void AudioIOStats::reset() { _receivedAudioStream->resetStats(); - + _mixerAvatarStreamStats = AudioStreamStats(); _mixerInjectedStreamStatsMap.clear(); - + _audioInputMsecsReadStats.reset(); _inputRingBufferMsecsAvailableStats.reset(); - + _audioOutputMsecsUnplayedStats.reset(); _packetSentTimeGaps.reset(); } @@ -59,32 +59,32 @@ void AudioIOStats::sentPacket() { quint64 now = usecTimestampNow(); quint64 gap = now - _lastSentAudioPacket; _packetSentTimeGaps.update(gap); - + _lastSentAudioPacket = now; } } void AudioIOStats::parseAudioStreamStatsPacket(const QByteArray& packet) { - + int numBytesPacketHeader = numBytesForPacketHeader(packet); const char* dataAt = packet.constData() + numBytesPacketHeader; - + // parse the appendFlag, clear injected audio stream stats if 0 quint8 appendFlag = *(reinterpret_cast(dataAt)); dataAt += sizeof(quint8); if (!appendFlag) { _mixerInjectedStreamStatsMap.clear(); } - + // parse the number of stream stats structs to follow quint16 numStreamStats = *(reinterpret_cast(dataAt)); dataAt += sizeof(quint16); - + // parse the stream stats AudioStreamStats streamStats; for (quint16 i = 0; i < numStreamStats; i++) { memcpy(&streamStats, dataAt, sizeof(AudioStreamStats)); dataAt += sizeof(AudioStreamStats); - + if (streamStats._streamType == PositionalAudioStream::Microphone) { _mixerAvatarStreamStats = streamStats; } else { @@ -94,40 +94,33 @@ void AudioIOStats::parseAudioStreamStatsPacket(const QByteArray& packet) { } void AudioIOStats::sendDownstreamAudioStatsPacket() { - + auto audioIO = DependencyManager::get(); - + // since this function is called every second, we'll sample for some of our stats here _inputRingBufferMsecsAvailableStats.update(audioIO->getInputRingBufferMsecsAvailable()); _audioOutputMsecsUnplayedStats.update(audioIO->getAudioOutputMsecsUnplayed()); - + // also, call _receivedAudioStream's per-second callback _receivedAudioStream->perSecondCallbackForUpdatingStats(); - + auto nodeList = DependencyManager::get(); - - char packet[MAX_PACKET_SIZE]; - - // pack header - int numBytesPacketHeader = nodeList->populatePacketHeader(packet, PacketTypeAudioStreamStats); - char* dataAt = packet + numBytesPacketHeader; - + + auto statsPacket { NLPacket::create(PacketType::AudioStreamStats); } + // pack append flag quint8 appendFlag = 0; - memcpy(dataAt, &appendFlag, sizeof(quint8)); - dataAt += sizeof(quint8); - + statsPacket->write(&appendFlag, sizeof(appendFlag)); + // pack number of stats packed quint16 numStreamStatsToPack = 1; - memcpy(dataAt, &numStreamStatsToPack, sizeof(quint16)); - dataAt += sizeof(quint16); - + statsPacket->write(&numStreamStatsToPack, sizeof(numStreamStatsToPack)); + // pack downstream audio stream stats AudioStreamStats stats = _receivedAudioStream->getAudioStreamStats(); - memcpy(dataAt, &stats, sizeof(AudioStreamStats)); - dataAt += sizeof(AudioStreamStats); - + statsPacket->write(&stats, sizeof(stats)); + // send packet SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); - nodeList->writeDatagram(packet, dataAt - packet, audioMixer); + nodeList->sendPacket(packet, audioMixer); } From 426f6311782fc60f5f9b56a6091a25d7614ea602 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 11:18:14 -0700 Subject: [PATCH 050/582] use exact size for AudioIOStats packet --- libraries/audio-client/src/AudioIOStats.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index b4b7165b60..746faea4a7 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -106,18 +106,20 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { auto nodeList = DependencyManager::get(); - auto statsPacket { NLPacket::create(PacketType::AudioStreamStats); } + quint8 appendFlag = 0; + quint16 numStreamStatsToPack = 1; + AudioStreamStats stats = _receivedAudioStream->getAudioStreamStats(); + + int statsPacketSize = sizeof(appendFlag) + sizeof(numStreamStatsToPack) + sizeof(stats); + auto statsPacket { NLPacket::create(PacketType::AudioStreamStats, statsPacketSize); } // pack append flag - quint8 appendFlag = 0; statsPacket->write(&appendFlag, sizeof(appendFlag)); // pack number of stats packed - quint16 numStreamStatsToPack = 1; statsPacket->write(&numStreamStatsToPack, sizeof(numStreamStatsToPack)); // pack downstream audio stream stats - AudioStreamStats stats = _receivedAudioStream->getAudioStreamStats(); statsPacket->write(&stats, sizeof(stats)); // send packet From 1797c21890622e066236675e7d3c725945725e79 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 11:20:54 -0700 Subject: [PATCH 051/582] update packet sending in IceServer --- ice-server/src/IceServer.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 0d9960ed36..298d8ded8e 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -127,18 +127,13 @@ SharedNetworkPeer IceServer::addOrUpdateHeartbeatingPeer(const QByteArray& incom } void IceServer::sendPeerInformationPacket(const NetworkPeer& peer, const HifiSockAddr* destinationSockAddr) { - QByteArray outgoingPacket(MAX_PACKET_SIZE, 0); - int currentPacketSize = populatePacketHeaderWithUUID(outgoingPacket, PacketTypeIceServerPeerInformation, _id); - int numHeaderBytes = currentPacketSize; + auto peerPacket { NLPacket::create(PacketType::IceServerPeerInformation); } // get the byte array for this peer - QByteArray peerBytes = peer.toByteArray(); - outgoingPacket.replace(numHeaderBytes, peerBytes.size(), peerBytes); - - currentPacketSize += peerBytes.size(); + peerPacket->write(peer.toByteArray()); // write the current packet - _serverSocket.writeDatagram(outgoingPacket.data(), outgoingPacket.size(), + _serverSocket.writeDatagram(peerPacket.constData(), peerPacket.sizeUsed(), destinationSockAddr->getAddress(), destinationSockAddr->getPort()); } From 474b82e3bf4cd420af2796fbb080f7ea98964ce9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 11:28:57 -0700 Subject: [PATCH 052/582] fix nack packet sending in OctreeInboundPacketProcessor --- .../octree/OctreeInboundPacketProcessor.cpp | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index e486e4f5a7..ee4fdcd8cf 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -94,7 +94,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin if (_myServer->getOctree()->handlesEditPacketType(packetType)) { PerformanceWarning warn(debugProcessPacket, "processPacket KNOWN TYPE",debugProcessPacket); _receivedPacketCount++; - + const unsigned char* packetData = reinterpret_cast(packet.data()); unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); @@ -120,16 +120,16 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin qDebug() << " arrivedAt=" << arrivedAt << " usecs"; qDebug() << " transitTime=" << transitTime << " usecs"; qDebug() << " sendingNode->getClockSkewUsec()=" << sendingNode->getClockSkewUsec() << " usecs"; - - + + } - + if (debugProcessPacket) { qDebug() << " numBytesPacketHeader=" << numBytesPacketHeader; qDebug() << " sizeof(sequence)=" << sizeof(sequence); qDebug() << " sizeof(sentAt)=" << sizeof(sentAt); } - + int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); if (debugProcessPacket) { @@ -139,11 +139,11 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin qDebug() << " ----- UNEXPECTED ---- got a packet without any edit details!!!! --------"; } } - + unsigned char* editData = (unsigned char*)&packetData[atByte]; while (atByte < packet.size()) { - + int maxSize = packet.size() - atByte; if (debugProcessPacket) { @@ -242,8 +242,8 @@ int OctreeInboundPacketProcessor::sendNackPackets() { return packetsSent; } - char packet[MAX_PACKET_SIZE]; - + auto nackPacket { NLPacket::create(_myServer->getMyEditNackType(); } + NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); while (i != _singleSenderStats.end()) { @@ -268,44 +268,36 @@ int OctreeInboundPacketProcessor::sendNackPackets() { // retrieve sequence number stats of node, prune its missing set SequenceNumberStats& sequenceNumberStats = nodeStats.getIncomingEditSequenceNumberStats(); sequenceNumberStats.pruneMissingSet(); - + // construct nack packet(s) for this node const QSet& missingSequenceNumbers = sequenceNumberStats.getMissingSet(); int numSequenceNumbersAvailable = missingSequenceNumbers.size(); QSet::const_iterator missingSequenceNumberIterator = missingSequenceNumbers.constBegin(); while (numSequenceNumbersAvailable > 0) { - char* dataAt = packet; - int bytesRemaining = MAX_PACKET_SIZE; - auto nodeList = DependencyManager::get(); - // pack header - int numBytesPacketHeader = nodeList->populatePacketHeader(packet, _myServer->getMyEditNackType()); - dataAt += numBytesPacketHeader; - bytesRemaining -= numBytesPacketHeader; + nackPacket->reset(); // calculate and pack the number of sequence numbers to nack - int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(unsigned short int); + int numSequenceNumbersRoomFor = (nackPacket->getCapacity() - sizeof(uint16_t)) / sizeof(unsigned short int); uint16_t numSequenceNumbers = std::min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor); - uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt; - *numSequenceNumbersAt = numSequenceNumbers; - dataAt += sizeof(uint16_t); + + nackPacket->write(&numSequenceNumbers, sizeof(numSequenceNumbers)); // pack sequence numbers to nack for (uint16_t i = 0; i < numSequenceNumbers; i++) { - unsigned short int* sequenceNumberAt = (unsigned short int*)dataAt; - *sequenceNumberAt = *missingSequenceNumberIterator; - dataAt += sizeof(unsigned short int); + unsigned short int sequenceNumber = *missingSequenceNumberIterator; + nackPacket->write(&sequenceNumber, sizeof(sequenceNumber)); missingSequenceNumberIterator++; } numSequenceNumbersAvailable -= numSequenceNumbers; // send it - nodeList->writeUnverifiedDatagram(packet, dataAt - packet, destinationNode); + nodeList->sendUnreliablePacket(nackPacket, destinationNode); packetsSent++; - + qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; } i++; From 7eddcf383c229cd4ff627f2258722f7fb49aec05 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 11:33:33 -0700 Subject: [PATCH 053/582] Merge Packet and PacketPayload --- libraries/networking/src/Packet.cpp | 53 ++++++++++++++++- libraries/networking/src/Packet.h | 36 ++++++++++-- libraries/networking/src/PacketHeaders.h | 1 + libraries/networking/src/PacketPayload.cpp | 66 ---------------------- libraries/networking/src/PacketPayload.h | 40 ------------- 5 files changed, 83 insertions(+), 113 deletions(-) delete mode 100644 libraries/networking/src/PacketPayload.cpp delete mode 100644 libraries/networking/src/PacketPayload.h diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 717a79f2ff..fb1a3dabe3 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -41,7 +41,8 @@ std::unique_ptr Packet::create(PacketType::Value type, int64_t size) { Packet::Packet(PacketType::Value type, int64_t size) : _packetSize(headerSize(type) + size), _packet(new char(_packetSize)), - _payload(_packet.get() + headerSize(type), size) { + _payloadStart(_packet.get() + headerSize(type)), + _capacity(size) { // Sanity check Q_ASSERT(size <= maxPayloadSize(type)); @@ -87,7 +88,7 @@ bool Packet::isControlPacket() const { void Packet::setPacketTypeAndVersion(PacketType::Value type) { // Pack the packet type - auto offset = packArithmeticallyCodedValue((int)type, _packet.get()); + auto offset = packArithmeticallyCodedValue(type, _packet.get()); // Pack the packet version auto version { versionForPacketType(type) }; @@ -102,3 +103,51 @@ void Packet::setSequenceNumber(SequenceNumber seqNum) { memcpy(_packet.get() + numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion), &seqNum, sizeof(seqNum)); } + +bool Packet::seek(qint64 pos) { + bool valid = (pos >= 0) && (pos < size()); + if (valid) { + _position = pos; + } + return valid; +} + +static const qint64 PACKET_WRITE_ERROR = -1; +qint64 Packet::writeData(const char* data, qint64 maxSize) { + // make sure we have the space required to write this block + if (maxSize <= bytesAvailable()) { + qint64 currentPos = pos(); + + // good to go - write the data + memcpy(_payloadStart + currentPos, data, maxSize); + + // seek to the new position based on where our write just finished + seek(currentPos + maxSize); + + // keep track of _sizeUsed so we can just write the actual data when packet is about to be sent + _sizeUsed = std::max(pos() + 1, _sizeUsed); + + // return the number of bytes written + return maxSize; + } else { + // not enough space left for this write - return an error + return PACKET_WRITE_ERROR; + } +} + +qint64 Packet::readData(char* dest, qint64 maxSize) { + // we're either reading what is left from the current position or what was asked to be read + qint64 numBytesToRead = std::min(bytesAvailable(), maxSize); + + if (numBytesToRead > 0) { + int currentPosition = pos(); + + // read out the data + memcpy(dest, _payloadStart + currentPosition, numBytesToRead); + + // seek to the end of the read + seek(currentPosition + numBytesToRead); + } + + return numBytesToRead; +} diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index dd275aeb15..a2c3c83e50 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -17,7 +17,7 @@ #include "PacketHeaders.h" #include "PacketPayload.h" -class Packet { +class Packet : public QIODevice { public: using SequenceNumber = uint16_t; @@ -26,12 +26,29 @@ public: static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + + qint64 getSizeWithHeader() const { return getSizeUsed(); } + qint64 getSizeUsed() const { return _sizeUsed; } + void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } + + const char* constData() const { return _payloadStart; } + PacketType::Value getPacketType() const; PacketVersion getPacketTypeVersion() const; SequenceNumber getSequenceNumber() const; bool isControlPacket() const; - PacketPayload& payload() { return _payload; } + // QIODevice virtual functions + // + // WARNING: Those methods all refer to the paylaod only and not the entire packet + virtual bool atEnd() const { return _position == _capacity; } + virtual qint64 bytesAvailable() const { return size() - pos(); } + virtual bool canReadLine() const { return false; } + virtual bool isSequential() const { return false; } + virtual qint64 pos() const { return _position; } + virtual bool reset() { return seek(0); } + virtual bool seek(qint64 pos); + virtual qint64 size() const { return _capacity; } protected: Packet(PacketType::Value type, int64_t size); @@ -39,14 +56,23 @@ protected: Packet(const Packet&) = delete; Packet& operator=(Packet&&) = delete; Packet& operator=(const Packet&) = delete; + + // QIODevice virtual functions + virtual qint64 writeData(const char* data, qint64 maxSize); + virtual qint64 readData(char* data, qint64 maxSize); void setPacketTypeAndVersion(PacketType::Value type); void setSequenceNumber(SequenceNumber seqNum); - int64_t _packetSize; - std::unique_ptr _packet; + std::unique_ptr _packet; // Allocated memory + int64_t _packetSize = 0; // Total size of the allocated memory + + char* _payloadStart = nullptr; // Start of the payload + qint64 _position = 0; // Current position in the payload + qint64 _capacity = 0; // Total capacity of the payload + + qint64 _sizeUsed = 0; // How much of the payload is actually used - PacketPayload _payload; }; #endif // hifi_Packet_h \ No newline at end of file diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 298a0f7246..b164081d0d 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -118,6 +118,7 @@ int numBytesForPacketHeader(const QByteArray& packet); int numBytesForPacketHeader(const char* packet); int numBytesForArithmeticCodedPacketType(PacketType::Value packetType); int numBytesForPacketHeaderGivenPacketType(PacketType::Value packetType); +int packArithmeticallyCodedValue(int value, char* destination); QUuid uuidFromPacketHeader(const QByteArray& packet); diff --git a/libraries/networking/src/PacketPayload.cpp b/libraries/networking/src/PacketPayload.cpp deleted file mode 100644 index 5f0bc9b557..0000000000 --- a/libraries/networking/src/PacketPayload.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// PacketPayload.cpp -// libraries/networking/src -// -// Created by Stephen Birarda on 07/06/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 "PacketPayload.h" - -PacketPayload::PacketPayload(char* data, qint64 capacity) : - _data(data) - _capacity(capacity) -{ - -} - -const int PACKET_READ_ERROR = -1; - -qint64 PacketPayload::writeData(const char* data, qint64 maxSize) { - - qint64 currentPos = pos(); - - // make sure we have the space required to write this block - qint64 bytesAvailable = _capacity - currentPos; - - if (bytesAvailable < srcBytes) { - // good to go - write the data - memcpy(_data + currentPos, src, srcBytes); - - // seek to the new position based on where our write just finished - seek(currentPos + srcBytes); - - // keep track of _maxWritten so we can just write the actual data when packet is about to be sent - _size = std::max(pos() + 1, _maxWritten); - - // return the number of bytes written - return srcBytes; - } else { - // not enough space left for this write - return an error - return PACKET_WRITE_ERROR; - } -} - -const qint64 PACKET_READ_ERROR = -1; - -qint64 PacketPayload::readData(char* dest, qint64 maxSize) { - - int currentPosition = pos(); - - // we're either reading what is left from the current position or what was asked to be read - qint64 numBytesToRead = std::min(_maxSize - currentPosition, maxSize); - - if (numBytesToRead > 0) { - // read out the data - memcpy(dest, _data + currentPosition, numBytesToRead); - - // seek to the end of the read - seek(_data + currentPosition + numBytesToRead); - } - - return numBytesToRead; -} diff --git a/libraries/networking/src/PacketPayload.h b/libraries/networking/src/PacketPayload.h deleted file mode 100644 index a9e3811767..0000000000 --- a/libraries/networking/src/PacketPayload.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// PacketPayload.h -// libraries/networking/src -// -// Created by Stephen Birarda on 07/06/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_PacketPayload_h -#define hifi_PacketPayload_h - -#pragma once - -#include - -class PacketPayload : public QIODevice { -public: - PacketPayload(char* data, qint64 capacity); - - qint64 getSizeUsed() const { return _sizeUsed; } - void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } - - virtual qint64 size() const { return _capacity; } - virtual bool isSequential() const { return false; } - - const char* constData() const { return _data; } -protected: - qint64 writeData(const char* data, qint64 maxSize); - qint64 readData(char* data, qint64 maxSize); - -private: - char* _data; - qint64 _sizeUsed = 0; - qint64 _capacity = 0; -}; - -#endif // hifi_PacketPayload_h From 74924bc5f13c6bcf3d717c0bffe9c53772071272 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 12:08:01 -0700 Subject: [PATCH 054/582] initial changes to OctreeQueryNode for new APIs --- .../src/octree/OctreeQueryNode.cpp | 89 +++++++------------ .../src/octree/OctreeQueryNode.h | 34 ++++--- .../networking/src/SentPacketHistory.cpp | 4 +- libraries/networking/src/SentPacketHistory.h | 4 +- 4 files changed, 50 insertions(+), 81 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 56d5e041a9..c7fd6090cf 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -22,11 +22,9 @@ OctreeQueryNode::OctreeQueryNode() : _viewSent(false), - _octreePacket(new unsigned char[MAX_PACKET_SIZE]), - _octreePacketAt(_octreePacket), - _octreePacketAvailableBytes(MAX_PACKET_SIZE), + _octreePacket(), _octreePacketWaiting(false), - _lastOctreePacket(new unsigned char[MAX_PACKET_SIZE]), + _lastOctreePayload(new char[MAX_PACKET_SIZE]), _lastOctreePacketLength(0), _duplicatePacketCount(0), _firstSuppressedPacket(usecTimestampNow()), @@ -55,9 +53,8 @@ OctreeQueryNode::~OctreeQueryNode() { if (_octreeSendThread) { forceNodeShutdown(); } - - delete[] _octreePacket; - delete[] _lastOctreePacket; + + delete[] _lastOctreePayload; } void OctreeQueryNode::nodeKilled() { @@ -74,7 +71,7 @@ void OctreeQueryNode::forceNodeShutdown() { _isShuttingDown = true; elementBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications if (_octreeSendThread) { - // we really need to force our thread to shutdown, this is synchronous, we will block while the thread actually + // we really need to force our thread to shutdown, this is synchronous, we will block while the thread actually // shuts down because we really need it to shutdown, and it's ok if we wait for it to complete OctreeSendThread* sendThread = _octreeSendThread; _octreeSendThread = NULL; @@ -96,8 +93,8 @@ void OctreeQueryNode::sendThreadFinished() { } void OctreeQueryNode::initializeOctreeSendThread(OctreeServer* myServer, const SharedNodePointer& node) { - _octreeSendThread = new OctreeSendThread(myServer, node); - + _octreeSendThread = new OctreeSendThread(myServer, node); + // we want to be notified when the thread finishes connect(_octreeSendThread, &GenericThread::finished, this, &OctreeQueryNode::sendThreadFinished); _octreeSendThread->initialize(true); @@ -110,12 +107,11 @@ bool OctreeQueryNode::packetIsDuplicate() const { } // since our packets now include header information, like sequence number, and createTime, we can't just do a memcmp // of the entire packet, we need to compare only the packet content... - int numBytesPacketHeader = numBytesForPacketHeaderGivenPacketType(_myPacketType); - + if (_lastOctreePacketLength == getPacketLength()) { - if (memcmp(_lastOctreePacket + (numBytesPacketHeader + OCTREE_PACKET_EXTRA_HEADERS_SIZE), - _octreePacket + (numBytesPacketHeader + OCTREE_PACKET_EXTRA_HEADERS_SIZE), - getPacketLength() - (numBytesPacketHeader + OCTREE_PACKET_EXTRA_HEADERS_SIZE)) == 0) { + if (memcmp(_lastOctreePayload + OCTREE_PACKET_EXTRA_HEADERS_SIZE, + _octreePacket->getPayload() + OCTREE_PACKET_EXTRA_HEADERS_SIZE, + _octreePacket->getSizeUsed() - OCTREE_PACKET_EXTRA_HEADERS_SIZE) == 0) { return true; } } @@ -163,6 +159,9 @@ bool OctreeQueryNode::shouldSuppressDuplicatePacket() { void OctreeQueryNode::init() { _myPacketType = getMyPacketType(); + + _octreePacket = NLPacket::create(getMyPacketType()); + resetOctreePacket(); // don't bump sequence } @@ -177,8 +176,8 @@ void OctreeQueryNode::resetOctreePacket() { // changed since we last reset it. Since we know that no two packets can ever be identical without being the same // scene information, (e.g. the root node packet of a static scene), we can use this as a strategy for reducing // packet send rate. - _lastOctreePacketLength = getPacketLength(); - memcpy(_lastOctreePacket, _octreePacket, _lastOctreePacketLength); + _lastOctreePacketLength = _octreePacket->getSizeUsed(); + memcpy(_lastOctreePayload, _octreePacket->getPayload(), _lastOctreePacketLength); // If we're moving, and the client asked for low res, then we force monochrome, otherwise, use // the clients requested color state. @@ -192,31 +191,17 @@ void OctreeQueryNode::resetOctreePacket() { setAtBit(flags, PACKET_IS_COMPRESSED_BIT); } - _octreePacketAvailableBytes = MAX_PACKET_SIZE; - int numBytesPacketHeader = DependencyManager::get()->populatePacketHeader(reinterpret_cast(_octreePacket), - _myPacketType); - - _octreePacketAt = _octreePacket + numBytesPacketHeader; - _octreePacketAvailableBytes -= numBytesPacketHeader; + _octreePacket->reset(); // pack in flags - OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)_octreePacketAt; - *flagsAt = flags; - _octreePacketAt += sizeof(OCTREE_PACKET_FLAGS); - _octreePacketAvailableBytes -= sizeof(OCTREE_PACKET_FLAGS); + _octreePacket->write(&flags, sizeof(flags)); // pack in sequence number - OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)_octreePacketAt; - *sequenceAt = _sequenceNumber; - _octreePacketAt += sizeof(OCTREE_PACKET_SEQUENCE); - _octreePacketAvailableBytes -= sizeof(OCTREE_PACKET_SEQUENCE); + _octreePacket->write(&_sequenceNumber, sizeof(_sequenceNumber)); // pack in timestamp OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); - OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)_octreePacketAt; - *timeAt = now; - _octreePacketAt += sizeof(OCTREE_PACKET_SENT_TIME); - _octreePacketAvailableBytes -= sizeof(OCTREE_PACKET_SENT_TIME); + _octreePacket->write(&now, sizeof(now)); _octreePacketWaiting = false; } @@ -230,14 +215,11 @@ void OctreeQueryNode::writeToPacket(const unsigned char* buffer, unsigned int by // compressed packets include lead bytes which contain compressed size, this allows packing of // multiple compressed portions together if (_currentPacketIsCompressed) { - *(OCTREE_PACKET_INTERNAL_SECTION_SIZE*)_octreePacketAt = bytes; - _octreePacketAt += sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE); - _octreePacketAvailableBytes -= sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE); + OCTREE_PACKET_INTERNAL_SECTION_SIZE sectionSize = bytes; + _octreePacket->write(§ionSize, sizeof(sectionSize)); } - if (bytes <= _octreePacketAvailableBytes) { - memcpy(_octreePacketAt, buffer, bytes); - _octreePacketAvailableBytes -= bytes; - _octreePacketAt += bytes; + if (bytes <= _octreePacket->bytesAvailable()) { + _octreePacket->write(buffer, bytes); _octreePacketWaiting = true; } } @@ -258,8 +240,8 @@ bool OctreeQueryNode::updateCurrentViewFrustum() { float originalFOV = getCameraFov(); float wideFOV = originalFOV + VIEW_FRUSTUM_FOV_OVERSEND; - if (0.0f != getCameraAspectRatio() && - 0.0f != getCameraNearClip() && + if (0.0f != getCameraAspectRatio() && + 0.0f != getCameraNearClip() && 0.0f != getCameraFarClip()) { newestViewFrustum.setProjection(glm::perspective( glm::radians(wideFOV), // hack @@ -351,7 +333,7 @@ void OctreeQueryNode::dumpOutOfView() { if (_isShuttingDown) { return; } - + int stillInView = 0; int outOfView = 0; OctreeElementBag tempBag; @@ -374,15 +356,7 @@ void OctreeQueryNode::dumpOutOfView() { } } -void OctreeQueryNode::octreePacketSent() { - packetSent(_octreePacket, getPacketLength()); -} - -void OctreeQueryNode::packetSent(unsigned char* packet, int packetLength) { - packetSent(QByteArray((char*)packet, packetLength)); -} - -void OctreeQueryNode::packetSent(const QByteArray& packet) { +void OctreeQueryNode::packetSent(const NLPacket& packet) { _sentPacketHistory.packetSent(_sequenceNumber, packet); _sequenceNumber++; } @@ -391,12 +365,13 @@ bool OctreeQueryNode::hasNextNackedPacket() const { return !_nackedSequenceNumbers.isEmpty(); } -const QByteArray* OctreeQueryNode::getNextNackedPacket() { +NLPacket&& OctreeQueryNode::getNextNackedPacket() { if (!_nackedSequenceNumbers.isEmpty()) { // could return null if packet is not in the history - return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()); + return std::move(_sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue())); } - return NULL; + + return nullptr; } void OctreeQueryNode::parseNackPacket(const QByteArray& packet) { diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 32b09094b9..9838f3b737 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -41,8 +41,7 @@ public: void writeToPacket(const unsigned char* buffer, unsigned int bytes); // writes to end of packet - const unsigned char* getPacket() const { return _octreePacket; } - unsigned int getPacketLength() const { return (MAX_PACKET_SIZE - _octreePacketAvailableBytes); } + NLPacket& getPacket() const { return _octreePacket; } bool isPacketWaiting() const { return _octreePacketWaiting; } bool packetIsDuplicate() const; @@ -62,7 +61,7 @@ public: ViewFrustum& getCurrentViewFrustum() { return _currentViewFrustum; } ViewFrustum& getLastKnownViewFrustum() { return _lastKnownViewFrustum; } - + // These are not classic setters because they are calculating and maintaining state // which is set asynchronously through the network receive bool updateCurrentViewFrustum(); @@ -86,49 +85,46 @@ public: } bool hasLodChanged() const { return _lodChanged; } - + OctreeSceneStats stats; - + void initializeOctreeSendThread(OctreeServer* myServer, const SharedNodePointer& node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } - + void dumpOutOfView(); - + quint64 getLastRootTimestamp() const { return _lastRootTimestamp; } void setLastRootTimestamp(quint64 timestamp) { _lastRootTimestamp = timestamp; } unsigned int getlastOctreePacketLength() const { return _lastOctreePacketLength; } int getDuplicatePacketCount() const { return _duplicatePacketCount; } void sceneStart(quint64 sceneSendStartTime) { _sceneSendStartTime = sceneSendStartTime; } - + void nodeKilled(); void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } - void octreePacketSent(); - void packetSent(unsigned char* packet, int packetLength); - void packetSent(const QByteArray& packet); + void octreePacketSent() { packetSent(_octreePacket); } + void packetSent(const NLPacket& packet); OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } void parseNackPacket(const QByteArray& packet); bool hasNextNackedPacket() const; - const QByteArray* getNextNackedPacket(); + NLPacket&& getNextNackedPacket(); private slots: void sendThreadFinished(); - + private: OctreeQueryNode(const OctreeQueryNode &); OctreeQueryNode& operator= (const OctreeQueryNode&); - + bool _viewSent; - unsigned char* _octreePacket; - unsigned char* _octreePacketAt; - unsigned int _octreePacketAvailableBytes; + std::unique_ptr _octreePacket; bool _octreePacketWaiting; - unsigned char* _lastOctreePacket; + char* _lastOctreePayload = nullptr; unsigned int _lastOctreePacketLength; int _duplicatePacketCount; quint64 _firstSuppressedPacket; @@ -154,7 +150,7 @@ private: OCTREE_PACKET_SEQUENCE _sequenceNumber; quint64 _lastRootTimestamp; - + PacketType::Value _myPacketType; bool _isShuttingDown; diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 39f8a9c26e..8eedf2de05 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -13,13 +13,11 @@ #include "SentPacketHistory.h" #include - - - SentPacketHistory::SentPacketHistory(int size) : _sentPackets(size), _newestSequenceNumber(std::numeric_limits::max()) { + } void SentPacketHistory::packetSent(uint16_t sequenceNumber, const QByteArray& packet) { diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index 96d10a63cf..e07b128e4a 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -22,11 +22,11 @@ class SentPacketHistory { public: SentPacketHistory(int size = MAX_REASONABLE_SEQUENCE_GAP); - void packetSent(uint16_t sequenceNumber, const QByteArray& packet); + void packetSent(uint16_t sequenceNumber, const NLPacket& packet); const QByteArray* getPacket(uint16_t sequenceNumber) const; private: - RingBufferHistory _sentPackets; // circular buffer + RingBufferHistory _sentPackets; // circular buffer uint16_t _newestSequenceNumber; }; From 18dd61ec7e9e047d2341c78f15e6c10df9edf51a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 12:09:54 -0700 Subject: [PATCH 055/582] Update JurisdictionListener to use NLPacket --- libraries/octree/src/JurisdictionListener.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index 71c4feda96..a86130b005 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -33,17 +33,15 @@ void JurisdictionListener::nodeKilled(SharedNodePointer node) { } bool JurisdictionListener::queueJurisdictionRequest() { - static unsigned char buffer[MAX_PACKET_SIZE]; - unsigned char* bufferOut = &buffer[0]; + auto packet = NLPacket::create(PacketType::JurisdictionRequest, 0); auto nodeList = DependencyManager::get(); - int sizeOut = nodeList->populatePacketHeader(reinterpret_cast(bufferOut), PacketTypeJurisdictionRequest); int nodeCount = 0; nodeList->eachNode([&](const SharedNodePointer& node) { if (node->getType() == getNodeType() && node->getActiveSocket()) { - _packetSender.queuePacketForSending(node, QByteArray(reinterpret_cast(bufferOut), sizeOut)); + _packetSender.queuePacketForSending(node, packet); nodeCount++; } }); From fca23cc69bc23e348473f985d58b1f3058f1eb92 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 12:14:40 -0700 Subject: [PATCH 056/582] make SentPacketHistory use NLPacket --- assignment-client/src/octree/OctreeQueryNode.cpp | 4 ++-- assignment-client/src/octree/OctreeQueryNode.h | 2 +- libraries/networking/src/SentPacketHistory.cpp | 4 ++-- libraries/networking/src/SentPacketHistory.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index c7fd6090cf..88561aad6d 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -365,10 +365,10 @@ bool OctreeQueryNode::hasNextNackedPacket() const { return !_nackedSequenceNumbers.isEmpty(); } -NLPacket&& OctreeQueryNode::getNextNackedPacket() { +NLPacket* OctreeQueryNode::getNextNackedPacket() { if (!_nackedSequenceNumbers.isEmpty()) { // could return null if packet is not in the history - return std::move(_sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue())); + return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()); } return nullptr; diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 9838f3b737..d2ab07360a 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -111,7 +111,7 @@ public: void parseNackPacket(const QByteArray& packet); bool hasNextNackedPacket() const; - NLPacket&& getNextNackedPacket(); + NLPacket* getNextNackedPacket(); private slots: void sendThreadFinished(); diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 8eedf2de05..3b0958f1ea 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -20,7 +20,7 @@ SentPacketHistory::SentPacketHistory(int size) } -void SentPacketHistory::packetSent(uint16_t sequenceNumber, const QByteArray& packet) { +void SentPacketHistory::packetSent(uint16_t sequenceNumber, const NLPacket& packet) { // check if given seq number has the expected value. if not, something's wrong with // the code calling this function @@ -30,7 +30,7 @@ void SentPacketHistory::packetSent(uint16_t sequenceNumber, const QByteArray& pa << "Expected:" << expectedSequenceNumber << "Actual:" << sequenceNumber; } _newestSequenceNumber = sequenceNumber; - _sentPackets.insert(packet); + _sentPackets.insert(new NLPacket(packet)); } const QByteArray* SentPacketHistory::getPacket(uint16_t sequenceNumber) const { diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index e07b128e4a..fe47d477cb 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -26,7 +26,7 @@ public: const QByteArray* getPacket(uint16_t sequenceNumber) const; private: - RingBufferHistory _sentPackets; // circular buffer + RingBufferHistory _sentPackets; // circular buffer uint16_t _newestSequenceNumber; }; From ebd223ecbab32b525ea14e1e5b0565745fd65693 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 12:15:44 -0700 Subject: [PATCH 057/582] Update NetworkPacket to use NLPacket --- libraries/networking/src/NetworkPacket.cpp | 18 +++++++++--------- libraries/networking/src/NetworkPacket.h | 10 +++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/libraries/networking/src/NetworkPacket.cpp b/libraries/networking/src/NetworkPacket.cpp index 69bd0962bf..b2d1a14d77 100644 --- a/libraries/networking/src/NetworkPacket.cpp +++ b/libraries/networking/src/NetworkPacket.cpp @@ -18,38 +18,38 @@ #include "NetworkPacket.h" -void NetworkPacket::copyContents(const SharedNodePointer& node, const QByteArray& packet) { +void NetworkPacket::copyContents(const SharedNodePointer& node, const NLPacket& packet) { if (packet.size() && packet.size() <= MAX_PACKET_SIZE) { _node = node; - _byteArray = packet; + _nlPacket = packet; } else { qCDebug(networking, ">>> NetworkPacket::copyContents() unexpected length = %d", packet.size()); } } -NetworkPacket::NetworkPacket(const NetworkPacket& packet) { - copyContents(packet.getNode(), packet.getByteArray()); +NetworkPacket::NetworkPacket(const NetworkPacket& other) { + copyContents(other._node, other._packet); } -NetworkPacket::NetworkPacket(const SharedNodePointer& node, const QByteArray& packet) { +NetworkPacket::NetworkPacket(const SharedNodePointer& node, const NLPacket& packet) { copyContents(node, packet); }; // copy assignment NetworkPacket& NetworkPacket::operator=(NetworkPacket const& other) { - copyContents(other.getNode(), other.getByteArray()); + copyContents(other._node, other._packet); return *this; } #ifdef HAS_MOVE_SEMANTICS // move, same as copy, but other packet won't be used further -NetworkPacket::NetworkPacket(NetworkPacket && packet) { - copyContents(packet.getNode(), packet.getByteArray()); +NetworkPacket::NetworkPacket(NetworkPacket&& other) { + copyContents(other._node, other._packet); } // move assignment NetworkPacket& NetworkPacket::operator=(NetworkPacket&& other) { - copyContents(other.getNode(), other.getByteArray()); + copyContents(other._node, other._packet); return *this; } #endif diff --git a/libraries/networking/src/NetworkPacket.h b/libraries/networking/src/NetworkPacket.h index caee42f126..92c6a8ba59 100644 --- a/libraries/networking/src/NetworkPacket.h +++ b/libraries/networking/src/NetworkPacket.h @@ -24,20 +24,20 @@ public: NetworkPacket& operator= (const NetworkPacket& other); // copy assignment #ifdef HAS_MOVE_SEMANTICS - NetworkPacket(NetworkPacket&& packet); // move?? // same as copy, but other packet won't be used further + NetworkPacket(NetworkPacket&& other); // move?? // same as copy, but other packet won't be used further NetworkPacket& operator= (NetworkPacket&& other); // move assignment #endif - NetworkPacket(const SharedNodePointer& node, const QByteArray& byteArray); + NetworkPacket(const SharedNodePointer& node, const NLPacket& nlPacket); const SharedNodePointer& getNode() const { return _node; } - const QByteArray& getByteArray() const { return _byteArray; } + const NLPacket& getPacket() const { return _nlPacket; } private: - void copyContents(const SharedNodePointer& node, const QByteArray& byteArray); + void copyContents(const SharedNodePointer& node, const NLPacket& nlPacket); SharedNodePointer _node; - QByteArray _byteArray; + NLPacket _nlPacket; }; #endif // hifi_NetworkPacket_h From 308335ff69fc10880a5993229d81ea9042ee293d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 12:16:30 -0700 Subject: [PATCH 058/582] Update PacketSender to use NLPacket --- libraries/networking/src/PacketSender.cpp | 10 +++++----- libraries/networking/src/PacketSender.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index f560d94b86..4481cd716c 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -48,13 +48,13 @@ PacketSender::~PacketSender() { } -void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, const QByteArray& packet) { +void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, const NLPacket& packet) { NetworkPacket networkPacket(destinationNode, packet); lock(); _packets.push_back(networkPacket); unlock(); _totalPacketsQueued++; - _totalBytesQueued += packet.size(); + _totalBytesQueued += packet.getSizeWithHeader(); // Make sure to wake our actual processing thread because we now have packets for it to process. _hasPackets.wakeAll(); @@ -271,13 +271,13 @@ bool PacketSender::nonThreadedProcess() { unlock(); // send the packet through the NodeList... - DependencyManager::get()->writeDatagram(temporary.getByteArray(), temporary.getNode()); + DependencyManager::get()->sendUnreliablePacket(temporary.getPacket(), temporary.getNode()); packetsSentThisCall++; _packetsOverCheckInterval++; _totalPacketsSent++; - _totalBytesSent += temporary.getByteArray().size(); + _totalBytesSent += temporary.getPacket().getSizeWithHeader(); - emit packetSent(temporary.getByteArray().size()); + emit packetSent(temporary.getPacket().getSizeWithHeader()); _lastSendTime = now; } diff --git a/libraries/networking/src/PacketSender.h b/libraries/networking/src/PacketSender.h index 29d9287127..6754da9825 100644 --- a/libraries/networking/src/PacketSender.h +++ b/libraries/networking/src/PacketSender.h @@ -39,7 +39,7 @@ public: ~PacketSender(); /// Add packet to outbound queue. - void queuePacketForSending(const SharedNodePointer& destinationNode, const QByteArray& packet); + void queuePacketForSending(const SharedNodePointer& destinationNode, const NLPacket& packet); void setPacketsPerSecond(int packetsPerSecond); int getPacketsPerSecond() const { return _packetsPerSecond; } From 712b35c4dc43e16613e2f3dd95d2820ac373a5c3 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 12:26:35 -0700 Subject: [PATCH 059/582] Couple changes to packets header size computation --- libraries/networking/src/NLPacket.cpp | 26 +++++++++------- libraries/networking/src/NLPacket.h | 8 +++-- libraries/networking/src/Packet.cpp | 43 +++++++++++++++------------ libraries/networking/src/Packet.h | 35 +++++++++++++--------- 4 files changed, 66 insertions(+), 46 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index df91b4fdbe..524983a8ff 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -11,14 +11,22 @@ #include "NLPacket.h" -int64_t NLPacket::headerSize(PacketType::Value type) { +int64_t NLPacket::localHeaderSize(PacketType::Value type) { int64_t size = ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID) + ((NON_VERIFIED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID); return size; } int64_t NLPacket::maxPayloadSize(PacketType::Value type) { - return Packet::maxPayloadSize(type) - headerSize(type); + return Packet::maxPayloadSize(type) - localHeaderSize(type); +} + +qint64 Packet::totalHeadersSize() const { + return localHeaderSize() + Packet::localHeaderSize(); +} + +qint64 Packet::localHeaderSize() const { + return localHeaderSize(_type); } std::unique_ptr NLPacket::create(PacketType::Value type, int64_t size) { @@ -29,20 +37,18 @@ std::unique_ptr NLPacket::create(PacketType::Value type, int64_t size) return std::unique_ptr(new NLPacket(type, size)); } -NLPacket::NLPacket(PacketType::Value type, int64_t size) : Packet(type, headerSize(type) + size) { +NLPacket::NLPacket(PacketType::Value type, int64_t size) : Packet(type, localHeaderSize(type) + size) { } void NLPacket::setSourceUuid(QUuid sourceUuid) { - auto type = getPacketType(); - Q_ASSERT(!NON_SOURCED_PACKETS.contains(type)); - auto offset = Packet::headerSize(type) + NLPacket::headerSize(type); + Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type)); + auto offset = Packet::totalHeadersSize(); memcpy(_packet.get() + offset, sourceUuid.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); } void NLPacket::setConnectionUuid(QUuid connectionUuid) { - auto type = getPacketType(); - Q_ASSERT(!NON_VERIFIED_PACKETS.contains(type)); - auto offset = Packet::headerSize(type) + NLPacket::headerSize(type) + - ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID); + Q_ASSERT(!NON_VERIFIED_PACKETS.contains(_type)); + auto offset = Packet::totalHeadersSize() + + ((NON_SOURCED_PACKETS.contains(_type)) ? 0 : NUM_BYTES_RFC4122_UUID); memcpy(_packet.get() + offset, connectionUuid.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); } \ No newline at end of file diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index b1ceee9e83..7f625fb60c 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -16,17 +16,19 @@ class NLPacket : public Packet { public: - static int64_t headerSize(PacketType::Value type); + static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + + static int64_t localHeaderSize(PacketType::Value type); static int64_t maxPayloadSize(PacketType::Value type); - static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers + virtual qint64 localHeaderSize() const; // Current level's header size protected: NLPacket(PacketType::Value type, int64_t size); void setSourceUuid(QUuid sourceUuid); void setConnectionUuid(QUuid connectionUuid); - }; #endif // hifi_NLPacket_h \ No newline at end of file diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index fb1a3dabe3..293763f77b 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -13,17 +13,17 @@ #include "LimitedNodeList.h" -int64_t Packet::headerSize(PacketType::Value type) { - int64_t size = numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion) + +qint64 Packet::localHeaderSize(PacketType::Value type) { + qint64 size = numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion) + ((SEQUENCE_NUMBERED_PACKETS.contains(type)) ? sizeof(SequenceNumber) : 0); return size; } -int64_t Packet::maxPayloadSize(PacketType::Value type) { - return MAX_PACKET_SIZE - headerSize(type); +qint64 Packet::maxPayloadSize(PacketType::Value type) { + return MAX_PACKET_SIZE - localHeaderSize(type); } -std::unique_ptr Packet::create(PacketType::Value type, int64_t size) { +std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { auto maxPayload = maxPayloadSize(type); if (size == -1) { // default size of -1, means biggest packet possible @@ -38,12 +38,20 @@ std::unique_ptr Packet::create(PacketType::Value type, int64_t size) { return std::unique_ptr(new Packet(type, size)); } -Packet::Packet(PacketType::Value type, int64_t size) : - _packetSize(headerSize(type) + size), +qint64 Packet::totalHeadersSize() const { + return localHeaderSize(); +} + +qint64 Packet::localHeaderSize() const { + return localHeaderSize(_type); +} + +Packet::Packet(PacketType::Value type, qint64 size) : + _type(type), + _packetSize(localHeaderSize(_type) + size), _packet(new char(_packetSize)), - _payloadStart(_packet.get() + headerSize(type)), + _payloadStart(_packet.get() + localHeaderSize(_type)), _capacity(size) { - // Sanity check Q_ASSERT(size <= maxPayloadSize(type)); @@ -57,18 +65,17 @@ Packet::Packet(PacketType::Value type, int64_t size) : } PacketType::Value Packet::getPacketType() const { - return *reinterpret_cast(_packet.get()); + return (PacketType::Value)arithmeticCodingValueFromBuffer(_packet.get()); } PacketVersion Packet::getPacketTypeVersion() const { - return *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(getPacketType())); + return *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(_type)); } Packet::SequenceNumber Packet::getSequenceNumber() const { - PacketType::Value type{ getPacketType() }; - if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { + if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) { SequenceNumber seqNum = *reinterpret_cast(_packet.get() + - numBytesForArithmeticCodedPacketType(type) + + numBytesForArithmeticCodedPacketType(_type) + sizeof(PacketVersion)); return seqNum & ~(1 << 15); // remove control bit } @@ -76,10 +83,9 @@ Packet::SequenceNumber Packet::getSequenceNumber() const { } bool Packet::isControlPacket() const { - auto type = getPacketType(); - if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { + if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) { SequenceNumber seqNum = *reinterpret_cast(_packet.get() + - numBytesForArithmeticCodedPacketType(type) + + numBytesForArithmeticCodedPacketType(_type) + sizeof(PacketVersion)); return seqNum & (1 << 15); // Only keep control bit } @@ -96,11 +102,10 @@ void Packet::setPacketTypeAndVersion(PacketType::Value type) { } void Packet::setSequenceNumber(SequenceNumber seqNum) { - auto type = getPacketType(); // Here we are overriding the control bit to 0. // But that is not an issue since we should only ever set the seqNum // for data packets going out - memcpy(_packet.get() + numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion), + memcpy(_packet.get() + numBytesForArithmeticCodedPacketType(_type) + sizeof(PacketVersion), &seqNum, sizeof(seqNum)); } diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index a2c3c83e50..958f56a827 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -14,33 +14,38 @@ #include +#include + #include "PacketHeaders.h" -#include "PacketPayload.h" class Packet : public QIODevice { public: - using SequenceNumber = uint16_t; - - static int64_t headerSize(PacketType::Value type); - static int64_t maxPayloadSize(PacketType::Value type); - static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + using SequenceNumber = uint16_t; - qint64 getSizeWithHeader() const { return getSizeUsed(); } + static qint64 localHeaderSize(PacketType::Value type); + static qint64 maxPayloadSize(PacketType::Value type); + + virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers + virtual qint64 localHeaderSize() const; // Current level's header size + + // Payload direct access, use responsibly! + char* getPayload() { return _payloadStart; } + const char* getPayload() const { return _payloadStart; } + + qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } - - const char* constData() const { return _payloadStart; } - + + // Header readers PacketType::Value getPacketType() const; PacketVersion getPacketTypeVersion() const; SequenceNumber getSequenceNumber() const; bool isControlPacket() const; // QIODevice virtual functions - // - // WARNING: Those methods all refer to the paylaod only and not the entire packet + // WARNING: Those methods all refer to the payload ONLY and NOT the entire packet virtual bool atEnd() const { return _position == _capacity; } virtual qint64 bytesAvailable() const { return size() - pos(); } virtual bool canReadLine() const { return false; } @@ -61,18 +66,20 @@ protected: virtual qint64 writeData(const char* data, qint64 maxSize); virtual qint64 readData(char* data, qint64 maxSize); + // Header writers void setPacketTypeAndVersion(PacketType::Value type); void setSequenceNumber(SequenceNumber seqNum); + PacketType::Value _type; + + qint64 _packetSize = 0; // Total size of the allocated memory std::unique_ptr _packet; // Allocated memory - int64_t _packetSize = 0; // Total size of the allocated memory char* _payloadStart = nullptr; // Start of the payload qint64 _position = 0; // Current position in the payload qint64 _capacity = 0; // Total capacity of the payload qint64 _sizeUsed = 0; // How much of the payload is actually used - }; #endif // hifi_Packet_h \ No newline at end of file From 01b1c462371d3a5251ca1b6b0be39aee77074a0d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 12:31:22 -0700 Subject: [PATCH 060/582] more networking API changes in octree classes --- .../src/octree/OctreeQueryNode.cpp | 2 +- .../src/octree/OctreeQueryNode.h | 2 +- .../src/octree/OctreeSendThread.cpp | 89 ++++++++++--------- libraries/networking/src/SentPacketHistory.h | 2 +- libraries/octree/src/OctreeSceneStats.h | 38 ++++---- 5 files changed, 68 insertions(+), 65 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 88561aad6d..3b7f7d1bd5 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -365,7 +365,7 @@ bool OctreeQueryNode::hasNextNackedPacket() const { return !_nackedSequenceNumbers.isEmpty(); } -NLPacket* OctreeQueryNode::getNextNackedPacket() { +const NLPacket* OctreeQueryNode::getNextNackedPacket() { if (!_nackedSequenceNumbers.isEmpty()) { // could return null if packet is not in the history return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()); diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index d2ab07360a..045600fd98 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -111,7 +111,7 @@ public: void parseNackPacket(const QByteArray& packet); bool hasNextNackedPacket() const; - NLPacket* getNextNackedPacket(); + const NLPacket* getNextNackedPacket(); private slots: void sendThreadFinished(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index d664fb5c8f..fdd3670a1b 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -30,10 +30,10 @@ OctreeSendThread::OctreeSendThread(OctreeServer* myServer, const SharedNodePoint _isShuttingDown(false) { QString safeServerName("Octree"); - + // set our QThread object name so we can identify this thread while debugging setObjectName(QString("Octree Send Thread (%1)").arg(uuidStringWithoutCurlyBraces(node->getUUID()))); - + if (_myServer) { safeServerName = _myServer->getMyServerName(); } @@ -49,7 +49,7 @@ OctreeSendThread::~OctreeSendThread() { if (_myServer) { safeServerName = _myServer->getMyServerName(); } - + qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; @@ -121,18 +121,18 @@ quint64 OctreeSendThread::_totalPackets = 0; int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { OctreeServer::didHandlePacketSend(this); - - // if we're shutting down, then exit early + + // if we're shutting down, then exit early if (nodeData->isShuttingDown()) { return 0; } - + bool debug = _myServer->wantsDebugSending(); quint64 now = usecTimestampNow(); bool packetSent = false; // did we send a packet? int packetsSent = 0; - + // Here's where we check to see if this packet is a duplicate of the last packet. If it is, we will silently // obscure the packet and not send it. This allows the callers and upper level logic to not need to know about // this rate control savings. @@ -202,7 +202,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes dataAt += sizeof(OCTREE_PACKET_SEQUENCE); OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt); dataAt += sizeof(OCTREE_PACKET_SENT_TIME); - + qDebug() << "Sending separate stats packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << " size: " << statsMessageLength << " [" << _totalBytes << @@ -230,7 +230,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes dataAt += sizeof(OCTREE_PACKET_SEQUENCE); OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt); dataAt += sizeof(OCTREE_PACKET_SENT_TIME); - + qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << " size: " << nodeData->getPacketLength() << " [" << _totalBytes << @@ -243,23 +243,25 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) { // just send the octree packet OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->writeDatagram((char*)nodeData->getPacket(), nodeData->getPacketLength(), _node); + DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), _node); packetSent = true; int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); _totalWastedBytes += thisWastedBytes; _totalBytes += nodeData->getPacketLength(); _totalPackets++; + if (debug) { - const unsigned char* messageData = nodeData->getPacket(); - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(messageData)); - const unsigned char* dataAt = messageData + numBytesPacketHeader; - dataAt += sizeof(OCTREE_PACKET_FLAGS); - OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SENT_TIME); - + NLPacket& sentPacket = nodeData->getPacket(); + + sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + + OCTREE_PACKET_SEQUENCE sequence; + sentPacket->read(&sequence, sizeof(sequence)); + + OCTREE_PACKET_SENT_TIME timestamp; + sentPacket->read(×tamp, sizeof(timestamp)); + qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << " size: " << nodeData->getPacketLength() << " [" << _totalBytes << @@ -267,10 +269,11 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes } } } + // remember to track our stats if (packetSent) { - nodeData->stats.packetSent(nodeData->getPacketLength()); - trueBytesSent += nodeData->getPacketLength(); + nodeData->stats.packetSent(nodeData->getPacket()->getSizeUsed()); + trueBytesSent += nodeData->getPacket()->getSizeUsed(); truePacketsSent++; packetsSent++; nodeData->octreePacketSent(); @@ -282,14 +285,14 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes /// Version of octree element distributor that sends the deepest LOD level at once int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged) { - + OctreeServer::didPacketDistributor(this); // if shutting down, exit early if (nodeData->isShuttingDown()) { return 0; } - + // calculate max number of packets that can be sent during this interval int clientMaxPacketsPerInterval = std::max(1, (nodeData->getMaxQueryPacketsPerSecond() / INTERVALS_PER_SECOND)); int maxPacketsPerInterval = std::min(clientMaxPacketsPerInterval, _myServer->getPacketsPerClientPerInterval()); @@ -297,7 +300,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus int truePacketsSent = 0; int trueBytesSent = 0; int packetsSentThisInterval = 0; - bool isFullScene = ((!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging()) + bool isFullScene = ((!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging()) || nodeData->hasLodChanged(); bool somethingToSend = true; // assume we have something @@ -395,18 +398,18 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus int extraPackingAttempts = 0; bool completedScene = false; - + while (somethingToSend && packetsSentThisInterval < maxPacketsPerInterval && !nodeData->isShuttingDown()) { float lockWaitElapsedUsec = OctreeServer::SKIP_TIME; float encodeElapsedUsec = OctreeServer::SKIP_TIME; float compressAndWriteElapsedUsec = OctreeServer::SKIP_TIME; float packetSendingElapsedUsec = OctreeServer::SKIP_TIME; - - quint64 startInside = usecTimestampNow(); + + quint64 startInside = usecTimestampNow(); bool lastNodeDidntFit = false; // assume each node fits if (!nodeData->elementBag.isEmpty()) { - + quint64 lockWaitStart = usecTimestampNow(); _myServer->getOctree()->lockForRead(); quint64 lockWaitEnd = usecTimestampNow(); @@ -419,15 +422,15 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // going to result in any packets being sent... // // If our node is root, and the root hasn't changed, and our view hasn't changed, - // and we've already seen at least one duplicate packet, then we probably don't need - // to lock the tree and encode, because the result should be that no bytes will be + // and we've already seen at least one duplicate packet, then we probably don't need + // to lock the tree and encode, because the result should be that no bytes will be // encoded, and this will be a duplicate packet from the last one we sent... OctreeElement* root = _myServer->getOctree()->getRoot(); bool skipEncode = false; if ( (subTree == root) && (nodeData->getLastRootTimestamp() == root->getLastChanged()) - && !viewFrustumChanged + && !viewFrustumChanged && (nodeData->getDuplicatePacketCount() > 0) ) { qDebug() << "is root, root not changed, view not changed, already seen a duplicate!" @@ -438,13 +441,13 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus bool wantOcclusionCulling = nodeData->getWantOcclusionCulling(); CoverageMap* coverageMap = wantOcclusionCulling ? &nodeData->map : IGNORE_COVERAGE_MAP; - + float octreeSizeScale = nodeData->getOctreeSizeScale(); int boundaryLevelAdjustClient = nodeData->getBoundaryLevelAdjust(); - + int boundaryLevelAdjust = boundaryLevelAdjustClient + (viewFrustumChanged && nodeData->getWantLowResMoving() ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST); - + EncodeBitstreamParams params(INT_MAX, &nodeData->getCurrentViewFrustum(), wantColor, WANT_EXISTS_BITS, DONT_CHOP, wantDelta, lastViewFrustum, wantOcclusionCulling, coverageMap, boundaryLevelAdjust, octreeSizeScale, @@ -461,7 +464,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus quint64 encodeEnd = usecTimestampNow(); encodeElapsedUsec = (float)(encodeEnd - encodeStart); - + // If after calling encodeTreeBitstream() there are no nodes left to send, then we know we've // sent the entire scene. We want to know this below so we'll actually write this content into // the packet and send it @@ -502,7 +505,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus if (_packetData.hasContent()) { quint64 compressAndWriteStart = usecTimestampNow(); - + // if for some reason the finalized size is greater than our available size, then probably the "compressed" // form actually inflated beyond our padding, and in this case we will send the current packet, then // write to out new packet... @@ -522,7 +525,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // If we're not running compressed, then we know we can just send now. Or if we're running compressed, but // the packet doesn't have enough space to bother attempting to pack more... bool sendNow = true; - + if (nodeData->getCurrentPacketIsCompressed() && nodeData->getAvailable() >= MINIMUM_ATTEMPT_MORE_PACKING && extraPackingAttempts <= REASONABLE_NUMBER_OF_PACKING_ATTEMPTS) { @@ -555,7 +558,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus OctreeServer::trackEncodeTime(encodeElapsedUsec); OctreeServer::trackCompressAndWriteTime(compressAndWriteElapsedUsec); OctreeServer::trackPacketSendingTime(packetSendingElapsedUsec); - + quint64 endInside = usecTimestampNow(); quint64 elapsedInsideUsecs = endInside - startInside; OctreeServer::trackInsideTime((float)elapsedInsideUsecs); @@ -582,20 +585,20 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // Re-send packets that were nacked by the client while (nodeData->hasNextNackedPacket() && packetsSentThisInterval < maxPacketsPerInterval) { - const QByteArray* packet = nodeData->getNextNackedPacket(); + const NLPacket* packet = nodeData->getNextNackedPacket(); if (packet) { - DependencyManager::get()->writeDatagram(*packet, _node); + DependencyManager::get()->sendUnreliablePacket(*packet, _node); truePacketsSent++; packetsSentThisInterval++; - _totalBytes += packet->size(); + _totalBytes += packet->getSizeWithHeader(); _totalPackets++; - _totalWastedBytes += MAX_PACKET_SIZE - packet->size(); + _totalWastedBytes += MAX_PACKET_SIZE - packet->getSizeWithHeader(); } } quint64 end = usecTimestampNow(); - int elapsedmsec = (end - start)/USECS_PER_MSEC; + int elapsedmsec = (end - start) / USECS_PER_MSEC; OctreeServer::trackLoopTime(elapsedmsec); // TODO: add these to stats page diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index fe47d477cb..566fd2dbfc 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -23,7 +23,7 @@ public: SentPacketHistory(int size = MAX_REASONABLE_SEQUENCE_GAP); void packetSent(uint16_t sequenceNumber, const NLPacket& packet); - const QByteArray* getPacket(uint16_t sequenceNumber) const; + const NLPacket* getPacket(uint16_t sequenceNumber) const; private: RingBufferHistory _sentPackets; // circular buffer diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index fdb4a7d545..fcb0c0415d 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -32,10 +32,10 @@ public: OctreeSceneStats(); ~OctreeSceneStats(); void reset(); - + OctreeSceneStats(const OctreeSceneStats& other); // copy constructor OctreeSceneStats& operator= (const OctreeSceneStats& other); // copy assignment - + /// Call when beginning the computation of a scene. Initializes internal structures void sceneStarted(bool fullScene, bool moving, OctreeElement* root, JurisdictionMap* jurisdictionMap); bool getIsSceneStarted() const { return _isStarted; } @@ -44,7 +44,7 @@ public: void sceneCompleted(); void printDebugDetails(); - + /// Track that a packet was sent as part of the scene. void packetSent(int bytes); @@ -53,7 +53,7 @@ public: /// Tracks the ending of an encode pass during scene calculation. void encodeStopped(); - + /// Track that a element was traversed as part of computation of a scene. void traversed(const OctreeElement* element); @@ -133,7 +133,7 @@ public: int detailsCount; const char* detailsLabels; }; - + /// Returns details about items tracked by OctreeSceneStats /// \param Item item The item from the stats you're interested in. ItemInfo& getItemInfo(Item item) { return _ITEMS[item]; } @@ -147,7 +147,7 @@ public: /// Returns list of OctCodes for end elements of the jurisdiction of this particular octree server const std::vector& getJurisdictionEndNodes() const { return _jurisdictionEndNodes; } - + bool isMoving() const { return _isMoving; } quint64 getTotalElements() const { return _totalElements; } quint64 getTotalInternal() const { return _totalInternal; } @@ -164,10 +164,10 @@ public: void trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec); quint32 getIncomingPackets() const { return _incomingPacket; } - quint64 getIncomingBytes() const { return _incomingBytes; } + quint64 getIncomingBytes() const { return _incomingBytes; } quint64 getIncomingWastedBytes() const { return _incomingWastedBytes; } float getIncomingFlightTimeAverage() { return _incomingFlightTimeAverage.getAverage(); } - + const SequenceNumberStats& getIncomingOctreeSequenceNumberStats() const { return _incomingOctreeSequenceNumberStats; } SequenceNumberStats& getIncomingOctreeSequenceNumberStats() { return _incomingOctreeSequenceNumberStats; } @@ -177,7 +177,7 @@ private: bool _isReadyToSend; unsigned char _statsMessage[MAX_PACKET_SIZE]; - + qint32 _statsMessageLength; // scene timing data in usecs @@ -190,13 +190,13 @@ private: quint64 _lastFullTotalEncodeTime; quint32 _lastFullTotalPackets; quint64 _lastFullTotalBytes; - + SimpleMovingAverage _elapsedAverage; SimpleMovingAverage _bitsPerOctreeAverage; quint64 _totalEncodeTime; quint64 _encodeStart; - + // scene octree related data quint64 _totalElements; quint64 _totalInternal; @@ -205,7 +205,7 @@ private: quint64 _traversed; quint64 _internal; quint64 _leaves; - + quint64 _skippedDistance; quint64 _internalSkippedDistance; quint64 _leavesSkippedDistance; @@ -241,24 +241,24 @@ private: // Accounting Notes: // - // 1) number of octrees sent can be calculated as _colorSent + _colorBitsWritten. This works because each internal + // 1) number of octrees sent can be calculated as _colorSent + _colorBitsWritten. This works because each internal // element in a packet will have a _colorBitsWritten included for it and each "leaf" in the packet will have a // _colorSent written for it. Note that these "leaf" elements in the packets may not be actual leaves in the full // tree, because LOD may cause us to send an average color for an internal element instead of recursing deeper to // the leaves. // - // 2) the stats balance if: (working assumption) - // if _colorSent > 0 + // 2) the stats balance if: (working assumption) + // if _colorSent > 0 // _traversed = all skipped + _colorSent + _colorBitsWritten // else // _traversed = all skipped + _colorSent + _colorBitsWritten + _treesRemoved // - + // scene network related data quint32 _packets; quint64 _bytes; quint32 _passes; - + // incoming packets stats quint32 _incomingPacket; quint64 _incomingBytes; @@ -267,7 +267,7 @@ private: SequenceNumberStats _incomingOctreeSequenceNumberStats; SimpleMovingAverage _incomingFlightTimeAverage; - + // features related items bool _isMoving; bool _isFullScene; @@ -276,7 +276,7 @@ private: static ItemInfo _ITEMS[]; static const int MAX_ITEM_VALUE_LENGTH = 128; char _itemValueBuffer[MAX_ITEM_VALUE_LENGTH]; - + unsigned char* _jurisdictionRoot; std::vector _jurisdictionEndNodes; }; From d8b1cc0aa99512f62b07bed7312a69e8f29c2f92 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 12:38:58 -0700 Subject: [PATCH 061/582] Update NetworkPacket to correctly use move semantics --- libraries/networking/src/NetworkPacket.cpp | 28 +++++++++++----------- libraries/networking/src/NetworkPacket.h | 1 - 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/libraries/networking/src/NetworkPacket.cpp b/libraries/networking/src/NetworkPacket.cpp index b2d1a14d77..fb1c90e392 100644 --- a/libraries/networking/src/NetworkPacket.cpp +++ b/libraries/networking/src/NetworkPacket.cpp @@ -18,38 +18,38 @@ #include "NetworkPacket.h" -void NetworkPacket::copyContents(const SharedNodePointer& node, const NLPacket& packet) { - if (packet.size() && packet.size() <= MAX_PACKET_SIZE) { +NetworkPacket::NetworkPacket(const NetworkPacket& other) : + _node(other._node), + _nlPacket(other._nlPacket) { +} + +NetworkPacket::NetworkPacket(const SharedNodePointer& node, const NLPacket& packet) { + if (packet.getSizeWitHeader() && packet.getSizeWithHeader() <= MAX_nlPacket_SIZE) { _node = node; _nlPacket = packet; } else { qCDebug(networking, ">>> NetworkPacket::copyContents() unexpected length = %d", packet.size()); } -} - -NetworkPacket::NetworkPacket(const NetworkPacket& other) { - copyContents(other._node, other._packet); -} - -NetworkPacket::NetworkPacket(const SharedNodePointer& node, const NLPacket& packet) { - copyContents(node, packet); }; // copy assignment NetworkPacket& NetworkPacket::operator=(NetworkPacket const& other) { - copyContents(other._node, other._packet); + _node = other._node; + _nlPacket = other._nlPacket; return *this; } #ifdef HAS_MOVE_SEMANTICS // move, same as copy, but other packet won't be used further -NetworkPacket::NetworkPacket(NetworkPacket&& other) { - copyContents(other._node, other._packet); +NetworkPacket::NetworkPacket(NetworkPacket&& other) : + _node(std::move(other._node)), + _nlPacket(std::move(other._nlPacket)) { } // move assignment NetworkPacket& NetworkPacket::operator=(NetworkPacket&& other) { - copyContents(other._node, other._packet); + _node = std::move(other._node); + _nlPacket = std::move(other._nlPacket); return *this; } #endif diff --git a/libraries/networking/src/NetworkPacket.h b/libraries/networking/src/NetworkPacket.h index 92c6a8ba59..c42ad286ae 100644 --- a/libraries/networking/src/NetworkPacket.h +++ b/libraries/networking/src/NetworkPacket.h @@ -34,7 +34,6 @@ public: const NLPacket& getPacket() const { return _nlPacket; } private: - void copyContents(const SharedNodePointer& node, const NLPacket& nlPacket); SharedNodePointer _node; NLPacket _nlPacket; From e2bd9532b7df80248b51535180e8ad159dfeb3f7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 12:47:23 -0700 Subject: [PATCH 062/582] Implement move ctor/assignment --- libraries/networking/src/Packet.cpp | 35 +++++++++++++++++++++++++++++ libraries/networking/src/Packet.h | 12 +++++----- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 293763f77b..ca49100efe 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -64,6 +64,41 @@ Packet::Packet(PacketType::Value type, qint64 size) : } } +Packet::Packet(const Packet& other) { + *this = other; +} + +Packet& Packet::operator=(const Packet& other) { + _packetSize = other._packetSize; + _packet = std::unique_ptr(new char(_packetSize)); + memcpy(_packet.get(), other._packet.get(), _packetSize); + + _payloadStart = _packet.get() + (other._payloadStart - other._packet.get()); + _position = other._position; + _capacity = other._capacity; + + _sizeUsed = other._sizeUsed; + + return *this; +} + +Packet::Packet(Packet&& other) { + *this = std::move(other); +} + +Packet& Packet::operator=(Packet&& other) { + _packetSize = other._packetSize; + _packet = std::move(other._packet); + + _payloadStart = other._payloadStart; + _position = other._position; + _capacity = other._capacity; + + _sizeUsed = other._sizeUsed; + + return *this; +} + PacketType::Value Packet::getPacketType() const { return (PacketType::Value)arithmeticCodingValueFromBuffer(_packet.get()); } diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 958f56a827..6177cbd60e 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -20,10 +20,10 @@ class Packet : public QIODevice { public: - static std::unique_ptr create(PacketType::Value type, int64_t size = -1); - using SequenceNumber = uint16_t; + static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + static qint64 localHeaderSize(PacketType::Value type); static qint64 maxPayloadSize(PacketType::Value type); @@ -57,10 +57,10 @@ public: protected: Packet(PacketType::Value type, int64_t size); - Packet(Packet&&) = delete; - Packet(const Packet&) = delete; - Packet& operator=(Packet&&) = delete; - Packet& operator=(const Packet&) = delete; + Packet(const Packet& other); + Packet& operator=(const Packet& other); + Packet(Packet&& other); + Packet& operator=(Packet&& other); // QIODevice virtual functions virtual qint64 writeData(const char* data, qint64 maxSize); From e953b36f584cf0b107cb9bf3c42fa8007cc0036d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 12:56:20 -0700 Subject: [PATCH 063/582] handle stats + data packet combination in OctreeSendThread --- .../src/octree/OctreeSendThread.cpp | 129 ++++++------ libraries/octree/src/OctreeSceneStats.cpp | 193 +++++++----------- libraries/octree/src/OctreeSceneStats.h | 8 +- 3 files changed, 146 insertions(+), 184 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index fdd3670a1b..d9ef20553f 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -144,111 +144,84 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // If we've got a stats message ready to send, then see if we can piggyback them together if (nodeData->stats.isReadyToSend() && !nodeData->isShuttingDown()) { // Send the stats message to the client - unsigned char* statsMessage = nodeData->stats.getStatsMessage(); - int statsMessageLength = nodeData->stats.getStatsMessageLength(); - int piggyBackSize = nodeData->getPacketLength() + statsMessageLength; + NLPacket& statsPacket = nodeData->stats.getStatsMessage(); // If the size of the stats message and the octree message will fit in a packet, then piggyback them - if (piggyBackSize < MAX_PACKET_SIZE) { + if (nodeData->getPacket()->getSizeUsed() < statsPacket->bytesAvailable()) { // copy octree message to back of stats message - memcpy(statsMessage + statsMessageLength, nodeData->getPacket(), nodeData->getPacketLength()); - statsMessageLength += nodeData->getPacketLength(); + statsPacket->write(nodeData->getPacket()->getData(), nodeData->getPacket()->getSizeWithHeader()); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. int thisWastedBytes = 0; _totalWastedBytes += thisWastedBytes; - _totalBytes += nodeData->getPacketLength(); + _totalBytes += statsPacket->getSizeWithHeader(); _totalPackets++; + if (debug) { - const unsigned char* messageData = nodeData->getPacket(); - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(messageData)); - const unsigned char* dataAt = messageData + numBytesPacketHeader; - dataAt += sizeof(OCTREE_PACKET_FLAGS); - OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + NLPacket& sentPacket = nodeData->getPacket(); + + sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + + OCTREE_PACKET_SEQUENCE sequence; + sentPacket->read(&sequence, sizeof(sequence)); + + OCTREE_PACKET_SENT_TIME timestamp; + sentPacket->read(×tamp, sizeof(timestamp)); qDebug() << "Adding stats to packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " statsMessageLength: " << statsMessageLength << - " original size: " << nodeData->getPacketLength() << " [" << _totalBytes << + " statsMessageLength: " << statsPacket->getSizeWithHeader() << + " original size: " << nodeData->getPacket()->getSizeWithHeader() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } // actually send it OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->writeDatagram((char*) statsMessage, statsMessageLength, _node); + DependencyManager::get()->sendUnreliablePacket(statsPacket, _node); packetSent = true; } else { // not enough room in the packet, send two packets OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->writeDatagram((char*) statsMessage, statsMessageLength, _node); + DependencyManager::get()-sendUnreliablePacket(statsPacket, _node); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. int thisWastedBytes = 0; _totalWastedBytes += thisWastedBytes; - _totalBytes += statsMessageLength; + _totalBytes += statsPacket->getSizeWithHeader(); _totalPackets++; + if (debug) { - const unsigned char* messageData = nodeData->getPacket(); - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(messageData)); - const unsigned char* dataAt = messageData + numBytesPacketHeader; - dataAt += sizeof(OCTREE_PACKET_FLAGS); - OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + NLPacket& sentPacket = nodeData->getPacket(); + + sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + + OCTREE_PACKET_SEQUENCE sequence; + sentPacket->read(&sequence, sizeof(sequence)); + + OCTREE_PACKET_SENT_TIME timestamp; + sentPacket->read(×tamp, sizeof(timestamp)); qDebug() << "Sending separate stats packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " size: " << statsMessageLength << " [" << _totalBytes << + " size: " << statsPacket->getSizeWithHeader() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } - trueBytesSent += statsMessageLength; + trueBytesSent += statsPacket->getSizeWithHeader(); truePacketsSent++; packetsSent++; - OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->writeDatagram((char*)nodeData->getPacket(), nodeData->getPacketLength(), _node); - packetSent = true; - - thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); - _totalWastedBytes += thisWastedBytes; - _totalBytes += nodeData->getPacketLength(); - _totalPackets++; - if (debug) { - const unsigned char* messageData = nodeData->getPacket(); - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(messageData)); - const unsigned char* dataAt = messageData + numBytesPacketHeader; - dataAt += sizeof(OCTREE_PACKET_FLAGS); - OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SENT_TIME); - - qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << - " timestamp: " << timestamp << - " size: " << nodeData->getPacketLength() << " [" << _totalBytes << - "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; - } - } - nodeData->stats.markAsSent(); - } else { - // If there's actually a packet waiting, then send it. - if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) { - // just send the octree packet OctreeServer::didCallWriteDatagram(this); DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), _node); packetSent = true; - int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); + int packetSizeWithHeader = nodeData->getPacket()->getSizeWithHeader(); + thisWastedBytes = MAX_PACKET_SIZE - packetSizeWithHeader; _totalWastedBytes += thisWastedBytes; - _totalBytes += nodeData->getPacketLength(); + _totalBytes += nodeData->getPacket()->getSizeWithHeader(); _totalPackets++; if (debug) { @@ -264,7 +237,39 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " size: " << nodeData->getPacketLength() << " [" << _totalBytes << + " size: " << nodeData->getPacket()->getSizeWithHeader() << " [" << _totalBytes << + "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; + } + } + nodeData->stats.markAsSent(); + } else { + // If there's actually a packet waiting, then send it. + if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) { + // just send the octree packet + OctreeServer::didCallWriteDatagram(this); + DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), _node); + packetSent = true; + + int packetSizeWithHeader = nodeData->getPacket()->getSizeWithHeader(); + int thisWastedBytes = MAX_PACKET_SIZE -; + _totalWastedBytes += thisWastedBytes; + _totalBytes += packetSizeWithHeader; + _totalPackets++; + + if (debug) { + NLPacket& sentPacket = nodeData->getPacket(); + + sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + + OCTREE_PACKET_SEQUENCE sequence; + sentPacket->read(&sequence, sizeof(sequence)); + + OCTREE_PACKET_SENT_TIME timestamp; + sentPacket->read(×tamp, sizeof(timestamp)); + + qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << + " timestamp: " << timestamp << + " size: " << packetSizeWithHeader << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } } diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 0d24012c24..9141b0a989 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -24,14 +24,13 @@ const int samples = 100; -OctreeSceneStats::OctreeSceneStats() : +OctreeSceneStats::OctreeSceneStats() : _isReadyToSend(false), _isStarted(false), _lastFullElapsed(0), _lastFullTotalEncodeTime(0), _lastFullTotalPackets(0), _lastFullTotalBytes(0), - _elapsedAverage(samples), _bitsPerOctreeAverage(samples), _incomingPacket(0), @@ -121,8 +120,8 @@ void OctreeSceneStats::copyFromOther(const OctreeSceneStats& other) { } } _jurisdictionEndNodes.clear(); - - // Now copy the values from the other + + // Now copy the values from the other if (other._jurisdictionRoot) { int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(other._jurisdictionRoot)); _jurisdictionRoot = new unsigned char[bytes]; @@ -154,14 +153,14 @@ void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, OctreeEleme reset(); // resets packet and octree stats _isStarted = true; _start = usecTimestampNow(); - + _totalElements = OctreeElement::getNodeCount(); _totalInternal = OctreeElement::getInternalNodeCount(); _totalLeaves = OctreeElement::getLeafNodeCount(); - + _isFullScene = isFullScene; _isMoving = isMoving; - + if (_jurisdictionRoot) { delete[] _jurisdictionRoot; _jurisdictionRoot = NULL; @@ -201,13 +200,13 @@ void OctreeSceneStats::sceneCompleted() { _end = usecTimestampNow(); _elapsed = _end - _start; _elapsedAverage.updateAverage((float)_elapsed); - + if (_isFullScene) { _lastFullElapsed = _elapsed; _lastFullTotalEncodeTime = _totalEncodeTime; } - _statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage)); + packIntoPacket(); _isReadyToSend = true; _isStarted = false; } @@ -382,105 +381,65 @@ void OctreeSceneStats::childBitsRemoved(bool includesExistsBits, bool includesCo _treesRemoved++; } -int OctreeSceneStats::packIntoMessage(unsigned char* destinationBuffer, int availableBytes) { - unsigned char* bufferStart = destinationBuffer; - - int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), - PacketTypeOctreeStats); - destinationBuffer += headerLength; - - memcpy(destinationBuffer, &_start, sizeof(_start)); - destinationBuffer += sizeof(_start); - memcpy(destinationBuffer, &_end, sizeof(_end)); - destinationBuffer += sizeof(_end); - memcpy(destinationBuffer, &_elapsed, sizeof(_elapsed)); - destinationBuffer += sizeof(_elapsed); - memcpy(destinationBuffer, &_totalEncodeTime, sizeof(_totalEncodeTime)); - destinationBuffer += sizeof(_totalEncodeTime); - memcpy(destinationBuffer, &_isFullScene, sizeof(_isFullScene)); - destinationBuffer += sizeof(_isFullScene); - memcpy(destinationBuffer, &_isMoving, sizeof(_isMoving)); - destinationBuffer += sizeof(_isMoving); - memcpy(destinationBuffer, &_packets, sizeof(_packets)); - destinationBuffer += sizeof(_packets); - memcpy(destinationBuffer, &_bytes, sizeof(_bytes)); - destinationBuffer += sizeof(_bytes); +int OctreeSceneStats::packIntoPacket() { + _statsPacket->reset(); - memcpy(destinationBuffer, &_totalInternal, sizeof(_totalInternal)); - destinationBuffer += sizeof(_totalInternal); - memcpy(destinationBuffer, &_totalLeaves, sizeof(_totalLeaves)); - destinationBuffer += sizeof(_totalLeaves); - memcpy(destinationBuffer, &_internal, sizeof(_internal)); - destinationBuffer += sizeof(_internal); - memcpy(destinationBuffer, &_leaves, sizeof(_leaves)); - destinationBuffer += sizeof(_leaves); - memcpy(destinationBuffer, &_internalSkippedDistance, sizeof(_internalSkippedDistance)); - destinationBuffer += sizeof(_internalSkippedDistance); - memcpy(destinationBuffer, &_leavesSkippedDistance, sizeof(_leavesSkippedDistance)); - destinationBuffer += sizeof(_leavesSkippedDistance); - memcpy(destinationBuffer, &_internalSkippedOutOfView, sizeof(_internalSkippedOutOfView)); - destinationBuffer += sizeof(_internalSkippedOutOfView); - memcpy(destinationBuffer, &_leavesSkippedOutOfView, sizeof(_leavesSkippedOutOfView)); - destinationBuffer += sizeof(_leavesSkippedOutOfView); - memcpy(destinationBuffer, &_internalSkippedWasInView, sizeof(_internalSkippedWasInView)); - destinationBuffer += sizeof(_internalSkippedWasInView); - memcpy(destinationBuffer, &_leavesSkippedWasInView, sizeof(_leavesSkippedWasInView)); - destinationBuffer += sizeof(_leavesSkippedWasInView); - memcpy(destinationBuffer, &_internalSkippedNoChange, sizeof(_internalSkippedNoChange)); - destinationBuffer += sizeof(_internalSkippedNoChange); - memcpy(destinationBuffer, &_leavesSkippedNoChange, sizeof(_leavesSkippedNoChange)); - destinationBuffer += sizeof(_leavesSkippedNoChange); - memcpy(destinationBuffer, &_internalSkippedOccluded, sizeof(_internalSkippedOccluded)); - destinationBuffer += sizeof(_internalSkippedOccluded); - memcpy(destinationBuffer, &_leavesSkippedOccluded, sizeof(_leavesSkippedOccluded)); - destinationBuffer += sizeof(_leavesSkippedOccluded); - memcpy(destinationBuffer, &_internalColorSent, sizeof(_internalColorSent)); - destinationBuffer += sizeof(_internalColorSent); - memcpy(destinationBuffer, &_leavesColorSent, sizeof(_leavesColorSent)); - destinationBuffer += sizeof(_leavesColorSent); - memcpy(destinationBuffer, &_internalDidntFit, sizeof(_internalDidntFit)); - destinationBuffer += sizeof(_internalDidntFit); - memcpy(destinationBuffer, &_leavesDidntFit, sizeof(_leavesDidntFit)); - destinationBuffer += sizeof(_leavesDidntFit); - memcpy(destinationBuffer, &_colorBitsWritten, sizeof(_colorBitsWritten)); - destinationBuffer += sizeof(_colorBitsWritten); - memcpy(destinationBuffer, &_existsBitsWritten, sizeof(_existsBitsWritten)); - destinationBuffer += sizeof(_existsBitsWritten); - memcpy(destinationBuffer, &_existsInPacketBitsWritten, sizeof(_existsInPacketBitsWritten)); - destinationBuffer += sizeof(_existsInPacketBitsWritten); - memcpy(destinationBuffer, &_treesRemoved, sizeof(_treesRemoved)); - destinationBuffer += sizeof(_treesRemoved); + _statsPacket->write(&_start, sizeof(_start)); + _statsPacket->write(&_end, sizeof(_end)); + _statsPacket->write(&_elapsed, sizeof(_elapsed)); + _statsPacket->write(&_totalEncodeTime, sizeof(_totalEncodeTime)); + _statsPacket->write(&_isFullScene, sizeof(_isFullScene)); + _statsPacket->write(&_isMoving, sizeof(_isMoving)); + _statsPacket->write(&_packets, sizeof(_packets)); + _statsPacket->write(&_bytes, sizeof(_bytes)); + + _statsPacket->write(&_totalInternal, sizeof(_totalInternal)); + _statsPacket->write(&_totalLeaves, sizeof(_totalLeaves)); + _statsPacket->write(&_internal, sizeof(_internal)); + _statsPacket->write(&_leaves, sizeof(_leaves)); + _statsPacket->write(&_internalSkippedDistance, sizeof(_internalSkippedDistance)); + _statsPacket->write(&_leavesSkippedDistance, sizeof(_leavesSkippedDistance)); + _statsPacket->write(&_internalSkippedOutOfView, sizeof(_internalSkippedOutOfView)); + _statsPacket->write(&_leavesSkippedOutOfView, sizeof(_leavesSkippedOutOfView)); + _statsPacket->write(&_internalSkippedWasInView, sizeof(_internalSkippedWasInView)); + _statsPacket->write(&_leavesSkippedWasInView, sizeof(_leavesSkippedWasInView)); + _statsPacket->write(&_internalSkippedNoChange, sizeof(_internalSkippedNoChange)); + _statsPacket->write(&_leavesSkippedNoChange, sizeof(_leavesSkippedNoChange)); + _statsPacket->write(&_internalSkippedOccluded, sizeof(_internalSkippedOccluded)); + _statsPacket->write(&_leavesSkippedOccluded, sizeof(_leavesSkippedOccluded)); + _statsPacket->write(&_internalColorSent, sizeof(_internalColorSent)); + _statsPacket->write(&_leavesColorSent, sizeof(_leavesColorSent)); + _statsPacket->write(&_internalDidntFit, sizeof(_internalDidntFit)); + _statsPacket->write(&_leavesDidntFit, sizeof(_leavesDidntFit)); + _statsPacket->write(&_colorBitsWritten, sizeof(_colorBitsWritten)); + _statsPacket->write(&_existsBitsWritten, sizeof(_existsBitsWritten)); + _statsPacket->write(&_existsInPacketBitsWritten, sizeof(_existsInPacketBitsWritten)); + _statsPacket->write(&_treesRemoved, sizeof(_treesRemoved)); // add the root jurisdiction if (_jurisdictionRoot) { - // copy the + // copy the int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_jurisdictionRoot)); - memcpy(destinationBuffer, &bytes, sizeof(bytes)); - destinationBuffer += sizeof(bytes); - memcpy(destinationBuffer, _jurisdictionRoot, bytes); - destinationBuffer += bytes; - - // if and only if there's a root jurisdiction, also include the end elements - int endNodeCount = _jurisdictionEndNodes.size(); + _statsPacket->write(&bytes, sizeof(bytes)); + _statsPacket->write(_jurisdictionRoot, bytes); - memcpy(destinationBuffer, &endNodeCount, sizeof(endNodeCount)); - destinationBuffer += sizeof(endNodeCount); + // if and only if there's a root jurisdiction, also include the end elements + int endNodeCount = _jurisdictionEndNodes.size(); + + _statsPacket->write(&endNodeCount, sizeof(endNodeCount)); for (int i=0; i < endNodeCount; i++) { unsigned char* endNodeCode = _jurisdictionEndNodes[i]; int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); - memcpy(destinationBuffer, &bytes, sizeof(bytes)); - destinationBuffer += sizeof(bytes); - memcpy(destinationBuffer, endNodeCode, bytes); - destinationBuffer += bytes; + _statsPacket->write(&bytes, sizeof(bytes)); + _statsPacket->write(endNodeCode, bytes); } } else { int bytes = 0; - memcpy(destinationBuffer, &bytes, sizeof(bytes)); - destinationBuffer += sizeof(bytes); + _statsPacket->write(&bytes, sizeof(bytes)); } - - return destinationBuffer - bufferStart; // includes header! + + return _statsPacket->getSizeUsed(); } int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes) { @@ -489,7 +448,7 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a // increment to push past the packet header int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(sourceBuffer)); sourceBuffer += numBytesPacketHeader; - + memcpy(&_start, sourceBuffer, sizeof(_start)); sourceBuffer += sizeof(_start); memcpy(&_end, sourceBuffer, sizeof(_end)); @@ -526,13 +485,13 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a memcpy(&_leaves, sourceBuffer, sizeof(_leaves)); sourceBuffer += sizeof(_leaves); _traversed = _internal + _leaves; - + memcpy(&_internalSkippedDistance, sourceBuffer, sizeof(_internalSkippedDistance)); sourceBuffer += sizeof(_internalSkippedDistance); memcpy(&_leavesSkippedDistance, sourceBuffer, sizeof(_leavesSkippedDistance)); sourceBuffer += sizeof(_leavesSkippedDistance); _skippedDistance = _internalSkippedDistance + _leavesSkippedDistance; - + memcpy(&_internalSkippedOutOfView, sourceBuffer, sizeof(_internalSkippedOutOfView)); sourceBuffer += sizeof(_internalSkippedOutOfView); memcpy(&_leavesSkippedOutOfView, sourceBuffer, sizeof(_leavesSkippedOutOfView)); @@ -619,7 +578,7 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a _jurisdictionEndNodes.push_back(endNodeCode); } } - + // running averages _elapsedAverage.updateAverage((float)_elapsed); unsigned long total = _existsInPacketBitsWritten + _colorSent; @@ -732,75 +691,75 @@ const char* OctreeSceneStats::getItemValue(Item item) { unsigned long total = _existsInPacketBitsWritten + _colorSent; float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total; float averageBPV = _bitsPerOctreeAverage.getAverage(); - sprintf(_itemValueBuffer, "%lu (%.2f bits/octree Average: %.2f bits/octree) %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu (%.2f bits/octree Average: %.2f bits/octree) %lu internal %lu leaves", total, (double)calculatedBPV, (double)averageBPV, (long unsigned int)_existsInPacketBitsWritten, (long unsigned int)_colorSent); break; } case ITEM_TRAVERSED: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", (long unsigned int)_traversed, (long unsigned int)_internal, (long unsigned int)_leaves); break; } case ITEM_SKIPPED: { - unsigned long total = _skippedDistance + _skippedOutOfView + + unsigned long total = _skippedDistance + _skippedOutOfView + _skippedWasInView + _skippedNoChange + _skippedOccluded; - - unsigned long internal = _internalSkippedDistance + _internalSkippedOutOfView + + + unsigned long internal = _internalSkippedDistance + _internalSkippedOutOfView + _internalSkippedWasInView + _internalSkippedNoChange + _internalSkippedOccluded; - - unsigned long leaves = _leavesSkippedDistance + _leavesSkippedOutOfView + + + unsigned long leaves = _leavesSkippedDistance + _leavesSkippedOutOfView + _leavesSkippedWasInView + _leavesSkippedNoChange + _leavesSkippedOccluded; - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", total, internal, leaves); break; } case ITEM_SKIPPED_DISTANCE: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", (long unsigned int)_skippedDistance, (long unsigned int)_internalSkippedDistance, (long unsigned int)_leavesSkippedDistance); break; } case ITEM_SKIPPED_OUT_OF_VIEW: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", (long unsigned int)_skippedOutOfView, (long unsigned int)_internalSkippedOutOfView, (long unsigned int)_leavesSkippedOutOfView); break; } case ITEM_SKIPPED_WAS_IN_VIEW: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", (long unsigned int)_skippedWasInView, (long unsigned int)_internalSkippedWasInView, (long unsigned int)_leavesSkippedWasInView); break; } case ITEM_SKIPPED_NO_CHANGE: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", (long unsigned int)_skippedNoChange, (long unsigned int)_internalSkippedNoChange, (long unsigned int)_leavesSkippedNoChange); break; } case ITEM_SKIPPED_OCCLUDED: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", (long unsigned int)_skippedOccluded, (long unsigned int)_internalSkippedOccluded, (long unsigned int)_leavesSkippedOccluded); break; } case ITEM_COLORS: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves", (long unsigned int)_colorSent, (long unsigned int)_internalColorSent, (long unsigned int)_leavesColorSent); break; } case ITEM_DIDNT_FIT: { - sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves (removed: %lu)", + sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves (removed: %lu)", (long unsigned int)_didntFit, (long unsigned int)_internalDidntFit, (long unsigned int)_leavesDidntFit, @@ -808,14 +767,14 @@ const char* OctreeSceneStats::getItemValue(Item item) { break; } case ITEM_BITS: { - sprintf(_itemValueBuffer, "colors: %lu, exists: %lu, in packets: %lu", + sprintf(_itemValueBuffer, "colors: %lu, exists: %lu, in packets: %lu", (long unsigned int)_colorBitsWritten, (long unsigned int)_existsBitsWritten, (long unsigned int)_existsInPacketBitsWritten); break; } case ITEM_MODE: { - sprintf(_itemValueBuffer, "%s - %s", (_isFullScene ? "Full Scene" : "Partial Scene"), + sprintf(_itemValueBuffer, "%s - %s", (_isFullScene ? "Full Scene" : "Partial Scene"), (_isMoving ? "Moving" : "Stationary")); break; } @@ -842,7 +801,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, //bool packetIsColored = oneAtBit(flags, PACKET_IS_COLOR_BIT); //bool packetIsCompressed = oneAtBit(flags, PACKET_IS_COMPRESSED_BIT); - + OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow(); qint64 flightTime = arrivedAt - sentAt + nodeClockSkewUsec; @@ -865,7 +824,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, << "nodeClockSkewUsec:" << nodeClockSkewUsec << "usecs";; return; // ignore any packets that are unreasonable } - + _incomingOctreeSequenceNumberStats.sequenceNumberReceived(sequence); // track packets here... diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index fcb0c0415d..901a9f1544 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -91,7 +91,7 @@ public: void childBitsRemoved(bool includesExistsBits, bool includesColors); /// Pack the details of the statistics into a buffer for sending as a network packet - int packIntoMessage(unsigned char* destinationBuffer, int availableBytes); + int packIntoPacket(); /// Unpack the details of the statistics from a buffer typically received as a network packet int unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes); @@ -102,8 +102,7 @@ public: /// Mark that the scene statistics have been sent void markAsSent() { _isReadyToSend = false; } - unsigned char* getStatsMessage() { return &_statsMessage[0]; } - int getStatsMessageLength() const { return _statsMessageLength; } + NLPacket& getStatsMessage() { return *_statsPacket; } /// List of various items tracked by OctreeSceneStats which can be accessed via getItemInfo() and getItemValue() enum Item { @@ -176,9 +175,8 @@ private: void copyFromOther(const OctreeSceneStats& other); bool _isReadyToSend; - unsigned char _statsMessage[MAX_PACKET_SIZE]; - qint32 _statsMessageLength; + std::unique_ptr _statsPacket { NLPacket::create(PacketType::OctreeStats); } // scene timing data in usecs bool _isStarted; From abfda21814c738cd5d722aa2172a32a5169c16b0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 14:47:36 -0700 Subject: [PATCH 064/582] CR fixes in AssignmentClientMonitor --- assignment-client/src/AssignmentClientMonitor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 4c034721d1..75c8446d84 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -195,7 +195,7 @@ void AssignmentClientMonitor::checkSpares() { SharedNodePointer childNode = nodeList->nodeWithUUID(aSpareId); childNode->activateLocalSocket(); - auto diePacket { NLPacket::create(PacketType::StopNode); } + auto diePacket = NLPacket::create(PacketType::StopNode, 0); nodeList->sendPacket(diePacket, childNode); } } @@ -230,7 +230,7 @@ void AssignmentClientMonitor::readPendingDatagrams() { // tell unknown assignment-client child to exit. qDebug() << "asking unknown child to exit."; - auto diePacket { NL::create(PacketType::StopNode); } + auto diePacket = NL::create(PacketType::StopNode, 0); nodeList->sendPacket(diePacket, childNode); } } From e7fee26d1a1e62195d0412e848cf1142f8c467bc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 14:50:05 -0700 Subject: [PATCH 065/582] give specific packet size for audio env packet --- assignment-client/src/audio/AudioMixer.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 055294b9bf..654c5dd169 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -509,18 +509,26 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { if (sendData) { auto nodeList = DependencyManager::get(); - auto envPacket = NLPacket::create(PacketType::AudioEnvironment); unsigned char bitset = 0; + + int packetSize = sizeof(bitset); + + if (hasReverb) { + packetSize += sizeof(reverbTime) + sizeof(wetLevel); + } + + auto envPacket = NLPacket::create(PacketType::AudioEnvironment, packetSize); + if (hasReverb) { setAtBit(bitset, HAS_REVERB_BIT); } - envPacket.write(&bitset, sizeof(unsigned char)); + envPacket.write(&bitset, sizeof(bitset)); if (hasReverb) { - envPacket.write(&reverbTime, sizeof(float)); - envPacket.write(&wetLevel, sizeof(float)); + envPacket.write(&reverbTime, sizeof(reverb)); + envPacket.write(&wetLevel, sizeof(wetLevel)); } nodeList->sendPacket(envPacket, node); } From 6760b048b643035ce59f85332ab474daa1288dd2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 14:50:37 -0700 Subject: [PATCH 066/582] fix for initialization of mute packet --- assignment-client/src/audio/AudioMixer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 654c5dd169..03855f3e95 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -793,7 +793,7 @@ void AudioMixer::run() { // if the stream should be muted, send mute packet if (nodeData->getAvatarAudioStream() && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { - auto mutePacket { NLPacket::create(PacketType::NoisyMute); } + auto mutePacket = NLPacket::create(PacketType::NoisyMute, 0); nodeList->sendPacket(mutePacket, node); } From 171ebf54372042899d1012ff2c2f8688ee0ae02c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 14:51:18 -0700 Subject: [PATCH 067/582] fix for mix packet sizes in audio --- assignment-client/src/audio/AudioMixer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 03855f3e95..4577f2015f 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -806,7 +806,7 @@ void AudioMixer::run() { if (streamsMixed > 0) { int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO; - mixPacket = NLPacket::create(PacketType::MixedAudio); + mixPacket = NLPacket::create(PacketType::MixedAudio, mixPacketBytes); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); @@ -816,7 +816,7 @@ void AudioMixer::run() { mixPacket.write(mixSamples, AudioConstants::NETWORK_FRAME_BYTES_STEREO); } else { int silentPacketBytes = sizeof(quint16) + sizeof(quint16); - mixPacket = NLPacket::create(PacketType::SilentAudioFrame); + mixPacket = NLPacket::create(PacketType::SilentAudioFrame, silentPacketBytes); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); From 733206b872b952847dd2e0750f16699847372817 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 14:53:45 -0700 Subject: [PATCH 068/582] fix for initialization of stats packet --- libraries/audio-client/src/AudioIOStats.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index 746faea4a7..8e0afff9d2 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -111,7 +111,7 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { AudioStreamStats stats = _receivedAudioStream->getAudioStreamStats(); int statsPacketSize = sizeof(appendFlag) + sizeof(numStreamStatsToPack) + sizeof(stats); - auto statsPacket { NLPacket::create(PacketType::AudioStreamStats, statsPacketSize); } + auto statsPacket = NLPacket::create(PacketType::AudioStreamStats, statsPacketSize); // pack append flag statsPacket->write(&appendFlag, sizeof(appendFlag)); From f6cd67f75eb5a0e0587f931dbc8399065b5397ab Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 14:55:58 -0700 Subject: [PATCH 069/582] repairs to stats packet in AudioMixerClientData --- assignment-client/src/audio/AudioMixerClientData.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 05dc54665f..f4fbbb87f9 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -158,19 +158,22 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& // pack and send stream stats packets until all audio streams' stats are sent int numStreamStatsRemaining = _audioStreams.size(); QHash::ConstIterator audioStreamsIterator = _audioStreams.constBegin(); + + PacketList statsPacketList(PacketType::AudioStreamStats); + while (numStreamStatsRemaining > 0) { - auto statsPacket { NLPacket::create(PacketType::AudioStreamStats); } + auto statsPacket = NLPacket::create(PacketType::AudioStreamStats); // pack the append flag in this packet - statsPacket.write(&appendFlag, sizeof(quint8)); + statsPacket->write(&appendFlag, sizeof(quint8)); appendFlag = 1; int numStreamStatsRoomFor = (statsPacket.size() - sizeof(quint8) - sizeof(quint16)) / sizeof(AudioStreamStats); // calculate and pack the number of stream stats to follow quint16 numStreamStatsToPack = std::min(numStreamStatsRemaining, numStreamStatsRoomFor); - statsPacket.write(&numStreamStatsToPack, sizeof(quint16)); + statsPacket->write(&numStreamStatsToPack, sizeof(quint16)); // pack the calculated number of stream stats for (int i = 0; i < numStreamStatsToPack; i++) { @@ -179,10 +182,11 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& stream->perSecondCallbackForUpdatingStats(); AudioStreamStats streamStats = stream->getAudioStreamStats(); - statsPacket.write(&streamStats, sizeof(AudioStreamStats)); + statsPacket->write(&streamStats, sizeof(AudioStreamStats)); audioStreamsIterator++; } + numStreamStatsRemaining -= numStreamStatsToPack; // send the current packet From ffa6edc904a7603f706472dbdaeddcb8d272b73a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:01:19 -0700 Subject: [PATCH 070/582] fix spaces created by xcode find/replace --- assignment-client/src/audio/AvatarAudioStream.cpp | 4 ++-- assignment-client/src/audio/AvatarAudioStream.h | 4 ++-- libraries/audio/src/InboundAudioStream.cpp | 4 ++-- libraries/audio/src/InboundAudioStream.h | 4 ++-- libraries/audio/src/InjectedAudioStream.cpp | 2 +- libraries/audio/src/InjectedAudioStream.h | 2 +- libraries/audio/src/MixedProcessedAudioStream.cpp | 2 +- libraries/audio/src/MixedProcessedAudioStream.h | 2 +- libraries/entities/src/EntityEditPacketSender.cpp | 4 ++-- libraries/entities/src/EntityEditPacketSender.h | 4 ++-- libraries/entities/src/EntityItemProperties.cpp | 2 +- libraries/entities/src/EntityItemProperties.h | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 2 +- libraries/entities/src/EntityScriptingInterface.h | 2 +- libraries/entities/src/EntityTree.cpp | 4 ++-- libraries/entities/src/EntityTree.h | 4 ++-- libraries/networking/src/LimitedNodeList.h | 4 ++-- libraries/networking/src/Node.cpp | 2 +- libraries/octree/src/EditPacketBuffer.cpp | 2 +- libraries/octree/src/EditPacketBuffer.h | 2 +- libraries/octree/src/Octree.h | 4 ++-- libraries/octree/src/OctreeEditPacketSender.cpp | 4 ++-- libraries/octree/src/OctreeEditPacketSender.h | 6 +++--- 23 files changed, 36 insertions(+), 36 deletions(-) diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index 9fd44d9e85..0cece94094 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -18,7 +18,7 @@ AvatarAudioStream::AvatarAudioStream(bool isStereo, const InboundAudioStream::Se { } -int AvatarAudioStream::parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { +int AvatarAudioStream::parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { int readBytes = 0; if (type == PacketTypeSilentAudioFrame) { @@ -53,6 +53,6 @@ int AvatarAudioStream::parseStreamProperties (PacketType::Value type, const QByt int numAudioBytes = packetAfterSeqNum.size() - readBytes; numAudioSamples = numAudioBytes / sizeof(int16_t); } - + return readBytes; } diff --git a/assignment-client/src/audio/AvatarAudioStream.h b/assignment-client/src/audio/AvatarAudioStream.h index 78f57bb18f..7dc87f7d41 100644 --- a/assignment-client/src/audio/AvatarAudioStream.h +++ b/assignment-client/src/audio/AvatarAudioStream.h @@ -19,13 +19,13 @@ class AvatarAudioStream : public PositionalAudioStream { public: AvatarAudioStream(bool isStereo, const InboundAudioStream::Settings& settings); - + private: // disallow copying of AvatarAudioStream objects AvatarAudioStream(const AvatarAudioStream&); AvatarAudioStream& operator= (const AvatarAudioStream&); - int parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); + int parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); }; #endif // hifi_AvatarAudioStream_h diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 3725c22988..c885a67674 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -168,7 +168,7 @@ int InboundAudioStream::parseData(const QByteArray& packet) { return readBytes; } -int InboundAudioStream::parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { +int InboundAudioStream::parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { if (type == PacketTypeSilentAudioFrame) { quint16 numSilentSamples = 0; memcpy(&numSilentSamples, packetAfterSeqNum.constData(), sizeof(quint16)); @@ -181,7 +181,7 @@ int InboundAudioStream::parseStreamProperties (PacketType::Value type, const QBy } } -int InboundAudioStream::parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int numAudioSamples) { +int InboundAudioStream::parseAudioData(PacketType::Value type, const QByteArray& packetAfterStreamProperties, int numAudioSamples) { return _ringBuffer.writeData(packetAfterStreamProperties.data(), numAudioSamples * sizeof(int16_t)); } diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 370d853bd2..cb8494f23e 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -194,11 +194,11 @@ protected: /// parses the info between the seq num and the audio data in the network packet and calculates /// how many audio samples this packet contains (used when filling in samples for dropped packets). /// default implementation assumes no stream properties and raw audio samples after stream propertiess - virtual int parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& networkSamples); + virtual int parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& networkSamples); /// parses the audio data in the network packet. /// default implementation assumes packet contains raw audio samples after stream properties - virtual int parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples); + virtual int parseAudioData(PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples); /// writes silent samples to the buffer that may be dropped to reduce latency caused by the buffer virtual int writeDroppableSilentSamples(int silentSamples); diff --git a/libraries/audio/src/InjectedAudioStream.cpp b/libraries/audio/src/InjectedAudioStream.cpp index b1005fb9db..b7e9a40942 100644 --- a/libraries/audio/src/InjectedAudioStream.cpp +++ b/libraries/audio/src/InjectedAudioStream.cpp @@ -30,7 +30,7 @@ InjectedAudioStream::InjectedAudioStream(const QUuid& streamIdentifier, const bo const uchar MAX_INJECTOR_VOLUME = 255; -int InjectedAudioStream::parseStreamProperties (PacketType::Value type, +int InjectedAudioStream::parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { // setup a data stream to read from this packet diff --git a/libraries/audio/src/InjectedAudioStream.h b/libraries/audio/src/InjectedAudioStream.h index 29a9947a24..2460f83f40 100644 --- a/libraries/audio/src/InjectedAudioStream.h +++ b/libraries/audio/src/InjectedAudioStream.h @@ -31,7 +31,7 @@ private: InjectedAudioStream& operator= (const InjectedAudioStream&); AudioStreamStats getAudioStreamStats() const; - int parseStreamProperties (PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); + int parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples); const QUuid _streamIdentifier; float _radius; diff --git a/libraries/audio/src/MixedProcessedAudioStream.cpp b/libraries/audio/src/MixedProcessedAudioStream.cpp index 2a5b94cac1..f596c3a8b3 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.cpp +++ b/libraries/audio/src/MixedProcessedAudioStream.cpp @@ -42,7 +42,7 @@ int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int samples) { return deviceSamplesWritten; } -int MixedProcessedAudioStream::parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples) { +int MixedProcessedAudioStream::parseAudioData(PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples) { emit addedStereoSamples(packetAfterStreamProperties); diff --git a/libraries/audio/src/MixedProcessedAudioStream.h b/libraries/audio/src/MixedProcessedAudioStream.h index efd06b996e..265095597b 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.h +++ b/libraries/audio/src/MixedProcessedAudioStream.h @@ -35,7 +35,7 @@ public: protected: int writeDroppableSilentSamples(int silentSamples); int writeLastFrameRepeatedWithFade(int samples); - int parseAudioData (PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples); + int parseAudioData(PacketType::Value type, const QByteArray& packetAfterStreamProperties, int networkSamples); private: int networkToDeviceSamples(int networkSamples); diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index c6c61f70a0..e5225b5ebb 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -18,7 +18,7 @@ #include "EntityItem.h" -void EntityEditPacketSender::adjustEditPacketForClockSkew (PacketType::Value type, +void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew) { if (type == PacketTypeEntityAdd || type == PacketTypeEntityEdit) { @@ -26,7 +26,7 @@ void EntityEditPacketSender::adjustEditPacketForClockSkew (PacketType::Value typ } } -void EntityEditPacketSender::queueEditEntityMessage (PacketType::Value type, EntityItemID modelID, +void EntityEditPacketSender::queueEditEntityMessage(PacketType::Value type, EntityItemID modelID, const EntityItemProperties& properties) { if (!_shouldSend) { return; // bail early diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index ff0c02789e..ce88f41b04 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -24,12 +24,12 @@ public: /// which voxel-server node or nodes the packet should be sent to. Can be called even before voxel servers are known, in /// which case up to MaxPendingMessages will be buffered and processed when voxel servers are known. /// NOTE: EntityItemProperties assumes that all distances are in meter units - void queueEditEntityMessage (PacketType::Value type, EntityItemID modelID, const EntityItemProperties& properties); + void queueEditEntityMessage(PacketType::Value type, EntityItemID modelID, const EntityItemProperties& properties); void queueEraseEntityMessage(const EntityItemID& entityItemID); // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual void adjustEditPacketForClockSkew (PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew); + virtual void adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew); }; #endif // hifi_EntityEditPacketSender_h diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index ae021a7b67..7e7b21417e 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -614,7 +614,7 @@ void EntityItemPropertiesFromScriptValueHonorReadOnly(const QScriptValue &object // // TODO: Implement support for script and visible properties. // -bool EntityItemProperties::encodeEntityEditPacket (PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, +bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, unsigned char* bufferOut, int sizeIn, int& sizeOut) { OctreePacketData ourDataPacket(false, sizeIn); // create a packetData object to add out packet details too. OctreePacketData* packetData = &ourDataPacket; // we want a pointer to this so we can use our APPEND_ENTITY_PROPERTY macro diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index a1f64e03bd..8bc932c0ed 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -174,7 +174,7 @@ public: void setGlowLevel(float value) { _glowLevel = value; _glowLevelChanged = true; } void setLocalRenderAlpha(float value) { _localRenderAlpha = value; _localRenderAlphaChanged = true; } - static bool encodeEntityEditPacket (PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, + static bool encodeEntityEditPacket(PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, unsigned char* bufferOut, int sizeIn, int& sizeOut); static bool encodeEraseEntityMessage(const EntityItemID& entityItemID, diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index e4b34fc51f..31f1f2cfc0 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -32,7 +32,7 @@ EntityScriptingInterface::EntityScriptingInterface() : connect(nodeList.data(), &NodeList::canRezChanged, this, &EntityScriptingInterface::canRezChanged); } -void EntityScriptingInterface::queueEntityMessage (PacketType::Value packetType, +void EntityScriptingInterface::queueEntityMessage(PacketType::Value packetType, EntityItemID entityID, const EntityItemProperties& properties) { getEntityPacketSender()->queueEditEntityMessage(packetType, entityID, properties); } diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 378a3cdf4a..c232437757 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -164,7 +164,7 @@ private: bool actionWorker(const QUuid& entityID, std::function actor); bool setVoxels(QUuid entityID, std::function actor); bool setPoints(QUuid entityID, std::function actor); - void queueEntityMessage (PacketType::Value packetType, EntityItemID entityID, const EntityItemProperties& properties); + void queueEntityMessage(PacketType::Value packetType, EntityItemID entityID, const EntityItemProperties& properties); /// actually does the work of finding the ray intersection, can be called in locking mode or tryLock mode RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 5a16f5a003..7d626f1a63 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -63,7 +63,7 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) { Octree::eraseAllOctreeElements(createNewRoot); } -bool EntityTree::handlesEditPacketType (PacketType::Value packetType) const { +bool EntityTree::handlesEditPacketType(PacketType::Value packetType) const { // we handle these types of "edit" packets switch (packetType) { case PacketTypeEntityAdd: @@ -572,7 +572,7 @@ EntityItemPointer EntityTree::findEntityByEntityItemID(const EntityItemID& entit return foundEntity; } -int EntityTree::processEditPacketData (PacketType::Value packetType, const unsigned char* packetData, int packetLength, +int EntityTree::processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode) { if (!getIsServer()) { diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 99d08fc937..5c65b94868 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -65,8 +65,8 @@ public: virtual PacketType::Value expectedDataPacketType() const { return PacketTypeEntityData; } virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion >= VERSION_ENTITIES_USE_METERS_AND_RADIANS; } - virtual bool handlesEditPacketType (PacketType::Value packetType) const; - virtual int processEditPacketData (PacketType::Value packetType, const unsigned char* packetData, int packetLength, + virtual bool handlesEditPacketType(PacketType::Value packetType) const; + virtual int processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode); virtual bool rootElementHasData() const { return true; } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 40d43ec02f..ceb0427ef0 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -119,7 +119,7 @@ public: bool packetVersionAndHashMatch(const QByteArray& packet); - // QByteArray byteArrayWithPopulatedHeader (PacketType::Value packetType) + // QByteArray byteArrayWithPopulatedHeader(PacketType::Value packetType) // { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } // int populatePacketHeader(QByteArray& packet, PacketType::Value packetType) // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } @@ -285,7 +285,7 @@ protected: void stopInitialSTUNUpdate(bool success); - void sendPacketToIceServer (PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& headerID, + void sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& headerID, const QUuid& peerRequestID = QUuid()); QUuid _sessionUUID; diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index fcb22a08b0..667e975398 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -67,7 +67,7 @@ void Node::updateClockSkewUsec(int clockSkewSample) { _clockSkewUsec = (int)_clockSkewMovingPercentile.getValueAtPercentile(); } -PacketSequenceNumber Node::getLastSequenceNumberForPacketType (PacketType::Value packetType) const { +PacketSequenceNumber Node::getLastSequenceNumberForPacketType(PacketType::Value packetType) const { auto typeMatch = _lastSequenceNumbers.find(packetType); if (typeMatch != _lastSequenceNumbers.end()) { return typeMatch->second; diff --git a/libraries/octree/src/EditPacketBuffer.cpp b/libraries/octree/src/EditPacketBuffer.cpp index 9968990692..966a315a41 100644 --- a/libraries/octree/src/EditPacketBuffer.cpp +++ b/libraries/octree/src/EditPacketBuffer.cpp @@ -20,7 +20,7 @@ EditPacketBuffer::EditPacketBuffer() : } -EditPacketBuffer::EditPacketBuffer (PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost, QUuid nodeUUID) : +EditPacketBuffer::EditPacketBuffer(PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost, QUuid nodeUUID) : _nodeUUID(nodeUUID), _currentType(type), _currentSize(length), diff --git a/libraries/octree/src/EditPacketBuffer.h b/libraries/octree/src/EditPacketBuffer.h index e817a07d12..9a7ec47b9a 100644 --- a/libraries/octree/src/EditPacketBuffer.h +++ b/libraries/octree/src/EditPacketBuffer.h @@ -21,7 +21,7 @@ class EditPacketBuffer { public: EditPacketBuffer(); - EditPacketBuffer (PacketType::Value type, unsigned char* codeColorBuffer, size_t length, + EditPacketBuffer(PacketType::Value type, unsigned char* codeColorBuffer, size_t length, qint64 satoshiCost = 0, const QUuid nodeUUID = QUuid()); QUuid _nodeUUID; diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 2397c6bcae..ddded47171 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -230,8 +230,8 @@ public: virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion == versionForPacketType(expectedDataPacketType()); } virtual PacketVersion expectedVersion() const { return versionForPacketType(expectedDataPacketType()); } - virtual bool handlesEditPacketType (PacketType::Value packetType) const { return false; } - virtual int processEditPacketData (PacketType::Value packetType, const unsigned char* packetData, int packetLength, + virtual bool handlesEditPacketType(PacketType::Value packetType) const { return false; } + virtual int processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& sourceNode) { return 0; } virtual bool recurseChildrenWithData() const { return true; } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index d94d3b613c..e6c1a2fa35 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -159,7 +159,7 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { } } -void OctreeEditPacketSender::queuePendingPacketToNodes (PacketType::Value type, unsigned char* buffer, +void OctreeEditPacketSender::queuePendingPacketToNodes(PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost) { // If we're asked to save messages while waiting for voxel servers to arrive, then do so... @@ -213,7 +213,7 @@ void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, size_t le // NOTE: editPacketBuffer - is JUST the octcode/color and does not contain the packet header! -void OctreeEditPacketSender::queueOctreeEditMessage (PacketType::Value type, unsigned char* editPacketBuffer, +void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsigned char* editPacketBuffer, size_t length, qint64 satoshiCost) { if (!_shouldSend) { diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index a9b9efb73c..caeeea5508 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -30,7 +30,7 @@ public: /// Queues a single edit message. Will potentially send a pending multi-command packet. Determines which server /// node or nodes the packet should be sent to. Can be called even before servers are known, in which case up to /// MaxPendingMessages will be buffered and processed when servers are known. - void queueOctreeEditMessage (PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); + void queueOctreeEditMessage(PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); /// Releases all queued messages even if those messages haven't filled an MTU packet. This will move the packed message /// packets onto the send queue. If running in threaded mode, the caller does not need to do any further processing to @@ -81,7 +81,7 @@ public: // you must override these... virtual char getMyNodeType() const = 0; - virtual void adjustEditPacketForClockSkew (PacketType::Value type, + virtual void adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editPacketBuffer, size_t length, int clockSkew) { } bool hasDestinationWalletUUID() const { return !_destinationWalletUUID.isNull(); } @@ -99,7 +99,7 @@ signals: protected: bool _shouldSend; void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - void queuePendingPacketToNodes (PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); + void queuePendingPacketToNodes(PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void queuePacketToNodes(unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void initializePacket(EditPacketBuffer& packetBuffer, PacketType::Value type, int nodeClockSkew); void releaseQueuedPacket(EditPacketBuffer& packetBuffer); // releases specific queued packet From adacf3fd89f9cc55a7948ec8ab2e982110a7479a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:03:49 -0700 Subject: [PATCH 071/582] CR fixes in AvatarMixer --- assignment-client/src/avatars/AvatarMixer.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index af9328cd12..465030046b 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -305,9 +305,9 @@ void AvatarMixer::broadcastAvatarData() { || otherNodeData->getBillboardChangeTimestamp() > _lastFrameTimestamp || randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) { - auto billboardPacket { NLPacket::create(PacketType::AvatarBillboard); } - billboardPacket.write(otherNode->getUUID().toRfc4122()); - billboardPacket.write(otherNodeData->getAvatar().getBillboard()); + auto billboardPacket = NLPacket::create(PacketType::AvatarBillboard); + billboardPacket->write(otherNode->getUUID().toRfc4122()); + billboardPacket->write(otherNodeData->getAvatar().getBillboard()); nodeList->sendPacket(billboardPacket, node); @@ -319,12 +319,12 @@ void AvatarMixer::broadcastAvatarData() { || otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp || randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) { - auto identityPacket { NLPacket::create(PacketType::AvatarIdentity); } + auto identityPacket = NLPacket::create(PacketType::AvatarIdentity); QByteArray individualData = otherNodeData->getAvatar().identityByteArray(); individualData.replace(0, NUM_BYTES_RFC4122_UUID, otherNode->getUUID().toRfc4122()); - identityPacket.write(individualData); + identityPacket->write(individualData); nodeList->sendPacket(identityPacket, node); @@ -361,8 +361,8 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { // this was an avatar we were sending to other people // send a kill packet for it to our other nodes - auto killPacket { NLPacket::create(PacketType::KillAvatar); } - killPacket.write(killedNode->getUUID().toRfc4122()); + auto killPacket = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID); + killPacket->write(killedNode->getUUID().toRfc4122()); nodeList->broadcastToNodes(killPacket, NodeSet() << NodeType::Agent); From 11c58ebc9ec98e9b4a81c4eb81bd1adb6ccff5ff Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 15:07:14 -0700 Subject: [PATCH 072/582] Added Packet::createCopy and getData --- libraries/networking/src/Packet.cpp | 18 +++++++----------- libraries/networking/src/Packet.h | 28 +++++++++++++++------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index ca49100efe..6a02af803b 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -38,6 +38,12 @@ std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { return std::unique_ptr(new Packet(type, size)); } + +std::unique_ptr Packet::createCopy(const std::unique_ptr& other) { + Q_ASSERT(other); + return std::unique_ptr(new Packet(*other)); +} + qint64 Packet::totalHeadersSize() const { return localHeaderSize(); } @@ -74,7 +80,6 @@ Packet& Packet::operator=(const Packet& other) { memcpy(_packet.get(), other._packet.get(), _packetSize); _payloadStart = _packet.get() + (other._payloadStart - other._packet.get()); - _position = other._position; _capacity = other._capacity; _sizeUsed = other._sizeUsed; @@ -91,7 +96,6 @@ Packet& Packet::operator=(Packet&& other) { _packet = std::move(other._packet); _payloadStart = other._payloadStart; - _position = other._position; _capacity = other._capacity; _sizeUsed = other._sizeUsed; @@ -132,7 +136,7 @@ void Packet::setPacketTypeAndVersion(PacketType::Value type) { auto offset = packArithmeticallyCodedValue(type, _packet.get()); // Pack the packet version - auto version { versionForPacketType(type) }; + auto version = versionForPacketType(type); memcpy(_packet.get() + offset, &version, sizeof(version)); } @@ -144,14 +148,6 @@ void Packet::setSequenceNumber(SequenceNumber seqNum) { &seqNum, sizeof(seqNum)); } -bool Packet::seek(qint64 pos) { - bool valid = (pos >= 0) && (pos < size()); - if (valid) { - _position = pos; - } - return valid; -} - static const qint64 PACKET_WRITE_ERROR = -1; qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 6177cbd60e..63f6db8fda 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -23,6 +23,8 @@ public: using SequenceNumber = uint16_t; static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + // Provided for convenience, try to limit use + static std::unique_ptr createCopy(const std::unique_ptr& other); static qint64 localHeaderSize(PacketType::Value type); static qint64 maxPayloadSize(PacketType::Value type); @@ -30,10 +32,14 @@ public: virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers virtual qint64 localHeaderSize() const; // Current level's header size - // Payload direct access, use responsibly! + // Payload direct access to the payload, use responsibly! char* getPayload() { return _payloadStart; } const char* getPayload() const { return _payloadStart; } + // Return direct access to the entire packet, use responsibly! + char* getData() { return _packet.get(); } + const char* getData() const { return _packet.get(); } + qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } @@ -46,21 +52,12 @@ public: // QIODevice virtual functions // WARNING: Those methods all refer to the payload ONLY and NOT the entire packet - virtual bool atEnd() const { return _position == _capacity; } - virtual qint64 bytesAvailable() const { return size() - pos(); } - virtual bool canReadLine() const { return false; } virtual bool isSequential() const { return false; } - virtual qint64 pos() const { return _position; } - virtual bool reset() { return seek(0); } - virtual bool seek(qint64 pos); + virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } virtual qint64 size() const { return _capacity; } protected: Packet(PacketType::Value type, int64_t size); - Packet(const Packet& other); - Packet& operator=(const Packet& other); - Packet(Packet&& other); - Packet& operator=(Packet&& other); // QIODevice virtual functions virtual qint64 writeData(const char* data, qint64 maxSize); @@ -70,16 +67,21 @@ protected: void setPacketTypeAndVersion(PacketType::Value type); void setSequenceNumber(SequenceNumber seqNum); - PacketType::Value _type; + PacketType::Value _type; // Packet type qint64 _packetSize = 0; // Total size of the allocated memory std::unique_ptr _packet; // Allocated memory char* _payloadStart = nullptr; // Start of the payload - qint64 _position = 0; // Current position in the payload qint64 _capacity = 0; // Total capacity of the payload qint64 _sizeUsed = 0; // How much of the payload is actually used + +private: + Packet(const Packet& other); + Packet& operator=(const Packet& other); + Packet(Packet&& other); + Packet& operator=(Packet&& other); }; #endif // hifi_Packet_h \ No newline at end of file From c8a03ebff87f3ef9631d1bc90873392877c2ab40 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:14:27 -0700 Subject: [PATCH 073/582] cleanup NAK packets in OctreeInboundPacketProcessor --- .../octree/OctreeInboundPacketProcessor.cpp | 47 ++++++++----------- libraries/networking/src/PacketHeaders.cpp | 2 + 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index ee4fdcd8cf..9ede2ca21d 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -242,7 +242,8 @@ int OctreeInboundPacketProcessor::sendNackPackets() { return packetsSent; } - auto nackPacket { NLPacket::create(_myServer->getMyEditNackType(); } + PacketList nackPacketList = PacketList(_myServer->getMyEditNackType(); + auto nodeList = DependencyManager::get(); NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); while (i != _singleSenderStats.end()) { @@ -271,37 +272,27 @@ int OctreeInboundPacketProcessor::sendNackPackets() { // construct nack packet(s) for this node const QSet& missingSequenceNumbers = sequenceNumberStats.getMissingSet(); - int numSequenceNumbersAvailable = missingSequenceNumbers.size(); - QSet::const_iterator missingSequenceNumberIterator = missingSequenceNumbers.constBegin(); - while (numSequenceNumbersAvailable > 0) { - auto nodeList = DependencyManager::get(); + auto it = missingSequenceNumbers.constBegin(); - nackPacket->reset(); - - // calculate and pack the number of sequence numbers to nack - int numSequenceNumbersRoomFor = (nackPacket->getCapacity() - sizeof(uint16_t)) / sizeof(unsigned short int); - uint16_t numSequenceNumbers = std::min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor); - - nackPacket->write(&numSequenceNumbers, sizeof(numSequenceNumbers)); - - // pack sequence numbers to nack - for (uint16_t i = 0; i < numSequenceNumbers; i++) { - unsigned short int sequenceNumber = *missingSequenceNumberIterator; - nackPacket->write(&sequenceNumber, sizeof(sequenceNumber)); - - missingSequenceNumberIterator++; - } - numSequenceNumbersAvailable -= numSequenceNumbers; - - // send it - nodeList->sendUnreliablePacket(nackPacket, destinationNode); - packetsSent++; - - qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; + while (it != missingSequenceNumbers.constEnd()) { + unsigned short int sequenceNumber = *it; + nackPacketList->write(&sequenceNumber, sizeof(sequenceNumber)); + ++it; } - i++; } + + nackPacketList.closeCurrentPacket(); + + packetsSent = nackPacketList.getNumPackets(); + + if (packetsSent) { + qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; + } + + // send the list of nack packets + nodeList->sendPacketList(nackPacketList, destinationNode); + return packetsSent; } diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 02097402c6..553429014e 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -93,6 +93,8 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { case EntityEdit: case EntityData: return VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE; + case EntityEditNack: + return 1; case EntityErase: return 2; case AudioStreamStats: From 29447466299ad0d09f7efce6a1544aceb4820c19 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:15:15 -0700 Subject: [PATCH 074/582] add a TODO for reading NAK fix --- assignment-client/src/octree/OctreeQueryNode.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 3b7f7d1bd5..7503680633 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -379,6 +379,8 @@ void OctreeQueryNode::parseNackPacket(const QByteArray& packet) { int numBytesPacketHeader = numBytesForPacketHeader(packet); const unsigned char* dataAt = reinterpret_cast(packet.data()) + numBytesPacketHeader; + // TODO: This no longer has the number of sequence numbers - just read to the end of the packet in sequence number blocks + // read number of sequence numbers uint16_t numSequenceNumbers = (*(uint16_t*)dataAt); dataAt += sizeof(uint16_t); From 399b74903345fb50d1967b8187bc4601856e275c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 15:17:16 -0700 Subject: [PATCH 075/582] Fix method and const names in NetworkPacket --- libraries/networking/src/NetworkPacket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NetworkPacket.cpp b/libraries/networking/src/NetworkPacket.cpp index fb1c90e392..26c7939aaa 100644 --- a/libraries/networking/src/NetworkPacket.cpp +++ b/libraries/networking/src/NetworkPacket.cpp @@ -24,7 +24,7 @@ NetworkPacket::NetworkPacket(const NetworkPacket& other) : } NetworkPacket::NetworkPacket(const SharedNodePointer& node, const NLPacket& packet) { - if (packet.getSizeWitHeader() && packet.getSizeWithHeader() <= MAX_nlPacket_SIZE) { + if (packet.getSizeWithHeader() && packet.getSizeWithHeader() <= MAX_PACKET_SIZE) { _node = node; _nlPacket = packet; } else { From ff18a05507d7fa143e2d3f32bfc6c24b29327a26 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:21:10 -0700 Subject: [PATCH 076/582] CR fixes for octree classes --- assignment-client/src/octree/OctreeQueryNode.cpp | 4 ++-- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 7503680633..173c1dd840 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -108,9 +108,9 @@ bool OctreeQueryNode::packetIsDuplicate() const { // since our packets now include header information, like sequence number, and createTime, we can't just do a memcmp // of the entire packet, we need to compare only the packet content... - if (_lastOctreePacketLength == getPacketLength()) { + if (_lastOctreePacketLength == _octreePacket->getSizeUsed()) { if (memcmp(_lastOctreePayload + OCTREE_PACKET_EXTRA_HEADERS_SIZE, - _octreePacket->getPayload() + OCTREE_PACKET_EXTRA_HEADERS_SIZE, + _octreePacket->getPayload() + OCTREE_PACKET_EXTRA_HEADERS_SIZE, _octreePacket->getSizeUsed() - OCTREE_PACKET_EXTRA_HEADERS_SIZE) == 0) { return true; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index d9ef20553f..e675431434 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -147,7 +147,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes NLPacket& statsPacket = nodeData->stats.getStatsMessage(); // If the size of the stats message and the octree message will fit in a packet, then piggyback them - if (nodeData->getPacket()->getSizeUsed() < statsPacket->bytesAvailable()) { + if (nodeData->getPacket()->getSizeWithHeader() < statsPacket->bytesAvailable()) { // copy octree message to back of stats message statsPacket->write(nodeData->getPacket()->getData(), nodeData->getPacket()->getSizeWithHeader()); From 6064a2d4e2d208bde1fd69da658da3426c50ecbc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:21:20 -0700 Subject: [PATCH 077/582] CR fixes for DomainServer --- domain-server/src/DomainServer.cpp | 4 ++-- libraries/networking/src/PacketHeaders.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 63e5f5b1eb..aedfc40be7 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -622,8 +622,8 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock QByteArray utfString = reason.toUtf8(); int payloadSize = utfString.size(); - auto connectionDeniedPacket = NLPacket::make(PacketType::DomainConnectionDenied, payloadSize); - connectionDeniedPacket.write(utfString); + auto connectionDeniedPacket = NLPacket::create(PacketType::DomainConnectionDenied, payloadSize); + connectionDeniedPacket->write(utfString); // tell client it has been refused. limitedNodeList->sendPacket(std::move(connectionDeniedPacket, senderSockAddr); diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 553429014e..396ca63d71 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -82,6 +82,8 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { case DomainList: case DomainListRequest: return 5; + case DomainConnectRequest: + return 1; case CreateAssignment: case RequestAssignment: return 2; From 089cb8a39ed7d8da339851d980503255b44e7ed1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:24:48 -0700 Subject: [PATCH 078/582] fix signature for packet send calls --- libraries/networking/src/LimitedNodeList.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index ceb0427ef0..09b6833cd8 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -145,8 +145,8 @@ public: qint64 sendUnreliablePacket(NLPacket& packet, const SharedNodePointer& destinationNode) {}; qint64 sendUnreliablePacket(NLPacket& packet, const HifiSockAddr& sockAddr) {}; - qint64 sendPacket(NLPacket&& packet, const SharedNodePointer& destinationNode) {}; - qint64 sendPacket(NLPacket&& packet, const HifiSockAddr& sockAddr) {}; + qint64 sendPacket(std::unique_ptr&& packet, const SharedNodePointer& destinationNode) {}; + qint64 sendPacket(std::unique_ptr&& packet, const HifiSockAddr& sockAddr) {}; qint64 sendPacketList(PacketList& packetList, const SharedNodePointer& destinationNode) {}; qint64 sendPacketList(PacketList& packetList, const HifiSockAddr& sockAddr) {}; From 22b3ce8759205a1cdd4f5265bc306a9d0651edd1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:25:05 -0700 Subject: [PATCH 079/582] use Packet for IceServer packets --- ice-server/src/IceServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 298d8ded8e..ec93204e85 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -127,7 +127,7 @@ SharedNetworkPeer IceServer::addOrUpdateHeartbeatingPeer(const QByteArray& incom } void IceServer::sendPeerInformationPacket(const NetworkPeer& peer, const HifiSockAddr* destinationSockAddr) { - auto peerPacket { NLPacket::create(PacketType::IceServerPeerInformation); } + auto peerPacket = Packet::create(PacketType::IceServerPeerInformation); // get the byte array for this peer peerPacket->write(peer.toByteArray()); From 45b549398d7d445d9062b9443b68df207f04d1c1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:31:58 -0700 Subject: [PATCH 080/582] use PacketList for application nack packets --- interface/src/Application.cpp | 39 ++++++++-------------- libraries/networking/src/PacketHeaders.cpp | 2 ++ 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 06aa5cd36d..c41b90cf29 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2660,9 +2660,7 @@ int Application::sendNackPackets() { return 0; } - int packetsSent = 0; - - auto nackPacket { NLPacket::create(PacketType::OctreeDataNack); } + PacketList nackPacketList = PacketList(PacketType::OctreeDataNack); // iterates thru all nodes in NodeList auto nodeList = DependencyManager::get(); @@ -2696,34 +2694,23 @@ int Application::sendNackPackets() { // construct nack packet(s) for this node int numSequenceNumbersAvailable = missingSequenceNumbers.size(); - QSet::const_iterator missingSequenceNumbersIterator = missingSequenceNumbers.constBegin(); - while (numSequenceNumbersAvailable > 0) { - // reset the position we are writing at and the size we have used - nackPacket->seek(0); - nackPacket->setSizeUsed(0); - - // calculate and pack the number of sequence numbers - int numSequenceNumbersRoomFor = (nackPacket->size() - sizeof(uint16_t)) / sizeof(OCTREE_PACKET_SEQUENCE); - uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor); - - nackPacket->write(&numSequenceNumbers, sizeof(numSequenceNumbers)); - - // pack sequence numbers - for (int i = 0; i < numSequenceNumbers; i++) { - OCTREE_PACKET_SEQUENCE missingNumber = *missingSequenceNumbersIterator; - nackPacket->write(&missingNumber, sizeof(OCTREE_PACKET_SEQUENCE)); - missingSequenceNumbersIterator++; - } - numSequenceNumbersAvailable -= numSequenceNumbers; - - // send the packet - nodeList->sendUnreliablePacket(packet, node); - packetsSent++; + auto it = missingSequenceNumbers.constBegin(); + while (it != missingSequenceNumbers.constEnd()) { + OCTREE_PACKET_SEQUENCE missingNumber = *it; + nackPacketList->write(&missingNumber, sizeof(OCTREE_PACKET_SEQUENCE)); + ++it; } } }); + int packetsSent = nackPacketList.getNumPackets(); + + if (packetsSent) { + // send the packet list + nodeList->sendPacketList(nackPacketList, node); + } + return packetsSent; } diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 396ca63d71..cab062165f 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -89,6 +89,8 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { return 2; case OctreeStats: return 1; + case OctreeDataNack: + return 1; case StopNode: return 1; case EntityAdd: From 56880e88584c3460b0aa98fe2ef9e648443bd8b8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:33:03 -0700 Subject: [PATCH 081/582] return fixes for NAK PacketLists --- .../src/octree/OctreeInboundPacketProcessor.cpp | 6 ++---- interface/src/Application.cpp | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 9ede2ca21d..168ebc1629 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -235,11 +235,9 @@ void OctreeInboundPacketProcessor::trackInboundPacket(const QUuid& nodeUUID, uns } int OctreeInboundPacketProcessor::sendNackPackets() { - int packetsSent = 0; - if (_shuttingDown) { qDebug() << "OctreeInboundPacketProcessor::sendNackPackets() while shutting down... ignore"; - return packetsSent; + return 0; } PacketList nackPacketList = PacketList(_myServer->getMyEditNackType(); @@ -284,7 +282,7 @@ int OctreeInboundPacketProcessor::sendNackPackets() { nackPacketList.closeCurrentPacket(); - packetsSent = nackPacketList.getNumPackets(); + int packetsSent = nackPacketList.getNumPackets(); if (packetsSent) { qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c41b90cf29..a1f3a62035 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2674,7 +2674,7 @@ int Application::sendNackPackets() { // if there are octree packets from this node that are waiting to be processed, // don't send a NACK since the missing packets may be among those waiting packets. if (_octreeProcessor.hasPacketsToProcessFrom(nodeUUID)) { - return; + return 0; } _octreeSceneStatsLock.lockForRead(); @@ -2682,7 +2682,7 @@ int Application::sendNackPackets() { // retreive octree scene stats of this node if (_octreeServerSceneStats.find(nodeUUID) == _octreeServerSceneStats.end()) { _octreeSceneStatsLock.unlock(); - return; + return 0; } // get sequence number stats of node, prune its missing set, and make a copy of the missing set From 55a775de38629553d5257a1be5c90f38f1517363 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:35:45 -0700 Subject: [PATCH 082/582] add TODO for EntityEditNack read fix --- .../octree/src/OctreeEditPacketSender.cpp | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index e6c1a2fa35..52c68c3e96 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -30,7 +30,7 @@ OctreeEditPacketSender::OctreeEditPacketSender() : _maxPacketSize(MAX_PACKET_SIZE), _destinationWalletUUID() { - + } OctreeEditPacketSender::~OctreeEditPacketSender() { @@ -52,10 +52,10 @@ OctreeEditPacketSender::~OctreeEditPacketSender() { bool OctreeEditPacketSender::serversExist() const { bool hasServers = false; bool atLeastOneJurisdictionMissing = false; // assume the best - + DependencyManager::get()->eachNodeBreakable([&](const SharedNodePointer& node){ if (node->getType() == getMyNodeType() && node->getActiveSocket()) { - + QUuid nodeUUID = node->getUUID(); // If we've got Jurisdictions set, then check to see if we know the jurisdiction for this server if (_serverJurisdictions) { @@ -69,7 +69,7 @@ bool OctreeEditPacketSender::serversExist() const { } hasServers = true; } - + if (atLeastOneJurisdictionMissing) { return false; // no point in looking further - return false from anonymous function } else { @@ -91,27 +91,27 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned c if (node->getType() == getMyNodeType() && ((node->getUUID() == nodeUUID) || (nodeUUID.isNull())) && node->getActiveSocket()) { - + // pack sequence number int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(buffer)); unsigned char* sequenceAt = buffer + numBytesPacketHeader; quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++; memcpy(sequenceAt, &sequence, sizeof(quint16)); - + // send packet QByteArray packet(reinterpret_cast(buffer), length); - + queuePacketForSending(node, packet); - + if (hasDestinationWalletUUID() && satoshiCost > 0) { // if we have a destination wallet UUID and a cost associated with this packet, signal that it // needs to be sent emit octreePaymentRequired(satoshiCost, nodeUUID, _destinationWalletUUID); } - + // add packet to history _sentPacketHistories[nodeUUID].packetSent(sequence, packet); - + // debugging output... if (wantDebug) { int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(buffer)); @@ -119,7 +119,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned c quint64 createdAt = (*((quint64*)(buffer + numBytesPacketHeader + sizeof(sequence)))); quint64 queuedAt = usecTimestampNow(); quint64 transitTime = queuedAt - createdAt; - + qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << buffer[0] << " - command to node bytes=" << length << " satoshiCost=" << satoshiCost << @@ -192,7 +192,7 @@ void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, size_t le // But we can't really do that with a packed message, since each edit message could be destined // for a different server... So we need to actually manage multiple queued packets... one // for each server - + DependencyManager::get()->eachNode([&](const SharedNodePointer& node){ // only send to the NodeTypes that are getMyNodeType() if (node->getActiveSocket() && node->getType() == getMyNodeType()) { @@ -251,7 +251,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi if (node->getActiveSocket() && node->getType() == getMyNodeType()) { QUuid nodeUUID = node->getUUID(); bool isMyJurisdiction = true; - + if (type == PacketTypeEntityErase) { isMyJurisdiction = true; // send erase messages to all servers } else if (_serverJurisdictions) { @@ -269,19 +269,19 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi if (isMyJurisdiction) { EditPacketBuffer& packetBuffer = _pendingEditPackets[nodeUUID]; packetBuffer._nodeUUID = nodeUUID; - + // If we're switching type, then we send the last one and start over if ((type != packetBuffer._currentType && packetBuffer._currentSize > 0) || (packetBuffer._currentSize + length >= (size_t)_maxPacketSize)) { releaseQueuedPacket(packetBuffer); initializePacket(packetBuffer, type, node->getClockSkewUsec()); } - + // If the buffer is empty and not correctly initialized for our type... if (type != packetBuffer._currentType && packetBuffer._currentSize == 0) { initializePacket(packetBuffer, type, node->getClockSkewUsec()); } - + // This is really the first time we know which server/node this particular edit message // is going to, so we couldn't adjust for clock skew till now. But here's our chance. // We call this virtual function that allows our specific type of EditPacketSender to @@ -289,7 +289,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi if (node->getClockSkewUsec() != 0) { adjustEditPacketForClockSkew(type, editPacketBuffer, length, node->getClockSkewUsec()); } - + memcpy(&packetBuffer._currentBuffer[packetBuffer._currentSize], editPacketBuffer, length); packetBuffer._currentSize += length; packetBuffer._satoshiCost += satoshiCost; @@ -341,7 +341,7 @@ void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, Pa packetBuffer._currentSize += sizeof(quint64); // nudge past timestamp packetBuffer._currentType = type; - + // reset cost for packet to 0 packetBuffer._satoshiCost = 0; } @@ -360,20 +360,22 @@ bool OctreeEditPacketSender::process() { void OctreeEditPacketSender::processNackPacket(const QByteArray& packet) { // parse sending node from packet, retrieve packet history for that node QUuid sendingNodeUUID = uuidFromPacketHeader(packet); - + // if packet history doesn't exist for the sender node (somehow), bail if (!_sentPacketHistories.contains(sendingNodeUUID)) { return; } const SentPacketHistory& sentPacketHistory = _sentPacketHistories.value(sendingNodeUUID); + // TODO: these NAK packets no longer send the number of sequence numbers - just read out sequence numbers in blocks + int numBytesPacketHeader = numBytesForPacketHeader(packet); const unsigned char* dataAt = reinterpret_cast(packet.data()) + numBytesPacketHeader; // read number of sequence numbers uint16_t numSequenceNumbers = (*(uint16_t*)dataAt); dataAt += sizeof(uint16_t); - + // read sequence numbers and queue packets for resend for (int i = 0; i < numSequenceNumbers; i++) { unsigned short int sequenceNumber = (*(unsigned short int*)dataAt); From 03b17cc5dc5ec18bd10cb43e84fe8b79a262dddf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:38:52 -0700 Subject: [PATCH 083/582] fix methods for packet pointers in LNL --- libraries/networking/src/LimitedNodeList.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 09b6833cd8..548c76a07d 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -145,8 +145,8 @@ public: qint64 sendUnreliablePacket(NLPacket& packet, const SharedNodePointer& destinationNode) {}; qint64 sendUnreliablePacket(NLPacket& packet, const HifiSockAddr& sockAddr) {}; - qint64 sendPacket(std::unique_ptr&& packet, const SharedNodePointer& destinationNode) {}; - qint64 sendPacket(std::unique_ptr&& packet, const HifiSockAddr& sockAddr) {}; + qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) {}; + qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) {}; qint64 sendPacketList(PacketList& packetList, const SharedNodePointer& destinationNode) {}; qint64 sendPacketList(PacketList& packetList, const HifiSockAddr& sockAddr) {}; @@ -179,11 +179,11 @@ public: void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); void resetPacketStats(); - NLPacket&& constructPingPacket(PingType_t pingType = PingType::Agnostic); - NLPacket&& constructPingReplyPacket(const QByteArray& pingPacket); + std::unique_ptr constructPingPacket(PingType_t pingType = PingType::Agnostic); + std::unique_ptr constructPingReplyPacket(const QByteArray& pingPacket); - NLPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID); - NLPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID); + std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUuid& iceID); + std::unique_ptr constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID); virtual bool processSTUNResponse(const QByteArray& packet); From 11d5aa980392f4646021a2fea569594b55fabe01 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:40:54 -0700 Subject: [PATCH 084/582] fix queryPacket initialization in Application --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a1f3a62035..4ee6b78274 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2804,7 +2804,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp qCDebug(interfaceapp, "perServerPPS: %d perUnknownServer: %d", perServerPPS, perUnknownServer); } - auto queryPacket { NLPacket::create(packetType); } + auto queryPacket = NLPacket::create(packetType); nodeList->eachNode([&](const SharedNodePointer& node){ // only send to the NodeTypes that are serverType @@ -2883,7 +2883,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp // encode the query data int packetSize = _octreeQuery.getBroadcastData(queryPacket.payload()); - queryPacket.setSizeUsed(packetSize); + queryPacket->setSizeUsed(packetSize); // make sure we still have an active socket nodeList->sendUnreliablePacket(queryPacket, node); From c90c5900ce19507293275d3f5aa379bbba54cf0c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:42:02 -0700 Subject: [PATCH 085/582] make unreliable packet take unique ptr ref --- libraries/networking/src/LimitedNodeList.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 548c76a07d..27ec50fa30 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -143,8 +143,8 @@ public: // const HifiSockAddr& overridenSockAddr = HifiSockAddr()); // - qint64 sendUnreliablePacket(NLPacket& packet, const SharedNodePointer& destinationNode) {}; - qint64 sendUnreliablePacket(NLPacket& packet, const HifiSockAddr& sockAddr) {}; + qint64 sendUnreliablePacket(std::unique_ptr& packet, const SharedNodePointer& destinationNode) {}; + qint64 sendUnreliablePacket(std::unique_ptr& packet, const HifiSockAddr& sockAddr) {}; qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) {}; qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) {}; qint64 sendPacketList(PacketList& packetList, const SharedNodePointer& destinationNode) {}; From b4ab6828bbae18cd5fd752d0f11a72882e99d3b4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 15:43:16 -0700 Subject: [PATCH 086/582] Added setPacketType to Packet class --- libraries/networking/src/Packet.cpp | 25 +++++++++++++++++-------- libraries/networking/src/Packet.h | 15 +++++++++------ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 6a02af803b..65d0899a94 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -62,11 +62,11 @@ Packet::Packet(PacketType::Value type, qint64 size) : Q_ASSERT(size <= maxPayloadSize(type)); // copy packet type and version in header - setPacketTypeAndVersion(type); + writePacketTypeAndVersion(type); // Set control bit and sequence number to 0 if necessary if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { - setSequenceNumber(0); + writeSequenceNumber(0); } } @@ -103,15 +103,24 @@ Packet& Packet::operator=(Packet&& other) { return *this; } -PacketType::Value Packet::getPacketType() const { +void Packet::setPacketType(PacketType::Value type) { + auto currentHeaderSize = totalHeadersSize(); + _type = type; + writePacketTypeAndVersion(_type); + + // Setting new packet type with a different header size not currently supported + Q_ASSERT(currentHeaderSize == totalHeadersSize()); +} + +PacketType::Value Packet::readPacketType() const { return (PacketType::Value)arithmeticCodingValueFromBuffer(_packet.get()); } -PacketVersion Packet::getPacketTypeVersion() const { +PacketVersion Packet::readPacketTypeVersion() const { return *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(_type)); } -Packet::SequenceNumber Packet::getSequenceNumber() const { +Packet::SequenceNumber Packet::readSequenceNumber() const { if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) { SequenceNumber seqNum = *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(_type) + @@ -121,7 +130,7 @@ Packet::SequenceNumber Packet::getSequenceNumber() const { return -1; } -bool Packet::isControlPacket() const { +bool Packet::readIsControlPacket() const { if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) { SequenceNumber seqNum = *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(_type) + @@ -131,7 +140,7 @@ bool Packet::isControlPacket() const { return false; } -void Packet::setPacketTypeAndVersion(PacketType::Value type) { +void Packet::writePacketTypeAndVersion(PacketType::Value type) { // Pack the packet type auto offset = packArithmeticallyCodedValue(type, _packet.get()); @@ -140,7 +149,7 @@ void Packet::setPacketTypeAndVersion(PacketType::Value type) { memcpy(_packet.get() + offset, &version, sizeof(version)); } -void Packet::setSequenceNumber(SequenceNumber seqNum) { +void Packet::writeSequenceNumber(SequenceNumber seqNum) { // Here we are overriding the control bit to 0. // But that is not an issue since we should only ever set the seqNum // for data packets going out diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 63f6db8fda..9d58d1e2e1 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -40,15 +40,18 @@ public: char* getData() { return _packet.get(); } const char* getData() const { return _packet.get(); } + PacketType::Value getPacketType() const { return _type; } + void setPacketType(PacketType::Value type); + qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } // Header readers - PacketType::Value getPacketType() const; - PacketVersion getPacketTypeVersion() const; - SequenceNumber getSequenceNumber() const; - bool isControlPacket() const; + PacketType::Value readPacketType() const; + PacketVersion readPacketTypeVersion() const; + SequenceNumber readSequenceNumber() const; + bool readIsControlPacket() const; // QIODevice virtual functions // WARNING: Those methods all refer to the payload ONLY and NOT the entire packet @@ -64,8 +67,8 @@ protected: virtual qint64 readData(char* data, qint64 maxSize); // Header writers - void setPacketTypeAndVersion(PacketType::Value type); - void setSequenceNumber(SequenceNumber seqNum); + void writePacketTypeAndVersion(PacketType::Value type); + void writeSequenceNumber(SequenceNumber seqNum); PacketType::Value _type; // Packet type From 57b69d150103ddc27487a72034f01d0a7babc1c4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 15:43:21 -0700 Subject: [PATCH 087/582] Add PacketList::getNumPackets --- libraries/networking/src/PacketList.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 1b0905a1c8..010f595938 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -23,6 +23,8 @@ public: void startSegment() { _segmentStartIndex = currentPacket->payload().pos(); } void endSegment() { _segmentStartIndex = -1; } + int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); } + void closeCurrentPacket(); void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } From b502239cca115fe0e464077144176d0e29505881 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 15:44:03 -0700 Subject: [PATCH 088/582] Disable isOrdered = true in PacketList --- libraries/networking/src/PacketList.cpp | 4 ++-- libraries/networking/src/PacketList.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 31b793cc76..bb044d6ae7 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -11,9 +11,9 @@ #include "PacketList.h" -PacketList::PacketList(PacketType::Value packetType, bool isOrdered) : +PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType), - _isOrdered(isOrdered) + _isOrdered(false) { } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 010f595938..ae94273953 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -16,7 +16,7 @@ template class PacketList : public QIODevice { public: - PacketList(PacketType::Value packetType, bool isOrdered = false); + PacketList(PacketType::Value packetType); virtual bool isSequential() const { return true; } From 60797a26ea6313e7cf611711b1b5d52d46abd5ce Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:45:16 -0700 Subject: [PATCH 089/582] CR fixes for new networking in AudioClient --- libraries/audio-client/src/AudioClient.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index b058d8b79b..57bbd5f292 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -853,11 +853,7 @@ void AudioClient::handleAudioInput() { } } - // seek to the beginning of the audio packet payload - _audioPacket->seek(0); - - // reset the size used in this packet so it will be correct once we are done writing - _audioPacket->setSizeUsed(0); + // reset the audio packet so we can start writing // write sequence number _audioPacket->write(&_outgoingAvatarAudioSequenceNumber, sizeof(quint16)); @@ -913,21 +909,21 @@ void AudioClient::sendMuteEnvironmentPacket() { int dataSize = sizeof(glm::vec3) + sizeof(float); - NodeList::Packet mutePacket = nodeList->makePacket(PacketType::MuteEnvironment, dataSize); + auto mutePacket = NLPacket::create(PacketType::MuteEnvironment, dataSize); const float MUTE_RADIUS = 50; glm::vec3 currentSourcePosition = _positionGetter(); - memcpy(mutePacket.payload().data(), ¤tSourcePosition, sizeof(glm::vec3)); - memcpy(mutePacket.payload() + sizeof(glm::vec3), &MUTE_RADIUS, sizeof(float)); + mutePacket->write(¤tSourcePosition, sizeof(currentSourcePosition)); + mutePacket->write(&MUTE_RADIUS, sizeof(MUTE_RADIUS)); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); if (audioMixer) { // send off this mute packet - nodeList->sendPacket(mutePacket, audioMixer); + nodeList->sendPacket(std::move(mutePacket), audioMixer); } } From e35217836fe77f8539bbbaab44b18e034a4516e8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:46:48 -0700 Subject: [PATCH 090/582] send correct packet in AudioIOStats --- libraries/audio-client/src/AudioIOStats.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index 8e0afff9d2..00023167f0 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -124,5 +124,5 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { // send packet SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); - nodeList->sendPacket(packet, audioMixer); + nodeList->sendPacket(statsPacket, audioMixer); } From eac3a2a64073fef302281689a8ab58ce21ec9d20 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:50:32 -0700 Subject: [PATCH 091/582] packet repairs for AudioInjector --- libraries/audio/src/AudioInjector.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 96bca798e3..7dfaa1fdb5 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -153,7 +153,7 @@ void AudioInjector::injectToMixer() { // make sure we actually have samples downloaded to inject if (_audioData.size()) { - auto audioPacket { NLPacket::create(PacketType::InjectAudio); } + auto audioPacket = NLPacket::create(PacketType::InjectAudio); // setup the packet for injected audio QDataStream audioPacketStream(&audioPacket); @@ -177,7 +177,6 @@ void AudioInjector::injectToMixer() { sizeof(_options.position)); // pack our orientation for injected audio - int orientationOptionOffset = audioPacket.pos(); audioPacketStream.writeRawData(reinterpret_cast(&_options.orientation), sizeof(_options.orientation)); @@ -216,23 +215,24 @@ void AudioInjector::injectToMixer() { } _loudness /= (float)(bytesToCopy / sizeof(int16_t)); - audioPacket.seek(positionOptionOffset); - audioPacket.write(&_options.position, sizeof(_options.position)); - - audioPacket.seek(orientationOptionOffset); + audioPacket->seek(positionOptionOffset); + audioPacket->write(&_options.position, sizeof(_options.position)); audioPacket.write(&_options.orientation, sizeof(_options.orientation)); volume = MAX_INJECTOR_VOLUME * _options.volume; - audioPacket.seek(volumeOptionOffset); - audioPacket.write(&volume, sizeof(volume)); + audioPacket->seek(volumeOptionOffset); + audioPacket->write(&volume, sizeof(volume)); - audioPacket.seek(audioDataOffset); + audioPacket->seek(audioDataOffset); // pack the sequence number - audioPacket.write(&outgoingInjectedAudioSequenceNumber, sizeof(quint16)); + audioPacket->write(&outgoingInjectedAudioSequenceNumber, sizeof(quint16)); // copy the next NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL bytes to the packet - audioPacket.write(_audioData.data() + _currentSendPosition, bytesToCopy); + audioPacket->write(_audioData.data() + _currentSendPosition, bytesToCopy); + + // set the correct size used for this packet + audioPacket->setSizeUsed(audioPacket->pos()); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); From d496b33ae6683d25ef12f9e82ee95db30aa26d57 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 15:51:29 -0700 Subject: [PATCH 092/582] Compile fixes --- libraries/networking/src/LimitedNodeList.h | 8 +++++--- libraries/networking/src/NetworkPacket.h | 2 +- libraries/networking/src/PacketList.h | 12 +++++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index ceb0427ef0..fdeaefb80a 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -38,6 +38,7 @@ #include "Node.h" #include "NLPacket.h" #include "PacketHeaders.h" +#include "PacketList.h" #include "UUIDHasher.h" const int MAX_PACKET_SIZE = 1450; @@ -67,6 +68,7 @@ Q_DECLARE_METATYPE(SharedNodePointer) using namespace tbb; typedef std::pair UUIDNodePair; typedef concurrent_unordered_map NodeHash; +using NLPacketList = PacketList; typedef quint8 PingType_t; namespace PingType { @@ -147,8 +149,8 @@ public: qint64 sendUnreliablePacket(NLPacket& packet, const HifiSockAddr& sockAddr) {}; qint64 sendPacket(NLPacket&& packet, const SharedNodePointer& destinationNode) {}; qint64 sendPacket(NLPacket&& packet, const HifiSockAddr& sockAddr) {}; - qint64 sendPacketList(PacketList& packetList, const SharedNodePointer& destinationNode) {}; - qint64 sendPacketList(PacketList& packetList, const HifiSockAddr& sockAddr) {}; + qint64 sendPacketList(NLPacketList& packetList, const SharedNodePointer& destinationNode) {}; + qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) {}; void (*linkedDataCreateCallback)(Node *); @@ -173,7 +175,7 @@ public: int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray& packet); int findNodeAndUpdateWithDataFromPacket(const QByteArray& packet); - unsigned broadcastToNodes(PacketList& packetList, const NodeSet& destinationNodeTypes) {}; + unsigned broadcastToNodes(NLPacketList& packetList, const NodeSet& destinationNodeTypes) {}; SharedNodePointer soloNodeOfType(char nodeType); void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); diff --git a/libraries/networking/src/NetworkPacket.h b/libraries/networking/src/NetworkPacket.h index c42ad286ae..a4484f31d5 100644 --- a/libraries/networking/src/NetworkPacket.h +++ b/libraries/networking/src/NetworkPacket.h @@ -19,7 +19,7 @@ /// Storage of not-yet processed inbound, or not yet sent outbound generic UDP network packet class NetworkPacket { public: - NetworkPacket() { } + NetworkPacket(); NetworkPacket(const NetworkPacket& packet); // copy constructor NetworkPacket& operator= (const NetworkPacket& other); // copy assignment diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 1b0905a1c8..86df44a968 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -12,7 +12,9 @@ #ifndef hifi_PacketList_h #define hifi_PacketList_h -#pragma once +#include + +#include "PacketHeaders.h" template class PacketList : public QIODevice { public: @@ -20,7 +22,7 @@ public: virtual bool isSequential() const { return true; } - void startSegment() { _segmentStartIndex = currentPacket->payload().pos(); } + void startSegment() { _segmentStartIndex = _currentPacket->payload().pos(); } void endSegment() { _segmentStartIndex = -1; } void closeCurrentPacket(); @@ -28,7 +30,7 @@ public: void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } protected: qint64 writeData(const char* data, qint64 maxSize); - qint64 readData(const char* data, qint64 maxSize) { return 0 }; + qint64 readData(const char* data, qint64 maxSize) { return 0; }; private: void createPacketWithExtendedHeader(); @@ -40,7 +42,7 @@ private: int _segmentStartIndex = -1; - QByteArray _extendedHeader = extendedHeader; -} + QByteArray _extendedHeader; +}; #endif // hifi_PacketList_h From 5728cf5056853df488f549a70a035ad30039512b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:54:18 -0700 Subject: [PATCH 093/582] fix ping methods in LNL --- libraries/networking/src/LimitedNodeList.cpp | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 235427d705..e40f453238 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -521,11 +521,11 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t // return n; // } -NLPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { +std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingType) { int packetSize = sizeof(PingType_t) + sizeof(quint64); - auto pingPacket { NLPacket::create(PacketType::Ping, packetSize); } + auto pingPacket = NLPacket::create(PacketType::Ping, packetSize); - QDataStream packetStream(&pingPacket.payload(), QIODevice::Append); + QDataStream packetStream(&pingPacket); packetStream << pingType; packetStream << usecTimestampNow(); @@ -533,7 +533,7 @@ NLPacket&& LimitedNodeList::constructPingPacket(PingType_t pingType) { return pingPacket; } -NLPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacket) { +std::unique_ptr LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacket) { QDataStream pingPacketStream(pingPacket); pingPacketStream.skipRawData(numBytesForPacketHeader(pingPacket)); @@ -545,37 +545,37 @@ NLPacket&& LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacke int packetSize = sizeof(PingType_t) + sizeof(quint64) + sizeof(quint64); - auto replyPacket { NLPacket::create(PacketType::Ping, packetSize); } + auto replyPacket = NLPacket::create(PacketType::Ping, packetSize); - QDataStream packetStream(&replyPacket, QIODevice::Append); + QDataStream packetStream(&replyPacket); packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); return replyPacket; } -NLPacket&& constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { +std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); - auto icePingPacket { NLPacket::create(PacketType::ICEPing, packetSize); } + auto icePingPacket = NLPacket::create(PacketType::ICEPing, packetSize); - icePingPacket.payload().replace(0, NUM_BYTES_RFC4122_UUID, iceID.toRfc4122().data()); - memcpy(icePingPacket.payload() + NUM_BYTES_RFC4122_UUID, &pingType, sizeof(PingType_t)); + icePingPacket->write(iceID.toRfc4122()); + icePingPacket->write(&pingType, sizeof(pingType)); return icePingPacket; } -NLPacket&& constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { +std::unique_ptr constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { // pull out the ping type so we can reply back with that PingType_t pingType; memcpy(&pingType, pingPacket.data() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); - auto icePingReplyPacket { NLPacket::create(PacketType::ICEPingReply, packetSize); } + auto icePingReplyPacket = NLPacket::create(PacketType::ICEPingReply, packetSize); // pack the ICE ID and then the ping type - memcpy(icePingReplyPacket.payload(), iceID.toRfc4122().data(), NUM_BYTES_RFC4122_UUID); - memcpy(icePingReplyPacket.payload() + NUM_BYTES_RFC4122_UUID, &pingType, sizeof(PingType_t)); + icePingReplyPacket->write(iceID.toRfc4122()); + icePingReplyPacket->write(&pingType, sizeof(pingType)); return icePingReplyPacket; } From 05be8199c8a8da2623d3f143fcdb8f899b44cea1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 15:55:33 -0700 Subject: [PATCH 094/582] make broadcastToNodes take NLPacket unique ptr --- libraries/networking/src/LimitedNodeList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 27ec50fa30..6a8a3a5a42 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -173,7 +173,7 @@ public: int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray& packet); int findNodeAndUpdateWithDataFromPacket(const QByteArray& packet); - unsigned broadcastToNodes(PacketList& packetList, const NodeSet& destinationNodeTypes) {}; + unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) {}; SharedNodePointer soloNodeOfType(char nodeType); void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); From bb15326676284faa61d03f5ebf38d786246a0972 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:02:21 -0700 Subject: [PATCH 095/582] repair send of path query packet --- domain-server/src/DomainServer.cpp | 2 +- libraries/networking/src/NodeList.cpp | 4 ++-- libraries/networking/src/PacketHeaders.h | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index aedfc40be7..6fd881e22c 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1448,7 +1448,7 @@ void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiS processICEPingReply(receivedPacket, senderSockAddr); break; } - case PacketTypeIceServerPeerInformation: + case PacketType::ICEServerPeerInformation: processICEPeerInformation(receivedPacket); break; default: diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9da78095a7..f1be4a4e11 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -422,10 +422,10 @@ void NodeList::sendDSPathQuery(const QString& newPath) { if (numPathBytes + sizeof(numPathBytes) < pathQueryPacket.size() ) { // append the size of the path to the query packet - pathQueryPacket.write(&numPathBytes, sizeof(numPathBytes)); + pathQueryPacket->write(&numPathBytes, sizeof(numPathBytes)); // append the path itself to the query packet - pathQueryPacket.write(pathQueryUTF8); + pathQueryPacket->write(pathQueryUTF8); qCDebug(networking) << "Sending a path query packet for path" << newPath << "to domain-server at" << _domainHandler.getSockAddr(); diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index b164081d0d..132bff6419 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -52,8 +52,8 @@ namespace PacketType { DomainServerPathQuery, DomainServerPathResponse, DomainServerAddedNode, - IceServerPeerInformation, - IceServerQuery, // 25 + ICEServerPeerInformation, + ICEServerQuery, // 25 OctreeStats, Jurisdiction, JurisdictionRequest, From b5eb4945ab05a9a21342bd9df62140580331114b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:06:09 -0700 Subject: [PATCH 096/582] fix packet segmentation in PacketList --- libraries/networking/src/PacketList.cpp | 8 ++++---- libraries/networking/src/PacketList.h | 4 ++-- libraries/networking/src/SentPacketHistory.cpp | 2 +- libraries/networking/src/SentPacketHistory.h | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 31b793cc76..77e1855fe0 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -20,10 +20,10 @@ PacketList::PacketList(PacketType::Value packetType, bool isOrdered) : void PacketList::createPacketWithExtendedHeader() { // use the static create method to create a new packet - _currentPacket = T::create(_packetType); + auto packet = T::create(_packetType); // add the extended header to the front of the packet - if (_currentPacket.write(_extendedHeader) == -1) { + if (packet->write(_extendedHeader) == -1) { qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" << "- make sure that _extendedHeader is not larger than the payload capacity."; } @@ -32,7 +32,7 @@ void PacketList::createPacketWithExtendedHeader() { qint64 writeData(const char* data, qint64 maxSize) { if (!_currentPacket) { // we don't have a current packet, time to set one up - createPacketWithExtendedHeader(); + _currentPacket = createPacketWithExtendedHeader(); } // check if this block of data can fit into the currentPacket @@ -46,7 +46,7 @@ qint64 writeData(const char* data, qint64 maxSize) { // it does not fit - this may need to be in the next packet if (!_isOrdered) { - auto newPacket = T::create(_packetType); + auto newPacket = createPacketWithExtendedHeader(); if (_segmentStartIndex >= 0) { // We in the process of writing a segment for an unordered PacketList. diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 1b0905a1c8..356d357291 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -30,7 +30,7 @@ protected: qint64 writeData(const char* data, qint64 maxSize); qint64 readData(const char* data, qint64 maxSize) { return 0 }; private: - void createPacketWithExtendedHeader(); + std::unique_ptr createPacketWithExtendedHeader(); PacketType::Value _packetType; bool isOrdered; @@ -41,6 +41,6 @@ private: int _segmentStartIndex = -1; QByteArray _extendedHeader = extendedHeader; -} +}; #endif // hifi_PacketList_h diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 3b0958f1ea..980646a082 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -30,7 +30,7 @@ void SentPacketHistory::packetSent(uint16_t sequenceNumber, const NLPacket& pack << "Expected:" << expectedSequenceNumber << "Actual:" << sequenceNumber; } _newestSequenceNumber = sequenceNumber; - _sentPackets.insert(new NLPacket(packet)); + _sentPackets.insert(NLPacket::createCopy(packet)); } const QByteArray* SentPacketHistory::getPacket(uint16_t sequenceNumber) const { diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index 566fd2dbfc..04cfdb3d36 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -23,10 +23,10 @@ public: SentPacketHistory(int size = MAX_REASONABLE_SEQUENCE_GAP); void packetSent(uint16_t sequenceNumber, const NLPacket& packet); - const NLPacket* getPacket(uint16_t sequenceNumber) const; + const std::unique_ptr& getPacket(uint16_t sequenceNumber) const; private: - RingBufferHistory _sentPackets; // circular buffer + RingBufferHistory> _sentPackets; // circular buffer uint16_t _newestSequenceNumber; }; From 71e8c0f5cf879ccc502c2fa312828b20205aa6f2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:07:54 -0700 Subject: [PATCH 097/582] use getPayload instead of constData in PacketList --- libraries/networking/src/PacketList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 77e1855fe0..b1486e03ee 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -64,7 +64,7 @@ qint64 writeData(const char* data, qint64 maxSize) { } // copy from currentPacket where the segment started to the beginning of the newPacket - newPacket.write(currentPacket.constData() + _segmentStartIndex, numBytesToEnd); + newPacket.write(currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); // the current segment now starts at the beginning of the new packet _segmentStartIndex = 0; @@ -89,7 +89,7 @@ qint64 writeData(const char* data, qint64 maxSize) { // into a new packet int numBytesToEnd = _currentPacket.size() - _currentPacket.sizeUsed(); - _currentPacket.write(data, numBytesToEnd); + _currentPacket->write(data, numBytesToEnd); // move the current packet to our list of packets _packets.insert(std::move(_currentPacket)); From 1f68ad892a68ba57c6f2d142123eae886eb6876f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:14:57 -0700 Subject: [PATCH 098/582] replace PacketList usage with NLPacketList --- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- assignment-client/src/octree/OctreeInboundPacketProcessor.cpp | 2 +- domain-server/src/DomainServer.cpp | 2 +- interface/src/Application.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 465030046b..a3a2fb7c4d 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -213,7 +213,7 @@ void AvatarMixer::broadcastAvatarData() { } // setup a PacketList for the avatarPackets - PacketList avatarPacketList(PacketType::AvatarData); + NLPacketList avatarPacketList(PacketType::AvatarData); // this is an AGENT we have received head data from // send back a packet with other active node data to this node diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 168ebc1629..3a6a7f03a6 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -240,7 +240,7 @@ int OctreeInboundPacketProcessor::sendNackPackets() { return 0; } - PacketList nackPacketList = PacketList(_myServer->getMyEditNackType(); + NLPacketList nackPacketList(_myServer->getMyEditNackType(); auto nodeList = DependencyManager::get(); NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 6fd881e22c..b1cdcda653 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -927,7 +927,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif const NodeSet& nodeInterestSet) { auto limitedNodeList = DependencyManager::get(); - PacketList domainListPackets(PacketType::DomainList); + NLPacketList domainListPackets(PacketType::DomainList); // always send the node their own UUID back QDataStream domainListStream(&domainListPackets); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4ee6b78274..d91575c950 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2660,7 +2660,7 @@ int Application::sendNackPackets() { return 0; } - PacketList nackPacketList = PacketList(PacketType::OctreeDataNack); + NLPacketList nackPacketList(PacketType::OctreeDataNack); // iterates thru all nodes in NodeList auto nodeList = DependencyManager::get(); From 20b0f4f3d10b3621d283ea21c2aeaadfa011ed68 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:15:59 -0700 Subject: [PATCH 099/582] force the unordered PacketList --- libraries/networking/src/PacketList.cpp | 3 +-- libraries/networking/src/PacketList.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 9d19b3604f..01d4c61089 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -12,8 +12,7 @@ #include "PacketList.h" PacketList::PacketList(PacketType::Value packetType) : - _packetType(packetType), - _isOrdered(false) + _packetType(packetType) { } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index b3691af395..e03e152532 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -37,7 +37,7 @@ private: std::unique_ptr createPacketWithExtendedHeader(); PacketType::Value _packetType; - bool isOrdered; + bool isOrdered = false; std::unique_ptr _currentPacket; std::list> _packets; From 6a76f858d8e896ae6062e9a31aeafb84a39a27c8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:17:15 -0700 Subject: [PATCH 100/582] close of PacketList not required to count last packet --- assignment-client/src/octree/OctreeInboundPacketProcessor.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 3a6a7f03a6..678a448fce 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -280,8 +280,6 @@ int OctreeInboundPacketProcessor::sendNackPackets() { } } - nackPacketList.closeCurrentPacket(); - int packetsSent = nackPacketList.getNumPackets(); if (packetsSent) { From 631c745784016315a8dd970e0c4d37cdb1eae290 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:21:14 -0700 Subject: [PATCH 101/582] allow equal for piggyback check in OctreeSendThread --- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index e675431434..633d197980 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -147,7 +147,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes NLPacket& statsPacket = nodeData->stats.getStatsMessage(); // If the size of the stats message and the octree message will fit in a packet, then piggyback them - if (nodeData->getPacket()->getSizeWithHeader() < statsPacket->bytesAvailable()) { + if (nodeData->getPacket()->getSizeWithHeader() <= statsPacket->bytesAvailable()) { // copy octree message to back of stats message statsPacket->write(nodeData->getPacket()->getData(), nodeData->getPacket()->getSizeWithHeader()); From 3690ecc28fd9531cb9d347ba7332dfb0ad3965c2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 7 Jul 2015 16:24:11 -0700 Subject: [PATCH 102/582] Add std::move to sendPacket calls --- .../src/AssignmentClientMonitor.cpp | 4 ++-- assignment-client/src/audio/AudioMixer.cpp | 4 ++-- .../src/audio/AudioMixerClientData.cpp | 2 +- assignment-client/src/avatars/AvatarMixer.cpp | 4 ++-- domain-server/src/DomainServer.cpp | 4 ++-- libraries/audio-client/src/AudioClient.cpp | 2 +- libraries/audio-client/src/AudioIOStats.cpp | 2 +- libraries/networking/src/NodeList.cpp | 16 ++++++++-------- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 75c8446d84..3331e81a18 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -196,7 +196,7 @@ void AssignmentClientMonitor::checkSpares() { childNode->activateLocalSocket(); auto diePacket = NLPacket::create(PacketType::StopNode, 0); - nodeList->sendPacket(diePacket, childNode); + nodeList->sendPacket(std::move(diePacket), childNode); } } } @@ -231,7 +231,7 @@ void AssignmentClientMonitor::readPendingDatagrams() { qDebug() << "asking unknown child to exit."; auto diePacket = NL::create(PacketType::StopNode, 0); - nodeList->sendPacket(diePacket, childNode); + nodeList->sendPacket(std::move(diePacket), childNode); } } } diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 4577f2015f..9d519c1b20 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -530,7 +530,7 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { envPacket.write(&reverbTime, sizeof(reverb)); envPacket.write(&wetLevel, sizeof(wetLevel)); } - nodeList->sendPacket(envPacket, node); + nodeList->sendPacket(std::move(envPacket), node); } } @@ -794,7 +794,7 @@ void AudioMixer::run() { if (nodeData->getAvatarAudioStream() && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { auto mutePacket = NLPacket::create(PacketType::NoisyMute, 0); - nodeList->sendPacket(mutePacket, node); + nodeList->sendPacket(std::move(mutePacket), node); } if (node->getType() == NodeType::Agent && node->getActiveSocket() diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index f4fbbb87f9..b9fe98a2bd 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -190,7 +190,7 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& numStreamStatsRemaining -= numStreamStatsToPack; // send the current packet - nodeList->sendPacket(statsPacket, destinationNode); + nodeList->sendPacket(std::move(statsPacket), destinationNode); } } diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index af9328cd12..844e38d0aa 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -309,7 +309,7 @@ void AvatarMixer::broadcastAvatarData() { billboardPacket.write(otherNode->getUUID().toRfc4122()); billboardPacket.write(otherNodeData->getAvatar().getBillboard()); - nodeList->sendPacket(billboardPacket, node); + nodeList->sendPacket(std::move(billboardPacket), node); ++_sumBillboardPackets; } @@ -326,7 +326,7 @@ void AvatarMixer::broadcastAvatarData() { identityPacket.write(individualData); - nodeList->sendPacket(identityPacket, node); + nodeList->sendPacket(std::move(identityPacket), node); ++_sumIdentityPackets; } diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 63e5f5b1eb..4feb0ebe92 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1324,10 +1324,10 @@ void DomainServer::pingPunchForConnectingPeer(const SharedNetworkPeer& peer) { // send the ping packet to the local and public sockets for this node auto localPingPacket = nodeList->constructICEPingPacket(PingType::Local, limitedNodeList->getSessionUUID()); - limitedNodeList->sendPacket(localPingPacket, peer->getLocalSocket()); + limitedNodeList->sendPacket(std::move(localPingPacket), peer->getLocalSocket()); auto publicPingPacket = nodeList->constructICEPingPacket(PingType::Public, limitedNodeList->getSessionUUID()); - limitedNodeList->sendPacket(publicPingPacket, peer->getPublicSocket()); + limitedNodeList->sendPacket(std::move(publicPingPacket), peer->getPublicSocket()); peer->incrementConnectionAttempts(); } diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index b058d8b79b..acca48ce35 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -927,7 +927,7 @@ void AudioClient::sendMuteEnvironmentPacket() { if (audioMixer) { // send off this mute packet - nodeList->sendPacket(mutePacket, audioMixer); + nodeList->sendPacket(std::move(mutePacket), audioMixer); } } diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index 8e0afff9d2..db72adb0c5 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -124,5 +124,5 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { // send packet SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); - nodeList->sendPacket(packet, audioMixer); + nodeList->sendPacket(std::move(statsPacket), audioMixer); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9da78095a7..f329ec7333 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -204,7 +204,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr if (matchingNode) { matchingNode->setLastHeardMicrostamp(usecTimestampNow()); auto replyPacket = constructPingReplyPacket(packet); - sendPacket(replyPacket, matchingNode, senderSockAddr); + sendPacket(std::move(replyPacket), matchingNode, senderSockAddr); // If we don't have a symmetric socket for this node and this socket doesn't match // what we have for public and local then set it as the symmetric. @@ -236,7 +236,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr case PacketType::ICEPing: { // send back a reply auto replyPacket = constructICEPingReplyPacket(packet, _domainHandler.getICEClientID()); - sendPacket(replyPacket, senderSockAddr); + sendPacket(std::move(replyPacket), senderSockAddr); break; } case PacketType::ICEPingReply: { @@ -369,7 +369,7 @@ void NodeList::sendDomainServerCheckIn() { flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendDSCheckIn); if (!isUsingDTLS) { - sendPacket(domainPacket, _domainHandler.getSockAddr()); + sendPacket(std::move(domainPacket), _domainHandler.getSockAddr()); } if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { @@ -431,7 +431,7 @@ void NodeList::sendDSPathQuery(const QString& newPath) { << _domainHandler.getSockAddr(); // send off the path query - sendPacket(pathQueryPacket, _domainHandler.getSockAddr()); + sendPacket(std::move(pathQueryPacket), _domainHandler.getSockAddr()); } else { qCDebug(networking) << "Path" << newPath << "would make PacketTypeDomainServerPathQuery packet > MAX_PACKET_SIZE." << "Will not send query."; @@ -521,10 +521,10 @@ void NodeList::pingPunchForDomainServer() { // send the ping packet to the local and public sockets for this node auto localPingPacket = constructICEPingPacket(PingType::Local); - sendPacket(localPingPacket, _domainHandler.getICEPeer().getLocalSocket()); + sendPacket(std::move(localPingPacket), _domainHandler.getICEPeer().getLocalSocket()); auto publicPingPacket = constructICEPingPacket(PingType::Public); - sendPacket(publicPingPacket, _domainHandler.getICEPeer().getPublicSocket()); + sendPacket(std::move(publicPingPacket), _domainHandler.getICEPeer().getPublicSocket()); _domainHandler.getICEPeer().incrementConnectionAttempts(); } @@ -629,10 +629,10 @@ void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { // send the ping packet to the local and public sockets for this node auto localPingPacket = constructPingPacket(PingType::Local); - sendPacket(localPingPacket, node, node->getLocalSocket()); + sendPacket(std::move(localPingPacket), node, node->getLocalSocket()); auto publicPingPacket = constructPingPacket(PingType::Public); - sendPacket(publicPingPacket, node, node->getPublicSocket()); + sendPacket(std::move(publicPingPacket), node, node->getPublicSocket()); if (!node->getSymmetricSocket().isNull()) { auto symmetricPingPacket = constructPingPacket(PingType::Symmetric); From 32e75fcee8f502b6e01ce276f5c1a2556330d1c4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:25:21 -0700 Subject: [PATCH 103/582] actually reset the NLPacket for audio to start writing --- libraries/audio-client/src/AudioClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 57bbd5f292..2792943110 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -854,6 +854,7 @@ void AudioClient::handleAudioInput() { } // reset the audio packet so we can start writing + _audioPacket->reset(); // write sequence number _audioPacket->write(&_outgoingAvatarAudioSequenceNumber, sizeof(quint16)); From 833f36e88eb34b3bff19ad3d77df86cf09afa613 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 16:25:39 -0700 Subject: [PATCH 104/582] Comment deprecated methods --- libraries/networking/src/LimitedNodeList.cpp | 224 +++++++++---------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 235427d705..407bddac64 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -221,18 +221,18 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { // qint64 LimitedNodeList::readDatagram(char* data, qint64 maxSize, QHostAddress* address = 0, quint16 * port = 0) { -qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* address = 0, quint16 * port = 0) { - qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); - - SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); - if (sendingNode) { - emit dataReceived(sendingNode->getType(), incomingPacket.size()); - } else { - emit dataReceived(NodeType::Unassigned, incomingPacket.size()); - } - - return result; -} +//qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* address = 0, quint16* port = 0) { +// qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); +// +// SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); +// if (sendingNode) { +// emit dataReceived(sendingNode->getType(), incomingPacket.size()); +// } else { +// emit dataReceived(NodeType::Unassigned, incomingPacket.size()); +// } +// +// return result; +//} qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { // XXX can BandwidthRecorder be used for this? @@ -250,106 +250,106 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSock return bytesWritten; } -qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, - const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr) { - if (destinationNode) { - PacketType::Value packetType = packetTypeForPacket(datagram); - - if (NON_VERIFIED_PACKETS.contains(packetType)) { - return writeUnverifiedDatagram(datagram, destinationNode, overridenSockAddr); - } - - // if we don't have an overridden address, assume they want to send to the node's active socket - const HifiSockAddr* destinationSockAddr = &overridenSockAddr; - if (overridenSockAddr.isNull()) { - if (destinationNode->getActiveSocket()) { - // use the node's active socket as the destination socket - destinationSockAddr = destinationNode->getActiveSocket(); - } else { - // we don't have a socket to send to, return 0 - return 0; - } - } - - QByteArray datagramCopy = datagram; - - // if we're here and the connection secret is null, debug out - this could be a problem - if (destinationNode->getConnectionSecret().isNull()) { - qDebug() << "LimitedNodeList::writeDatagram called for verified datagram with null connection secret for" - << "destination node" << destinationNode->getUUID() << " - this is either not secure or will cause" - << "this packet to be unverifiable on the receiving side."; - } - - // perform replacement of hash and optionally also sequence number in the header - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { - PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType); - replaceHashAndSequenceNumberInPacket(datagramCopy, destinationNode->getConnectionSecret(), - sequenceNumber, packetType); - } else { - replaceHashInPacket(datagramCopy, destinationNode->getConnectionSecret(), packetType); - } - - emit dataSent(destinationNode->getType(), datagram.size()); - auto bytesWritten = writeDatagram(datagramCopy, *destinationSockAddr); - // Keep track of per-destination-node bandwidth - destinationNode->recordBytesSent(bytesWritten); - return bytesWritten; - } - - // didn't have a destinationNode to send to, return 0 - return 0; -} - -qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr) { - if (destinationNode) { - // if we don't have an ovveriden address, assume they want to send to the node's active socket - const HifiSockAddr* destinationSockAddr = &overridenSockAddr; - if (overridenSockAddr.isNull()) { - if (destinationNode->getActiveSocket()) { - // use the node's active socket as the destination socket - destinationSockAddr = destinationNode->getActiveSocket(); - } else { - // we don't have a socket to send to, return 0 - return 0; - } - } - - PacketType::Value packetType = packetTypeForPacket(datagram); - - // optionally peform sequence number replacement in the header - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { - - QByteArray datagramCopy = datagram; - - PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType); - replaceSequenceNumberInPacket(datagramCopy, sequenceNumber, packetType); - - // send the datagram with sequence number replaced in header - return writeDatagram(datagramCopy, *destinationSockAddr); - } else { - return writeDatagram(datagram, *destinationSockAddr); - } - } - - // didn't have a destinationNode to send to, return 0 - return 0; -} - -qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { - return writeDatagram(datagram, destinationSockAddr); -} - -qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr) { - return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); -} - -qint64 LimitedNodeList::writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr) { - return writeUnverifiedDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); -} +//qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, +// const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr) { +// if (destinationNode) { +// PacketType::Value packetType = packetTypeForPacket(datagram); +// +// if (NON_VERIFIED_PACKETS.contains(packetType)) { +// return writeUnverifiedDatagram(datagram, destinationNode, overridenSockAddr); +// } +// +// // if we don't have an overridden address, assume they want to send to the node's active socket +// const HifiSockAddr* destinationSockAddr = &overridenSockAddr; +// if (overridenSockAddr.isNull()) { +// if (destinationNode->getActiveSocket()) { +// // use the node's active socket as the destination socket +// destinationSockAddr = destinationNode->getActiveSocket(); +// } else { +// // we don't have a socket to send to, return 0 +// return 0; +// } +// } +// +// QByteArray datagramCopy = datagram; +// +// // if we're here and the connection secret is null, debug out - this could be a problem +// if (destinationNode->getConnectionSecret().isNull()) { +// qDebug() << "LimitedNodeList::writeDatagram called for verified datagram with null connection secret for" +// << "destination node" << destinationNode->getUUID() << " - this is either not secure or will cause" +// << "this packet to be unverifiable on the receiving side."; +// } +// +// // perform replacement of hash and optionally also sequence number in the header +// if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { +// PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType); +// replaceHashAndSequenceNumberInPacket(datagramCopy, destinationNode->getConnectionSecret(), +// sequenceNumber, packetType); +// } else { +// replaceHashInPacket(datagramCopy, destinationNode->getConnectionSecret(), packetType); +// } +// +// emit dataSent(destinationNode->getType(), datagram.size()); +// auto bytesWritten = writeDatagram(datagramCopy, *destinationSockAddr); +// // Keep track of per-destination-node bandwidth +// destinationNode->recordBytesSent(bytesWritten); +// return bytesWritten; +// } +// +// // didn't have a destinationNode to send to, return 0 +// return 0; +//} +// +//qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr) { +// if (destinationNode) { +// // if we don't have an ovveriden address, assume they want to send to the node's active socket +// const HifiSockAddr* destinationSockAddr = &overridenSockAddr; +// if (overridenSockAddr.isNull()) { +// if (destinationNode->getActiveSocket()) { +// // use the node's active socket as the destination socket +// destinationSockAddr = destinationNode->getActiveSocket(); +// } else { +// // we don't have a socket to send to, return 0 +// return 0; +// } +// } +// +// PacketType::Value packetType = packetTypeForPacket(datagram); +// +// // optionally peform sequence number replacement in the header +// if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { +// +// QByteArray datagramCopy = datagram; +// +// PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType); +// replaceSequenceNumberInPacket(datagramCopy, sequenceNumber, packetType); +// +// // send the datagram with sequence number replaced in header +// return writeDatagram(datagramCopy, *destinationSockAddr); +// } else { +// return writeDatagram(datagram, *destinationSockAddr); +// } +// } +// +// // didn't have a destinationNode to send to, return 0 +// return 0; +//} +// +//qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { +// return writeDatagram(datagram, destinationSockAddr); +//} +// +//qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr) { +// return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); +//} +// +//qint64 LimitedNodeList::writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, +// const HifiSockAddr& overridenSockAddr) { +// return writeUnverifiedDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); +//} PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType) { // Thanks to std::map and std::unordered_map this line either default constructs the From 2ab9cd7a9ac0aa9726bf1db3c019dc205b97c8e0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:25:56 -0700 Subject: [PATCH 105/582] replace payload with getPayload --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 2792943110..a75b9124db 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -734,7 +734,7 @@ void AudioClient::handleAudioInput() { int inputSamplesRequired = (int)((float)AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * inputToNetworkInputRatio); static int leadingBytes = sizeof(quint16) + sizeof(glm::vec3) + sizeof(glm::quat) + sizeof(quint8); - int16_t* networkAudioSamples = (int16_t*)(_audioPacket->payload() + leadingBytes); + int16_t* networkAudioSamples = (int16_t*)(_audioPacket->getPayload() + leadingBytes); QByteArray inputByteArray = _inputDevice->readAll(); From e0119e8767ef9c83361333ef4c37afef9fd250e7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 16:26:20 -0700 Subject: [PATCH 106/582] Fix a couple packet types names --- libraries/networking/src/PacketHeaders.cpp | 20 ++++++++++---------- libraries/networking/src/PacketHeaders.h | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 02097402c6..ae5d3f9462 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -23,9 +23,9 @@ const QSet NON_VERIFIED_PACKETS = QSet() << CreateAssignment << RequestAssignment << StunResponse << NodeJsonStats << EntityQuery << OctreeDataNack << EntityEditNack - << IceServerHeartbeat << IceServerPeerInformation - << IceServerQuery << UnverifiedPing - << UnverifiedPingReply << StopNode + << ICEServerHeartbeat << ICEServerPeerInformation + << ICEServerQuery << Ping + << PingReply << StopNode << DomainServerPathQuery << DomainServerPathResponse << DomainServerAddedNode; @@ -97,8 +97,8 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { return 2; case AudioStreamStats: return 1; - case IceServerHeartbeat: - case IceServerQuery: + case ICEServerHeartbeat: + case ICEServerQuery: return 1; default: return 0; @@ -146,12 +146,12 @@ QString nameForPacketType(PacketType::Value packetType) { PACKET_TYPE_NAME_LOOKUP(AudioEnvironment); PACKET_TYPE_NAME_LOOKUP(EntityEditNack); PACKET_TYPE_NAME_LOOKUP(SignedTransactionPayment); - PACKET_TYPE_NAME_LOOKUP(IceServerHeartbeat); + PACKET_TYPE_NAME_LOOKUP(ICEServerHeartbeat); PACKET_TYPE_NAME_LOOKUP(DomainServerAddedNode); - PACKET_TYPE_NAME_LOOKUP(IceServerQuery); - PACKET_TYPE_NAME_LOOKUP(IceServerPeerInformation); - PACKET_TYPE_NAME_LOOKUP(UnverifiedPing); - PACKET_TYPE_NAME_LOOKUP(UnverifiedPingReply); + PACKET_TYPE_NAME_LOOKUP(ICEServerQuery); + PACKET_TYPE_NAME_LOOKUP(ICEServerPeerInformation); + PACKET_TYPE_NAME_LOOKUP(ICEPing); + PACKET_TYPE_NAME_LOOKUP(ICEPingReply); PACKET_TYPE_NAME_LOOKUP(EntityAdd); PACKET_TYPE_NAME_LOOKUP(EntityEdit); default: diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index b164081d0d..132bff6419 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -52,8 +52,8 @@ namespace PacketType { DomainServerPathQuery, DomainServerPathResponse, DomainServerAddedNode, - IceServerPeerInformation, - IceServerQuery, // 25 + ICEServerPeerInformation, + ICEServerQuery, // 25 OctreeStats, Jurisdiction, JurisdictionRequest, From fcd11461c29f813524c26448431cb0111c358efb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 16:27:48 -0700 Subject: [PATCH 107/582] Added NLPacket::createCopy --- libraries/networking/src/NLPacket.cpp | 8 ++++++++ libraries/networking/src/NLPacket.h | 3 +++ libraries/networking/src/Packet.cpp | 1 - libraries/networking/src/Packet.h | 10 ++++------ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 524983a8ff..4f12b761d1 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -37,9 +37,17 @@ std::unique_ptr NLPacket::create(PacketType::Value type, int64_t size) return std::unique_ptr(new NLPacket(type, size)); } +std::unique_ptr NLPacket::createCopy(const std::unique_ptr& other) { + Q_ASSERT(other); + return std::unique_ptr(new NLPacket(*other)); +} + NLPacket::NLPacket(PacketType::Value type, int64_t size) : Packet(type, localHeaderSize(type) + size) { } +NLPacket::NLPacket(NLPacket& other) : Packet(other) { +} + void NLPacket::setSourceUuid(QUuid sourceUuid) { Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type)); auto offset = Packet::totalHeadersSize(); diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 7f625fb60c..9105418492 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -17,6 +17,8 @@ class NLPacket : public Packet { public: static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + // Provided for convenience, try to limit use + static std::unique_ptr createCopy(const std::unique_ptr& other); static int64_t localHeaderSize(PacketType::Value type); static int64_t maxPayloadSize(PacketType::Value type); @@ -26,6 +28,7 @@ public: protected: NLPacket(PacketType::Value type, int64_t size); + NLPacket(NLPacket& other); void setSourceUuid(QUuid sourceUuid); void setConnectionUuid(QUuid connectionUuid); diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 65d0899a94..b11564428f 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -38,7 +38,6 @@ std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { return std::unique_ptr(new Packet(type, size)); } - std::unique_ptr Packet::createCopy(const std::unique_ptr& other) { Q_ASSERT(other); return std::unique_ptr(new Packet(*other)); diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 9d58d1e2e1..471237b212 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -61,6 +61,10 @@ public: protected: Packet(PacketType::Value type, int64_t size); + Packet(const Packet& other); + Packet& operator=(const Packet& other); + Packet(Packet&& other); + Packet& operator=(Packet&& other); // QIODevice virtual functions virtual qint64 writeData(const char* data, qint64 maxSize); @@ -79,12 +83,6 @@ protected: qint64 _capacity = 0; // Total capacity of the payload qint64 _sizeUsed = 0; // How much of the payload is actually used - -private: - Packet(const Packet& other); - Packet& operator=(const Packet& other); - Packet(Packet&& other); - Packet& operator=(Packet&& other); }; #endif // hifi_Packet_h \ No newline at end of file From ff487ee092746d85e61d23f8c91267acf4eb7b96 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:30:50 -0700 Subject: [PATCH 108/582] move the AudioClient mix packet --- assignment-client/src/audio/AudioMixer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 9d519c1b20..f73735ddb5 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -831,7 +831,7 @@ void AudioMixer::run() { sendAudioEnvironmentPacket(node); // send mixed audio packet - nodeList->sendPacket(mixPacket, node); + nodeList->sendPacket(std::move(mixPacket), node); nodeData->incrementOutgoingMixedAudioSequenceNumber(); // send an audio stream stats packet if it's time From ac9e3b0326feaadcd1a35c7d49769a551c1bfa42 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 16:34:52 -0700 Subject: [PATCH 109/582] More compile fixes --- libraries/networking/src/PacketList.cpp | 16 ++++++++++------ libraries/networking/src/PacketList.h | 4 +++- .../networking/src/SentPacketHistory.cpp | 19 +++++++++++++------ libraries/networking/src/SentPacketHistory.h | 2 ++ 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 01d4c61089..b5b5284dde 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -11,13 +11,17 @@ #include "PacketList.h" -PacketList::PacketList(PacketType::Value packetType) : +#include + +#include "NLPacket.h" + +template PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType) { } -void PacketList::createPacketWithExtendedHeader() { +template std::unique_ptr PacketList::createPacketWithExtendedHeader() { // use the static create method to create a new packet auto packet = T::create(_packetType); @@ -28,7 +32,7 @@ void PacketList::createPacketWithExtendedHeader() { } } -qint64 writeData(const char* data, qint64 maxSize) { +template qint64 PacketList::writeData(const char* data, qint64 maxSize) { if (!_currentPacket) { // we don't have a current packet, time to set one up _currentPacket = createPacketWithExtendedHeader(); @@ -63,13 +67,13 @@ qint64 writeData(const char* data, qint64 maxSize) { } // copy from currentPacket where the segment started to the beginning of the newPacket - newPacket.write(currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); + newPacket.write(_currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); // the current segment now starts at the beginning of the new packet _segmentStartIndex = 0; // shrink the current payload to the actual size of the packet - currentPacket.setSizeUsed(_segmentStartIndex); + _currentPacket.setSizeUsed(_segmentStartIndex); } // move the current packet to our list of packets @@ -99,7 +103,7 @@ qint64 writeData(const char* data, qint64 maxSize) { } } -void PacketList::closeCurrentPacket() { +template void PacketList::closeCurrentPacket() { // move the current packet to our list of packets _packets.insert(std::move(_currentPacket)); } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index e03e152532..a194121324 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -16,6 +16,8 @@ #include "PacketHeaders.h" +class NLPacket; + template class PacketList : public QIODevice { public: PacketList(PacketType::Value packetType); @@ -37,7 +39,7 @@ private: std::unique_ptr createPacketWithExtendedHeader(); PacketType::Value _packetType; - bool isOrdered = false; + bool _isOrdered = false; std::unique_ptr _currentPacket; std::list> _packets; diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 980646a082..2a90f0f094 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -8,10 +8,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include -#include "NetworkLogging.h" #include "SentPacketHistory.h" -#include + +#include + +#include + +#include "NetworkLogging.h" +#include "NLPacket.h" SentPacketHistory::SentPacketHistory(int size) : _sentPackets(size), @@ -30,10 +34,13 @@ void SentPacketHistory::packetSent(uint16_t sequenceNumber, const NLPacket& pack << "Expected:" << expectedSequenceNumber << "Actual:" << sequenceNumber; } _newestSequenceNumber = sequenceNumber; - _sentPackets.insert(NLPacket::createCopy(packet)); + + auto temp = std::unique_ptr(const_cast(&packet)); + _sentPackets.insert(NLPacket::createCopy(temp)); + temp.release(); } -const QByteArray* SentPacketHistory::getPacket(uint16_t sequenceNumber) const { +const std::unique_ptr& SentPacketHistory::getPacket(uint16_t sequenceNumber) const { const int UINT16_RANGE = std::numeric_limits::max() + 1; @@ -44,5 +51,5 @@ const QByteArray* SentPacketHistory::getPacket(uint16_t sequenceNumber) const { seqDiff += UINT16_RANGE; } - return _sentPackets.get(seqDiff); + return *_sentPackets.get(seqDiff); } diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index 04cfdb3d36..08aa2f9764 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -17,6 +17,8 @@ #include "SequenceNumberStats.h" +class NLPacket; + class SentPacketHistory { public: From 30840422adb83336481164b5de3dcd2402375628 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:35:59 -0700 Subject: [PATCH 110/582] use NLPacket::createCopy in NetworkPacket --- libraries/networking/src/NetworkPacket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/NetworkPacket.cpp b/libraries/networking/src/NetworkPacket.cpp index 26c7939aaa..b2cc9d6751 100644 --- a/libraries/networking/src/NetworkPacket.cpp +++ b/libraries/networking/src/NetworkPacket.cpp @@ -32,10 +32,10 @@ NetworkPacket::NetworkPacket(const SharedNodePointer& node, const NLPacket& pack } }; -// copy assignment +// copy assignment NetworkPacket& NetworkPacket::operator=(NetworkPacket const& other) { _node = other._node; - _nlPacket = other._nlPacket; + _nlPacket = NLPacket::createCopy(other._nlPacket); return *this; } From fa43c6272225c730afdf67c78d6ca4a00924d70e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 16:45:43 -0700 Subject: [PATCH 111/582] RingBufferHistory handles unique_ptr --- libraries/shared/src/RingBufferHistory.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/RingBufferHistory.h b/libraries/shared/src/RingBufferHistory.h index 9534b2f1db..528d451d76 100644 --- a/libraries/shared/src/RingBufferHistory.h +++ b/libraries/shared/src/RingBufferHistory.h @@ -53,6 +53,18 @@ public: _numEntries++; } } + + // std::unique_ptr need to be passed as an rvalue ref and moved into the vector + void insert(T&& entry) { + // increment newest entry index cyclically + _newestEntryAtIndex = (_newestEntryAtIndex == _size - 1) ? 0 : _newestEntryAtIndex + 1; + + // insert new entry + _buffer[_newestEntryAtIndex] = std::move(entry); + if (_numEntries < _capacity) { + _numEntries++; + } + } // 0 retrieves the most recent entry, _numEntries - 1 retrieves the oldest. // returns NULL if entryAge not within [0, _numEntries-1] @@ -88,7 +100,7 @@ private: int _capacity; int _newestEntryAtIndex; int _numEntries; - QVector _buffer; + std::vector _buffer; public: class Iterator : public std::iterator < std::random_access_iterator_tag, T > { From 6c6143f21e02bcf1472d949be1c8e7218daa20d9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:56:05 -0700 Subject: [PATCH 112/582] remove NetworkPacket and replace with NodePacketPair --- .../src/octree/OctreeSendThread.h | 5 +- interface/src/Application.h | 59 +++++++++---------- libraries/networking/src/NetworkPacket.cpp | 55 ----------------- libraries/networking/src/NetworkPacket.h | 42 ------------- libraries/networking/src/NodeList.h | 2 + libraries/networking/src/PacketSender.cpp | 27 +++++---- libraries/networking/src/PacketSender.h | 5 +- .../src/ReceivedPacketProcessor.cpp | 9 ++- .../networking/src/ReceivedPacketProcessor.h | 6 +- 9 files changed, 59 insertions(+), 151 deletions(-) delete mode 100644 libraries/networking/src/NetworkPacket.cpp delete mode 100644 libraries/networking/src/NetworkPacket.h diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 3316546913..78f480b5eb 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -15,7 +15,6 @@ #define hifi_OctreeSendThread_h #include -#include #include #include "OctreeQueryNode.h" @@ -28,7 +27,7 @@ class OctreeSendThread : public GenericThread { public: OctreeSendThread(OctreeServer* myServer, const SharedNodePointer& node); virtual ~OctreeSendThread(); - + void setIsShuttingDown(); static quint64 _totalBytes; @@ -51,7 +50,7 @@ private: int packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged); OctreePacketData _packetData; - + int _nodeMissingCount; bool _isShuttingDown; }; diff --git a/interface/src/Application.h b/interface/src/Application.h index 9a9b4cdea0..0131fdb19a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -122,7 +121,7 @@ static const QString INFO_HELP_PATH = "html/interface-welcome.html"; static const QString INFO_EDIT_ENTITIES_PATH = "html/edit-commands.html"; #ifdef Q_OS_WIN -static const UINT UWM_IDENTIFY_INSTANCES = +static const UINT UWM_IDENTIFY_INSTANCES = RegisterWindowMessage("UWM_IDENTIFY_INSTANCES_{8AB82783-B74A-4258-955B-8188C22AA0D6}_" + qgetenv("USERNAME")); static const UINT UWM_SHOW_APPLICATION = RegisterWindowMessage("UWM_SHOW_APPLICATION_{71123FD6-3DA8-4DC1-9C27-8A12A6250CBA}_" + qgetenv("USERNAME")); @@ -199,11 +198,11 @@ public: bool isThrottleRendering() const; Camera* getCamera() { return &_myCamera; } - // Represents the current view frustum of the avatar. + // Represents the current view frustum of the avatar. ViewFrustum* getViewFrustum(); const ViewFrustum* getViewFrustum() const; - // Represents the view frustum of the current rendering pass, - // which might be different from the viewFrustum, i.e. shadowmap + // Represents the view frustum of the current rendering pass, + // which might be different from the viewFrustum, i.e. shadowmap // passes, mirror window passes, etc ViewFrustum* getDisplayViewFrustum(); const ViewFrustum* getDisplayViewFrustum() const; @@ -215,7 +214,7 @@ public: OctreeQuery& getOctreeQuery() { return _octreeQuery; } EntityTree* getEntityClipboard() { return &_entityClipboard; } EntityTreeRenderer* getEntityClipboardRenderer() { return &_entityClipboardRenderer; } - + bool isMousePressed() const { return _mousePressed; } bool isMouseHidden() const { return !_cursorVisible; } const glm::vec3& getMouseRayOrigin() const { return _mouseRayOrigin; } @@ -237,7 +236,7 @@ public: int getTrueMouseDragStartedX() const { return getTrueMouseDragStarted().x; } int getTrueMouseDragStartedY() const { return getTrueMouseDragStarted().y; } bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } - + FaceTracker* getActiveFaceTracker(); FaceTracker* getSelectedFaceTracker(); @@ -254,7 +253,7 @@ public: virtual const Transform& getViewTransform() const { return _viewTransform; } void setViewTransform(const Transform& view); - + float getFieldOfView() { return _fieldOfView.get(); } void setFieldOfView(float fov) { _fieldOfView.set(fov); } @@ -319,7 +318,7 @@ public: QStringList getRunningScripts() { return _scriptEnginesHash.keys(); } ScriptEngine* getScriptEngine(QString scriptHash) { return _scriptEnginesHash.contains(scriptHash) ? _scriptEnginesHash[scriptHash] : NULL; } - + bool isLookingAtMyAvatar(Avatar* avatar); float getRenderResolutionScale() const; @@ -344,17 +343,17 @@ public: RunningScriptsWidget* getRunningScriptsWidget() { return _runningScriptsWidget; } Bookmarks* getBookmarks() const { return _bookmarks; } - + QString getScriptsLocation(); void setScriptsLocation(const QString& scriptsLocation); - + void initializeAcceptedFiles(); bool canAcceptURL(const QString& url); bool acceptURL(const QString& url); void setMaxOctreePacketsPerSecond(int maxOctreePPS); int getMaxOctreePacketsPerSecond(); - + render::ScenePointer getMain3DScene() { return _main3DScene; } render::EnginePointer getRenderEngine() { return _renderEngine; } @@ -373,7 +372,7 @@ signals: /// Fired when the import window is closed void importDone(); - + void scriptLocationChanged(const QString& newPath); void svoImportRequested(const QString& url); @@ -384,7 +383,7 @@ signals: void headURLChanged(const QString& newValue, const QString& modelName); void bodyURLChanged(const QString& newValue, const QString& modelName); void fullAvatarURLChanged(const QString& newValue, const QString& modelName); - + void beforeAboutToQuit(); public slots: @@ -408,7 +407,7 @@ public slots: bool askToSetAvatarUrl(const QString& url); bool askToLoadScript(const QString& scriptFilenameOrURL); - ScriptEngine* loadScript(const QString& scriptFilename = QString(), bool isUserLoaded = true, + ScriptEngine* loadScript(const QString& scriptFilename = QString(), bool isUserLoaded = true, bool loadScriptFromEditor = false, bool activateMainWindow = false, bool reload = false); void reloadScript(const QString& scriptName, bool isUserLoaded = true); void scriptFinished(const QString& scriptName); @@ -424,11 +423,11 @@ public slots: void friendsWindowClosed(); void packageModel(); - + void openUrl(const QUrl& url); void updateMyAvatarTransform(); - + void domainSettingsReceived(const QJsonObject& domainSettingsObject); void setVSyncEnabled(); @@ -439,14 +438,14 @@ public slots: void aboutApp(); void showEditEntitiesHelp(); - + void loadSettings(); void saveSettings(); void notifyPacketVersionMismatch(); void domainConnectionDenied(const QString& reason); - + void cameraMenuChanged(); private slots: @@ -454,7 +453,7 @@ private slots: void checkFPS(); void idle(); void aboutToQuit(); - + void handleScriptEngineLoaded(const QString& scriptFilename); void handleScriptLoadError(const QString& scriptFilename); @@ -464,7 +463,7 @@ private slots: void setFullscreen(bool fullscreen); void setEnable3DTVMode(bool enable3DTVMode); void setEnableVRMode(bool enableVRMode); - + void rotationModeChanged(); glm::vec2 getScaledScreenPoint(glm::vec2 projectedPoint); @@ -474,9 +473,9 @@ private slots: void shrinkMirrorView(); void manageRunningScriptsWidgetVisibility(bool shown); - + void runTests(); - + void audioMuteToggled(); void faceTrackerMuteToggled(); @@ -491,7 +490,7 @@ private: void initDisplay(); void init(); - + void cleanupBeforeQuit(); void update(float deltaTime); @@ -528,7 +527,7 @@ private: ToolWindow* _toolWindow; WebWindowClass* _friendsWindow; - + DatagramProcessor* _datagramProcessor; QUndoStack _undoStack; @@ -569,7 +568,7 @@ private: Camera _myCamera; // My view onto the world Camera _mirrorCamera; // Cammera for mirror view QRect _mirrorViewRect; - + Setting::Handle _firstRun; Setting::Handle _previousScriptLocation; Setting::Handle _scriptsLocationHandle; @@ -648,23 +647,23 @@ private: quint64 _lastSendDownstreamAudioStats; bool _isVSyncOn; - + bool _aboutToQuit; Bookmarks* _bookmarks; bool _notifiedPacketVersionMismatchThisDomain; - + QThread _settingsThread; QTimer _settingsTimer; - + GLCanvas* _glWidget = new GLCanvas(); // our GLCanvas has a couple extra features void checkSkeleton(); QWidget* _fullscreenMenuWidget = new QWidget(); int _menuBarHeight; - + QHash _acceptedExtensions; QList _domainConnectionRefusals; diff --git a/libraries/networking/src/NetworkPacket.cpp b/libraries/networking/src/NetworkPacket.cpp deleted file mode 100644 index b2cc9d6751..0000000000 --- a/libraries/networking/src/NetworkPacket.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// -// NetworkPacket.cpp -// libraries/networking/src -// -// Created by Brad Hefta-Gaub on 8/9/13. -// Copyright 2013 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 -#include -#include - -#include "SharedUtil.h" -#include "NetworkLogging.h" - -#include "NetworkPacket.h" - -NetworkPacket::NetworkPacket(const NetworkPacket& other) : - _node(other._node), - _nlPacket(other._nlPacket) { -} - -NetworkPacket::NetworkPacket(const SharedNodePointer& node, const NLPacket& packet) { - if (packet.getSizeWithHeader() && packet.getSizeWithHeader() <= MAX_PACKET_SIZE) { - _node = node; - _nlPacket = packet; - } else { - qCDebug(networking, ">>> NetworkPacket::copyContents() unexpected length = %d", packet.size()); - } -}; - -// copy assignment -NetworkPacket& NetworkPacket::operator=(NetworkPacket const& other) { - _node = other._node; - _nlPacket = NLPacket::createCopy(other._nlPacket); - return *this; -} - -#ifdef HAS_MOVE_SEMANTICS -// move, same as copy, but other packet won't be used further -NetworkPacket::NetworkPacket(NetworkPacket&& other) : - _node(std::move(other._node)), - _nlPacket(std::move(other._nlPacket)) { -} - -// move assignment -NetworkPacket& NetworkPacket::operator=(NetworkPacket&& other) { - _node = std::move(other._node); - _nlPacket = std::move(other._nlPacket); - return *this; -} -#endif diff --git a/libraries/networking/src/NetworkPacket.h b/libraries/networking/src/NetworkPacket.h deleted file mode 100644 index a4484f31d5..0000000000 --- a/libraries/networking/src/NetworkPacket.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// NetworkPacket.h -// libraries/networking/src -// -// Created by Brad Hefta-Gaub on 8/9/13. -// Copyright 2013 High Fidelity, Inc. -// -// A really simple class that stores a network packet between being received and being processed -// -// 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_NetworkPacket_h -#define hifi_NetworkPacket_h - -#include "NodeList.h" - -/// Storage of not-yet processed inbound, or not yet sent outbound generic UDP network packet -class NetworkPacket { -public: - NetworkPacket(); - NetworkPacket(const NetworkPacket& packet); // copy constructor - NetworkPacket& operator= (const NetworkPacket& other); // copy assignment - -#ifdef HAS_MOVE_SEMANTICS - NetworkPacket(NetworkPacket&& other); // move?? // same as copy, but other packet won't be used further - NetworkPacket& operator= (NetworkPacket&& other); // move assignment -#endif - - NetworkPacket(const SharedNodePointer& node, const NLPacket& nlPacket); - - const SharedNodePointer& getNode() const { return _node; } - const NLPacket& getPacket() const { return _nlPacket; } - -private: - - SharedNodePointer _node; - NLPacket _nlPacket; -}; - -#endif // hifi_NetworkPacket_h diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 5e70b45b5f..6858a3f4b4 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -37,6 +37,8 @@ const quint64 DOMAIN_SERVER_CHECK_IN_MSECS = 1 * 1000; const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5; +using std::pair> NodePacketPair; + class Application; class Assignment; diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index 4481cd716c..31104661f6 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -48,11 +48,13 @@ PacketSender::~PacketSender() { } -void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, const NLPacket& packet) { - NetworkPacket networkPacket(destinationNode, packet); +void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, std::unique_ptr packet) { + NodePacketPair networkPacket(destinationNode, packet); + lock(); _packets.push_back(networkPacket); unlock(); + _totalPacketsQueued++; _totalBytesQueued += packet.getSizeWithHeader(); @@ -118,7 +120,7 @@ bool PacketSender::threadedProcess() { // if threaded and we haven't slept? We want to wait for our consumer to signal us with new packets if (!hasSlept) { - // wait till we have packets + // wait till we have packets _waitingOnPacketsMutex.lock(); _hasPackets.wait(&_waitingOnPacketsMutex); _waitingOnPacketsMutex.unlock(); @@ -264,21 +266,24 @@ bool PacketSender::nonThreadedProcess() { // Now that we know how many packets to send this call to process, just send them. while ((packetsSentThisCall < packetsToSendThisCall) && (packetsLeft > 0)) { lock(); - NetworkPacket& packet = _packets.front(); - NetworkPacket temporary = packet; // make a copy - _packets.erase(_packets.begin()); + + NodePacketPair& packetPair = _packets.pop_front(); packetsLeft = _packets.size(); + unlock(); // send the packet through the NodeList... - DependencyManager::get()->sendUnreliablePacket(temporary.getPacket(), temporary.getNode()); + DependencyManager::get()->sendUnreliablePacket(packetPair->second(), packetPair->first()); + packetsSentThisCall++; _packetsOverCheckInterval++; _totalPacketsSent++; - _totalBytesSent += temporary.getPacket().getSizeWithHeader(); - - emit packetSent(temporary.getPacket().getSizeWithHeader()); - + + int packetSize = packetPair->second().getSizeWithHeader(); + + _totalBytesSent += packetSize; + emit packetSent(packetSize); + _lastSendTime = now; } return isStillRunning(); diff --git a/libraries/networking/src/PacketSender.h b/libraries/networking/src/PacketSender.h index 6754da9825..e4792c55c3 100644 --- a/libraries/networking/src/PacketSender.h +++ b/libraries/networking/src/PacketSender.h @@ -17,7 +17,6 @@ #include #include "GenericThread.h" -#include "NetworkPacket.h" #include "NodeList.h" #include "SharedUtil.h" @@ -39,7 +38,7 @@ public: ~PacketSender(); /// Add packet to outbound queue. - void queuePacketForSending(const SharedNodePointer& destinationNode, const NLPacket& packet); + void queuePacketForSending(const SharedNodePointer& destinationNode, std::unique_ptr packet); void setPacketsPerSecond(int packetsPerSecond); int getPacketsPerSecond() const { return _packetsPerSecond; } @@ -100,7 +99,7 @@ protected: SimpleMovingAverage _averageProcessCallTime; private: - std::vector _packets; + std::list _packets; quint64 _lastSendTime; bool threadedProcess(); diff --git a/libraries/networking/src/ReceivedPacketProcessor.cpp b/libraries/networking/src/ReceivedPacketProcessor.cpp index 3c4b32b4ec..dba00fd08a 100644 --- a/libraries/networking/src/ReceivedPacketProcessor.cpp +++ b/libraries/networking/src/ReceivedPacketProcessor.cpp @@ -21,12 +21,14 @@ void ReceivedPacketProcessor::queueReceivedPacket(const SharedNodePointer& sendi // Make sure our Node and NodeList knows we've heard from this node. sendingNode->setLastHeardMicrostamp(usecTimestampNow()); - NetworkPacket networkPacket(sendingNode, packet); + // TODO: fix the NodePacketPair once we've figured out receive API + NodePacketPair networkPacket(sendingNode, NLPacket::create(PacketType::OctreeStats)); + lock(); _packets.push_back(networkPacket); _nodePacketCounts[sendingNode->getUUID()]++; unlock(); - + // Make sure to wake our actual processing thread because we now have packets for it to process. _hasPackets.wakeAll(); } @@ -50,7 +52,8 @@ bool ReceivedPacketProcessor::process() { unlock(); foreach(auto& packet, currentPackets) { - processPacket(packet.getNode(), packet.getByteArray()); + // TODO: Replace QByteArray() once NLPacket is coming through on receive side + processPacket(packet->first(), QByteArray()); midProcess(); } diff --git a/libraries/networking/src/ReceivedPacketProcessor.h b/libraries/networking/src/ReceivedPacketProcessor.h index bcc9f9a1f5..f70c823d2a 100644 --- a/libraries/networking/src/ReceivedPacketProcessor.h +++ b/libraries/networking/src/ReceivedPacketProcessor.h @@ -15,9 +15,8 @@ #include #include "GenericThread.h" -#include "NetworkPacket.h" -/// Generalized threaded processor for handling received inbound packets. +/// Generalized threaded processor for handling received inbound packets. class ReceivedPacketProcessor : public GenericThread { Q_OBJECT public: @@ -74,8 +73,7 @@ protected: virtual void postProcess() { } protected: - - QVector _packets; + std::list _packets; QHash _nodePacketCounts; QWaitCondition _hasPackets; From cc045c2a3019dab3e511dd8f8150ecd0b168230c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 16:57:41 -0700 Subject: [PATCH 113/582] fix using for NodePacketPair typedef --- libraries/networking/src/NodeList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 6858a3f4b4..43e35f8958 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -37,7 +37,7 @@ const quint64 DOMAIN_SERVER_CHECK_IN_MSECS = 1 * 1000; const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5; -using std::pair> NodePacketPair; +using NodePacketPair = std::pair>; class Application; class Assignment; From 88f8f692fb6a5346c237d59f666bca40dc864f41 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 17:31:14 -0700 Subject: [PATCH 114/582] fix QDataStream creation with NLPacket --- libraries/networking/src/LimitedNodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index b114492780..a766f21292 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -525,7 +525,7 @@ std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingTy int packetSize = sizeof(PingType_t) + sizeof(quint64); auto pingPacket = NLPacket::create(PacketType::Ping, packetSize); - QDataStream packetStream(&pingPacket); + QDataStream packetStream(pingPacket->get()); packetStream << pingType; packetStream << usecTimestampNow(); From bf625f5af1f66bd5970204a4a9e16e1f3b339c33 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 17:39:58 -0700 Subject: [PATCH 115/582] move JSON stats sending to a packet list --- libraries/networking/src/NodeList.cpp | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 21b3bdff96..68765489f9 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -93,40 +93,22 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { - QByteArray statsPacket(MAX_PACKET_SIZE, 0); - int numBytesForPacketHeader = populatePacketHeader(statsPacket, PacketTypeNodeJsonStats); + NLPacketList statsPacketList(PacketType::NodeJsonStats); // get a QStringList using JSONBreakableMarshal QStringList statsStringList = JSONBreakableMarshal::toStringList(statsObject, ""); int numBytesWritten = numBytesForPacketHeader; - // enumerate the resulting strings - pack them and send off packets once we hit MTU size + // enumerate the resulting strings - pack them and send off packets via NLPacketList foreach(const QString& statsItem, statsStringList) { QByteArray utf8String = statsItem.toUtf8(); utf8String.append('\0'); - if (numBytesWritten + utf8String.size() > MAX_PACKET_SIZE) { - // send off the current packet since the next string will make us too big - statsPacket.resize(numBytesWritten); - writeUnverifiedDatagram(statsPacket, destination); - - // reset the number of bytes written to the size of our packet header - numBytesWritten = numBytesForPacketHeader; - } - - // write this string into the stats packet - statsPacket.replace(numBytesWritten, utf8String.size(), utf8String); - - // keep track of the number of bytes we have written - numBytesWritten += utf8String.size(); + statsStringList->write(utfString); } - if (numBytesWritten > numBytesForPacketHeader) { - // always send the last packet, if it has data - statsPacket.resize(numBytesWritten); - writeUnverifiedDatagram(statsPacket, destination); - } + sendPacketList(statsStringList, destination); // enumerate the resulting strings, breaking them into MTU sized packets return 0; From 1cfa65a3df207ddb9e25e49271e209ed5ea558fe Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 17:40:15 -0700 Subject: [PATCH 116/582] fix reference to NodePacketPair packet in PacketSender --- libraries/networking/src/PacketSender.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index 31104661f6..9b18bf6d29 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -56,7 +56,7 @@ void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNod unlock(); _totalPacketsQueued++; - _totalBytesQueued += packet.getSizeWithHeader(); + _totalBytesQueued += packet->getSizeWithHeader(); // Make sure to wake our actual processing thread because we now have packets for it to process. _hasPackets.wakeAll(); @@ -279,7 +279,7 @@ bool PacketSender::nonThreadedProcess() { _packetsOverCheckInterval++; _totalPacketsSent++; - int packetSize = packetPair->second().getSizeWithHeader(); + int packetSize = packetPair->second()->getSizeWithHeader(); _totalBytesSent += packetSize; emit packetSent(packetSize); From 7a9dbd7f2fda757db75dfda9cacd45088ebb3905 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 17:50:32 -0700 Subject: [PATCH 117/582] repairs for NetworkPacket removal --- libraries/networking/src/PacketSender.cpp | 7 ++++--- libraries/networking/src/ReceivedPacketProcessor.cpp | 10 +++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index 9b18bf6d29..0a19df8186 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -267,19 +267,20 @@ bool PacketSender::nonThreadedProcess() { while ((packetsSentThisCall < packetsToSendThisCall) && (packetsLeft > 0)) { lock(); - NodePacketPair& packetPair = _packets.pop_front(); + NodePacketPair packetPair = std::move(_packets.front()); + _packets.pop_front(); packetsLeft = _packets.size(); unlock(); // send the packet through the NodeList... - DependencyManager::get()->sendUnreliablePacket(packetPair->second(), packetPair->first()); + DependencyManager::get()->sendUnreliablePacket(packetPair.second, packetPair.first); packetsSentThisCall++; _packetsOverCheckInterval++; _totalPacketsSent++; - int packetSize = packetPair->second()->getSizeWithHeader(); + int packetSize = packetPair.second->getSizeWithHeader(); _totalBytesSent += packetSize; emit packetSent(packetSize); diff --git a/libraries/networking/src/ReceivedPacketProcessor.cpp b/libraries/networking/src/ReceivedPacketProcessor.cpp index dba00fd08a..2041b80e91 100644 --- a/libraries/networking/src/ReceivedPacketProcessor.cpp +++ b/libraries/networking/src/ReceivedPacketProcessor.cpp @@ -47,19 +47,19 @@ bool ReceivedPacketProcessor::process() { } lock(); - QVector currentPackets; + std::list currentPackets; currentPackets.swap(_packets); unlock(); - foreach(auto& packet, currentPackets) { + foreach(auto& packetPair, currentPackets) { // TODO: Replace QByteArray() once NLPacket is coming through on receive side - processPacket(packet->first(), QByteArray()); + processPacket(packetPair.first, QByteArray()); midProcess(); } lock(); - foreach(auto& packet, currentPackets) { - _nodePacketCounts[packet.getNode()->getUUID()]--; + foreach(auto& packetPair, currentPackets) { + _nodePacketCounts[packetPair.first->getUUID()]--; } unlock(); From e0aea7f95543da19194555d2c88ba4f5520f5d31 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 17:52:33 -0700 Subject: [PATCH 118/582] fix QDataStream creations in LimitedNodeList --- libraries/networking/src/LimitedNodeList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a766f21292..5314d07271 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -525,7 +525,7 @@ std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingTy int packetSize = sizeof(PingType_t) + sizeof(quint64); auto pingPacket = NLPacket::create(PacketType::Ping, packetSize); - QDataStream packetStream(pingPacket->get()); + QDataStream packetStream(pingPacket.get()); packetStream << pingType; packetStream << usecTimestampNow(); @@ -547,7 +547,7 @@ std::unique_ptr LimitedNodeList::constructPingReplyPacket(const QByteA auto replyPacket = NLPacket::create(PacketType::Ping, packetSize); - QDataStream packetStream(&replyPacket); + QDataStream packetStream(replyPacket.get()); packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); return replyPacket; From 61960c80c8fd2f23f21ac7d08e6603a4c983024b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 17:53:05 -0700 Subject: [PATCH 119/582] fix PingType_t cast for icePingPacket --- libraries/networking/src/LimitedNodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 5314d07271..2a833dc94b 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -559,7 +559,7 @@ std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUui auto icePingPacket = NLPacket::create(PacketType::ICEPing, packetSize); icePingPacket->write(iceID.toRfc4122()); - icePingPacket->write(&pingType, sizeof(pingType)); + icePingPacket->write(reinterpret_cast(&pingType), sizeof(pingType)); return icePingPacket; } From 402f7dc075382d7f69b3f2da04485b580402ae93 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 17:56:05 -0700 Subject: [PATCH 120/582] correct PingType_t pack and PacketList readData --- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/PacketList.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2a833dc94b..2572280613 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -575,7 +575,7 @@ std::unique_ptr constructICEPingReplyPacket(const QByteArray& pingPack // pack the ICE ID and then the ping type icePingReplyPacket->write(iceID.toRfc4122()); - icePingReplyPacket->write(&pingType, sizeof(pingType)); + icePingReplyPacket->write(reinterpret_cast(&pingType), sizeof(pingType)); return icePingReplyPacket; } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index a194121324..64d8871dda 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -34,7 +34,7 @@ public: void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } protected: qint64 writeData(const char* data, qint64 maxSize); - qint64 readData(const char* data, qint64 maxSize) { return 0; }; + qint64 readData(char* data, qint64 maxSize) { return 0; } private: std::unique_ptr createPacketWithExtendedHeader(); From e7e489af61ab2878f0ae6792a9a532b10312a5d1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:01:17 -0700 Subject: [PATCH 121/582] use new networking in sendPacketToIceServer --- ice-server/src/IceServer.cpp | 11 ++++++----- libraries/networking/src/LimitedNodeList.cpp | 17 ++++++++--------- libraries/networking/src/LimitedNodeList.h | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index ec93204e85..80519690b6 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -62,21 +62,22 @@ void IceServer::processDatagrams() { // so that we can send packets to the heartbeating peer when we need, we need to activate a socket now peer->activateMatchingOrNewSymmetricSocket(sendingSockAddr); } else if (packetType == PacketTypeIceServerQuery) { + QDataStream heartbeatStream(incomingPacket); // this is a node hoping to connect to a heartbeating peer - do we have the heartbeating peer? - QUuid senderUUID = uuidFromPacketHeader(incomingPacket); + QUuid senderUUID; + heartbeatStream >> senderUUID; // pull the public and private sock addrs for this peer HifiSockAddr publicSocket, localSocket; - QDataStream hearbeatStream(incomingPacket); - hearbeatStream.skipRawData(numBytesForPacketHeader(incomingPacket)); + heartbeatStream.skipRawData(numBytesForPacketHeader(incomingPacket)); - hearbeatStream >> publicSocket >> localSocket; + heartbeatStream >> publicSocket >> localSocket; // check if this node also included a UUID that they would like to connect to QUuid connectRequestID; - hearbeatStream >> connectRequestID; + heartbeatStream >> connectRequestID; SharedNetworkPeer matchingPeer = _activePeers.value(connectRequestID); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2572280613..87c150b4bd 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -848,23 +848,22 @@ void LimitedNodeList::updateLocalSockAddr() { } void LimitedNodeList::sendHeartbeatToIceServer(const HifiSockAddr& iceServerSockAddr) { - sendPacketToIceServer(PacketTypeIceServerHeartbeat, iceServerSockAddr, _sessionUUID); + sendPacketToIceServer(PacketType::ICEServerHeartbeat, iceServerSockAddr, _sessionUUID); } void LimitedNodeList::sendPeerQueryToIceServer(const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerID) { - sendPacketToIceServer(PacketTypeIceServerQuery, iceServerSockAddr, clientID, peerID); + sendPacketToIceServer(PacketType::ICEServerQuery, iceServerSockAddr, clientID, peerID); } void LimitedNodeList::sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, - const QUuid& headerID, const QUuid& peerID) { + const QUuid& clientID, const QUuid& peerID) { + auto icePacket = Packet::create(packetType); - QByteArray iceRequestByteArray = byteArrayWithUUIDPopulatedHeader(packetType, headerID); - QDataStream iceDataStream(&iceRequestByteArray, QIODevice::Append); + QDataStream iceDataStream(icePacket.get()); + iceDataStream << clientID << _publicSockAddr << _localSockAddr; - iceDataStream << _publicSockAddr << _localSockAddr; - - if (packetType == PacketTypeIceServerQuery) { + if (packetType == PacketType::ICEServerQuery) { assert(!peerID.isNull()); iceDataStream << peerID; @@ -873,7 +872,7 @@ void LimitedNodeList::sendPacketToIceServer(PacketType::Value packetType, const << uuidStringWithoutCurlyBraces(peerID); } - writeUnverifiedDatagram(iceRequestByteArray, iceServerSockAddr); + sendPacket(icePacket, iceServerSockAddr); } void LimitedNodeList::putLocalPortIntoSharedMemory(const QString key, QObject* parent, quint16 localPort) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 078207077c..6015272207 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -287,7 +287,7 @@ protected: void stopInitialSTUNUpdate(bool success); - void sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& headerID, + void sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerRequestID = QUuid()); QUuid _sessionUUID; From e6f1fef6e484114d6b40bda6275cc00aa5a346f5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:02:08 -0700 Subject: [PATCH 122/582] remove numBytesForPacketHeader from sendStats --- libraries/networking/src/NodeList.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 68765489f9..9373ef3d97 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -98,8 +98,6 @@ qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& d // get a QStringList using JSONBreakableMarshal QStringList statsStringList = JSONBreakableMarshal::toStringList(statsObject, ""); - int numBytesWritten = numBytesForPacketHeader; - // enumerate the resulting strings - pack them and send off packets via NLPacketList foreach(const QString& statsItem, statsStringList) { QByteArray utf8String = statsItem.toUtf8(); From acd8b610a66bb1917b8e548d9e9f4622369b3f46 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:05:29 -0700 Subject: [PATCH 123/582] move icePacket before send to ice server --- libraries/networking/src/LimitedNodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 87c150b4bd..75bc789a83 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -872,7 +872,7 @@ void LimitedNodeList::sendPacketToIceServer(PacketType::Value packetType, const << uuidStringWithoutCurlyBraces(peerID); } - sendPacket(icePacket, iceServerSockAddr); + sendPacket(std::move(icePacket), iceServerSockAddr); } void LimitedNodeList::putLocalPortIntoSharedMemory(const QString key, QObject* parent, quint16 localPort) { From 674d43864ceab150c075acb8d4b8ae487c2426c9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:08:37 -0700 Subject: [PATCH 124/582] add ICE packets to non sourced packets --- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/PacketHeaders.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 75bc789a83..db7275eb49 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -858,7 +858,7 @@ void LimitedNodeList::sendPeerQueryToIceServer(const HifiSockAddr& iceServerSock void LimitedNodeList::sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerID) { - auto icePacket = Packet::create(packetType); + auto icePacket = NLPacket::create(packetType); QDataStream iceDataStream(icePacket.get()); iceDataStream << clientID << _publicSockAddr << _localSockAddr; diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 51d0babc39..2fc21b9a38 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -23,8 +23,7 @@ const QSet NON_VERIFIED_PACKETS = QSet() << CreateAssignment << RequestAssignment << StunResponse << NodeJsonStats << EntityQuery << OctreeDataNack << EntityEditNack - << ICEServerHeartbeat << ICEServerPeerInformation - << ICEServerQuery << Ping + << Ping << PingReply << StopNode << DomainServerPathQuery << DomainServerPathResponse << DomainServerAddedNode; @@ -32,6 +31,7 @@ const QSet NON_VERIFIED_PACKETS = QSet() const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; const QSet NON_SOURCED_PACKETS = QSet() + << ICEServerPeerInformation << ICEServerQuery << ICEServerHeartbeat << ICEPing << ICEPingReply << DomainConnectRequest; int arithmeticCodingValueFromBuffer(const char* checkValue) { From c814fbbc93489d588e66532e29ef412211709ac8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:10:52 -0700 Subject: [PATCH 125/582] fix packet list sending of JSON stats --- libraries/networking/src/NodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9373ef3d97..3b014f47fc 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -106,7 +106,7 @@ qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& d statsStringList->write(utfString); } - sendPacketList(statsStringList, destination); + sendPacketList(statsPacketList, destination); // enumerate the resulting strings, breaking them into MTU sized packets return 0; From c4da2d46c6376a5e358ca59e401d9075444f7dda Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:11:56 -0700 Subject: [PATCH 126/582] more compile fixes in NodeList --- libraries/networking/src/NodeList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 3b014f47fc..590a76e32d 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -103,7 +103,7 @@ qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& d QByteArray utf8String = statsItem.toUtf8(); utf8String.append('\0'); - statsStringList->write(utfString); + statsPacketList.write(utf8String); } sendPacketList(statsPacketList, destination); @@ -172,7 +172,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr _domainHandler.parseDTLSRequirementPacket(packet); break; } - case PacketType::IceServerPeerInformation: { + case PacketType::ICEServerPeerInformation: { if (!_domainHandler.getICEPeer().hasSockets()) { _domainHandler.processICEResponsePacket(packet); } From 4131adc92be41327bcb96e259b8cb04c6a83a2a7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:15:00 -0700 Subject: [PATCH 127/582] add API to send a packet to override sock addr --- libraries/networking/src/LimitedNodeList.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 6015272207..7fc93b4f64 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -147,8 +147,10 @@ public: qint64 sendUnreliablePacket(std::unique_ptr& packet, const SharedNodePointer& destinationNode) {}; qint64 sendUnreliablePacket(std::unique_ptr& packet, const HifiSockAddr& sockAddr) {}; + qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) {}; qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) {}; + qint64 sendPacketList(NLPacketList& packetList, const SharedNodePointer& destinationNode) {}; qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) {}; @@ -290,6 +292,10 @@ protected: void sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerRequestID = QUuid()); + qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr) {}; + + QUuid _sessionUUID; NodeHash _nodeHash; QReadWriteLock _nodeMutex; From ca45c3f44dba7fc441a3f44ab2be63a2cba00106 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:15:44 -0700 Subject: [PATCH 128/582] fix packet initialization in sendDomainServerCheckIn --- libraries/networking/src/NodeList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 590a76e32d..9f6be93a5b 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -309,8 +309,8 @@ void NodeList::sendDomainServerCheckIn() { } - auto domainPacket { NLPacket::create(domainPacketType); } - QDataStream packetStream(&domainPacket->getPayload); + auto domainPacket = NLPacket::create(domainPacketType); + QDataStream packetStream(domainPacket.get()); if (domainPacketType == PacketType::DomainConnectRequest) { QUuid connectUUID; From 5d95a5c117571c386d291fd04c4a71b01c5cc21b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 18:17:28 -0700 Subject: [PATCH 129/582] Compile fixes --- libraries/networking/src/NodeList.cpp | 8 ++++---- libraries/networking/src/PacketSender.cpp | 4 +--- libraries/networking/src/ReceivedPacketProcessor.cpp | 6 +++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9f6be93a5b..95cad20a15 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -398,11 +398,11 @@ void NodeList::sendDSPathQuery(const QString& newPath) { QByteArray pathQueryUTF8 = newPath.toUtf8(); // get the size of the UTF8 representation of the desired path - quint16 numPathBytes = pathQueryUTF8.size(); + qint64 numPathBytes = pathQueryUTF8.size(); - if (numPathBytes + sizeof(numPathBytes) < pathQueryPacket.size() ) { + if (numPathBytes + (qint64)sizeof(numPathBytes) < pathQueryPacket->bytesAvailable() ) { // append the size of the path to the query packet - pathQueryPacket->write(&numPathBytes, sizeof(numPathBytes)); + pathQueryPacket->write((char*)&pathQueryUTF8, sizeof(numPathBytes)); // append the path itself to the query packet pathQueryPacket->write(pathQueryUTF8); @@ -423,7 +423,7 @@ void NodeList::handleDSPathQueryResponse(const QByteArray& packet) { // This is a response to a path query we theoretically made. // In the future we may want to check that this was actually from our DS and for a query we actually made. - int numHeaderBytes = numBytesForPacketHeaderGivenPacketType(PacketTypeDomainServerPathResponse); + int numHeaderBytes = numBytesForPacketHeaderGivenPacketType(PacketType::DomainServerPathResponse); const char* startPosition = packet.data() + numHeaderBytes; const char* currentPosition = startPosition; diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index 0a19df8186..3db845166e 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -49,10 +49,8 @@ PacketSender::~PacketSender() { void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, std::unique_ptr packet) { - NodePacketPair networkPacket(destinationNode, packet); - lock(); - _packets.push_back(networkPacket); + _packets.push_back({destinationNode, std::move(packet)}); unlock(); _totalPacketsQueued++; diff --git a/libraries/networking/src/ReceivedPacketProcessor.cpp b/libraries/networking/src/ReceivedPacketProcessor.cpp index 2041b80e91..3d4fecff6e 100644 --- a/libraries/networking/src/ReceivedPacketProcessor.cpp +++ b/libraries/networking/src/ReceivedPacketProcessor.cpp @@ -25,7 +25,7 @@ void ReceivedPacketProcessor::queueReceivedPacket(const SharedNodePointer& sendi NodePacketPair networkPacket(sendingNode, NLPacket::create(PacketType::OctreeStats)); lock(); - _packets.push_back(networkPacket); + _packets.push_back(std::move(networkPacket)); _nodePacketCounts[sendingNode->getUUID()]++; unlock(); @@ -51,14 +51,14 @@ bool ReceivedPacketProcessor::process() { currentPackets.swap(_packets); unlock(); - foreach(auto& packetPair, currentPackets) { + for(auto& packetPair : currentPackets) { // TODO: Replace QByteArray() once NLPacket is coming through on receive side processPacket(packetPair.first, QByteArray()); midProcess(); } lock(); - foreach(auto& packetPair, currentPackets) { + for(auto& packetPair : currentPackets) { _nodePacketCounts[packetPair.first->getUUID()]--; } unlock(); From 07fe6f46990b12bcda4c589e1558314dc909a662 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:19:21 -0700 Subject: [PATCH 130/582] more compile error fixes for broken NodeList --- libraries/networking/src/NodeList.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9f6be93a5b..64ab25c555 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -400,9 +400,9 @@ void NodeList::sendDSPathQuery(const QString& newPath) { // get the size of the UTF8 representation of the desired path quint16 numPathBytes = pathQueryUTF8.size(); - if (numPathBytes + sizeof(numPathBytes) < pathQueryPacket.size() ) { + if (numPathBytes + sizeof(numPathBytes) < pathQueryPacket->bytesAvailable() ) { // append the size of the path to the query packet - pathQueryPacket->write(&numPathBytes, sizeof(numPathBytes)); + pathQueryPacket->write(reinterpret_cast(&numPathBytes), sizeof(numPathBytes)); // append the path itself to the query packet pathQueryPacket->write(pathQueryUTF8); @@ -423,7 +423,7 @@ void NodeList::handleDSPathQueryResponse(const QByteArray& packet) { // This is a response to a path query we theoretically made. // In the future we may want to check that this was actually from our DS and for a query we actually made. - int numHeaderBytes = numBytesForPacketHeaderGivenPacketType(PacketTypeDomainServerPathResponse); + int numHeaderBytes = numBytesForPacketHeaderGivenPacketType(PacketType::DomainServerPathResponse); const char* startPosition = packet.data() + numHeaderBytes; const char* currentPosition = startPosition; @@ -500,10 +500,10 @@ void NodeList::pingPunchForDomainServer() { flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendPingsToDS); // send the ping packet to the local and public sockets for this node - auto localPingPacket = constructICEPingPacket(PingType::Local); + auto localPingPacket = constructICEPingPacket(PingType::Local, _sessionUUID); sendPacket(std::move(localPingPacket), _domainHandler.getICEPeer().getLocalSocket()); - auto publicPingPacket = constructICEPingPacket(PingType::Public); + auto publicPingPacket = constructICEPingPacket(PingType::Public, _sessionUUID); sendPacket(std::move(publicPingPacket), _domainHandler.getICEPeer().getPublicSocket()); _domainHandler.getICEPeer().incrementConnectionAttempts(); From 737d85c59798626ece6924c04a76a6903e270f1c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 7 Jul 2015 18:22:06 -0700 Subject: [PATCH 131/582] Compile fixes --- libraries/networking/src/NodeList.cpp | 5 ++--- libraries/shared/src/RingBufferHistory.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 95cad20a15..65dae052f7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -583,9 +583,8 @@ void NodeList::parseNodeFromPacketStream(QDataStream& packetStream) { void NodeList::sendAssignment(Assignment& assignment) { - PacketType::Value assignmentPacketType = assignment.getCommand() == Assignment::CreateCommand - ? PacketTypeCreateAssignment - : PacketTypeRequestAssignment; + PacketType::Value assignmentPacketType = assignment.getCommand() == Assignment::CreateCommand ? + PacketType::CreateAssignment : PacketType::RequestAssignment; QByteArray packet = byteArrayWithPopulatedHeader(assignmentPacketType); QDataStream packetStream(&packet, QIODevice::Append); diff --git a/libraries/shared/src/RingBufferHistory.h b/libraries/shared/src/RingBufferHistory.h index 528d451d76..60b9f2caad 100644 --- a/libraries/shared/src/RingBufferHistory.h +++ b/libraries/shared/src/RingBufferHistory.h @@ -216,7 +216,7 @@ public: if (endAtIndex < 0) { endAtIndex += _size; } - return Iterator(&_buffer.first(), &_buffer.last(), &_buffer[_newestEntryAtIndex], &_buffer[endAtIndex]); + return Iterator(&_buffer.front(), &_buffer.back(), &_buffer[_newestEntryAtIndex], &_buffer[endAtIndex]); } }; From 11fd43a0941b00323299ab9de15ec0e50d08085c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:23:03 -0700 Subject: [PATCH 132/582] fix for packet types in send assignment --- libraries/networking/src/NodeList.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 0dcce7fe59..f8e7153ccf 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -584,15 +584,17 @@ void NodeList::parseNodeFromPacketStream(QDataStream& packetStream) { void NodeList::sendAssignment(Assignment& assignment) { PacketType::Value assignmentPacketType = assignment.getCommand() == Assignment::CreateCommand - ? PacketTypeCreateAssignment - : PacketTypeRequestAssignment; + ? PacketType::CreateAssignment + : PacketType::RequestAssignment; - QByteArray packet = byteArrayWithPopulatedHeader(assignmentPacketType); - QDataStream packetStream(&packet, QIODevice::Append); + auto assignmentPacket = NLPacket::create(assignmentPacketType); + + QDataStream packetStream(assignmentPacket.get()); packetStream << assignment; - _nodeSocket.writeDatagram(packet, _assignmentServerSocket.getAddress(), _assignmentServerSocket.getPort()); + // TODO: should this be a non sourced packet? + sendPacket(assignmentPacket, _assignmentServerSocket); } void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { From a489c3558d2f52bb788a7598d568303e45a16d55 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jul 2015 18:24:11 -0700 Subject: [PATCH 133/582] move the assignment packet --- libraries/networking/src/NodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index f8e7153ccf..6aafbd65f8 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -594,7 +594,7 @@ void NodeList::sendAssignment(Assignment& assignment) { packetStream << assignment; // TODO: should this be a non sourced packet? - sendPacket(assignmentPacket, _assignmentServerSocket); + sendPacket(std::move(assignmentPacket), _assignmentServerSocket); } void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { From 74940a2132529a8f748a2ac21f74de59cd2aaa23 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:18:11 -0700 Subject: [PATCH 134/582] replace lingering PacketTypes in old format --- assignment-client/src/Agent.cpp | 22 +++++----- assignment-client/src/AssignmentClient.cpp | 8 ++-- .../src/AssignmentClientMonitor.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 14 +++--- .../src/audio/AudioMixerClientData.cpp | 10 ++--- .../src/audio/AvatarAudioStream.cpp | 4 +- assignment-client/src/avatars/AvatarMixer.cpp | 12 ++--- .../src/entities/EntityNodeData.h | 2 +- assignment-client/src/entities/EntityServer.h | 4 +- assignment-client/src/octree/OctreeServer.cpp | 4 +- .../octree/OctreeServerDatagramProcessor.cpp | 2 +- domain-server/src/DomainServer.cpp | 30 ++++++------- ice-server/src/IceServer.cpp | 4 +- interface/src/Application.cpp | 2 +- interface/src/DatagramProcessor.cpp | 44 +++++++++---------- interface/src/avatar/MyAvatar.cpp | 2 +- .../src/octree/OctreePacketProcessor.cpp | 8 ++-- libraries/audio/src/InboundAudioStream.cpp | 4 +- libraries/avatars/src/AvatarData.cpp | 6 +-- libraries/avatars/src/AvatarHashMap.cpp | 8 ++-- .../src/EntityTreeRenderer.h | 4 +- .../entities/src/EntityEditPacketSender.cpp | 4 +- .../entities/src/EntityScriptingInterface.cpp | 12 ++--- libraries/entities/src/EntityTree.cpp | 22 +++++----- libraries/entities/src/EntityTree.h | 4 +- .../entities/src/EntityTreeHeadlessViewer.h | 4 +- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/NodeList.cpp | 2 +- libraries/octree/src/EditPacketBuffer.cpp | 2 +- libraries/octree/src/JurisdictionListener.cpp | 2 +- libraries/octree/src/JurisdictionListener.h | 6 +-- libraries/octree/src/JurisdictionMap.cpp | 4 +- libraries/octree/src/JurisdictionSender.cpp | 2 +- libraries/octree/src/JurisdictionSender.h | 2 +- libraries/octree/src/Octree.cpp | 2 +- libraries/octree/src/Octree.h | 2 +- .../octree/src/OctreeEditPacketSender.cpp | 6 +-- libraries/physics/src/EntityMotionState.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 6 +-- 39 files changed, 141 insertions(+), 141 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index b53a58c5c0..0cf5b4b7d5 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -58,7 +58,7 @@ void Agent::readPendingDatagrams() { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType::Value datagramPacketType = packetTypeForPacket(receivedPacket); - if (datagramPacketType == PacketTypeJurisdiction) { + if (datagramPacketType == PacketType::Jurisdiction) { int headerBytes = numBytesForPacketHeader(receivedPacket); SharedNodePointer matchedNode = nodeList->sendingNodeForPacket(receivedPacket); @@ -73,9 +73,9 @@ void Agent::readPendingDatagrams() { } } - } else if (datagramPacketType == PacketTypeOctreeStats - || datagramPacketType == PacketTypeEntityData - || datagramPacketType == PacketTypeEntityErase + } else if (datagramPacketType == PacketType::OctreeStats + || datagramPacketType == PacketType::EntityData + || datagramPacketType == PacketType::EntityErase ) { // Make sure our Node and NodeList knows we've heard from this node. SharedNodePointer sourceNode = nodeList->sendingNodeForPacket(receivedPacket); @@ -84,7 +84,7 @@ void Agent::readPendingDatagrams() { QByteArray mutablePacket = receivedPacket; int messageLength = mutablePacket.size(); - if (datagramPacketType == PacketTypeOctreeStats) { + if (datagramPacketType == PacketType::OctreeStats) { int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(mutablePacket, sourceNode); if (messageLength > statsMessageLength) { @@ -103,11 +103,11 @@ void Agent::readPendingDatagrams() { datagramPacketType = packetTypeForPacket(mutablePacket); } // fall through to piggyback message - if (datagramPacketType == PacketTypeEntityData || datagramPacketType == PacketTypeEntityErase) { + if (datagramPacketType == PacketType::EntityData || datagramPacketType == PacketType::EntityErase) { _entityViewer.processDatagram(mutablePacket, sourceNode); } - } else if (datagramPacketType == PacketTypeMixedAudio || datagramPacketType == PacketTypeSilentAudioFrame) { + } else if (datagramPacketType == PacketType::MixedAudio || datagramPacketType == PacketType::SilentAudioFrame) { _receivedAudioStream.parseData(receivedPacket); @@ -118,10 +118,10 @@ void Agent::readPendingDatagrams() { // let this continue through to the NodeList so it updates last heard timestamp // for the sending audio mixer DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); - } else if (datagramPacketType == PacketTypeBulkAvatarData - || datagramPacketType == PacketTypeAvatarIdentity - || datagramPacketType == PacketTypeAvatarBillboard - || datagramPacketType == PacketTypeKillAvatar) { + } else if (datagramPacketType == PacketType::BulkAvatarData + || datagramPacketType == PacketType::AvatarIdentity + || datagramPacketType == PacketType::AvatarBillboard + || datagramPacketType == PacketType::KillAvatar) { // let the avatar hash map process it DependencyManager::get()->processAvatarMixerDatagram(receivedPacket, nodeList->sendingNodeForPacket(receivedPacket)); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index b503f59156..fd9e4f4f71 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -218,9 +218,9 @@ void AssignmentClient::readPendingDatagrams() { senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - if (packetTypeForPacket(receivedPacket) == PacketTypeCreateAssignment) { + if (packetTypeForPacket(receivedPacket) == PacketType::CreateAssignment) { - qDebug() << "Received a PacketTypeCreateAssignment - attempting to unpack."; + qDebug() << "Received a PacketType::CreateAssignment - attempting to unpack."; // construct the deployed assignment from the packet data _currentAssignment = AssignmentFactory::unpackAssignment(receivedPacket); @@ -271,10 +271,10 @@ void AssignmentClient::readPendingDatagrams() { } else { qDebug() << "Received an assignment that could not be unpacked. Re-requesting."; } - } else if (packetTypeForPacket(receivedPacket) == PacketTypeStopNode) { + } else if (packetTypeForPacket(receivedPacket) == PacketType::StopNode) { if (senderSockAddr.getAddress() == QHostAddress::LocalHost || senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - qDebug() << "AssignmentClientMonitor at" << senderSockAddr << "requested stop via PacketTypeStopNode."; + qDebug() << "AssignmentClientMonitor at" << senderSockAddr << "requested stop via PacketType::StopNode."; QCoreApplication::quit(); } else { diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 3331e81a18..7dabde54d6 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -214,7 +214,7 @@ void AssignmentClientMonitor::readPendingDatagrams() { senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - if (packetTypeForPacket(receivedPacket) == PacketTypeNodeJsonStats) { + if (packetTypeForPacket(receivedPacket) == PacketType::NodeJsonStats) { QUuid packetUUID = uuidFromPacketHeader(receivedPacket); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); if (!matchingNode) { diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index f73735ddb5..bc69374b57 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -540,18 +540,18 @@ void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const Hif if (nodeList->packetVersionAndHashMatch(receivedPacket)) { // pull any new audio data from nodes off of the network stack PacketType::Value mixerPacketType = packetTypeForPacket(receivedPacket); - if (mixerPacketType == PacketTypeMicrophoneAudioNoEcho - || mixerPacketType == PacketTypeMicrophoneAudioWithEcho - || mixerPacketType == PacketTypeInjectAudio - || mixerPacketType == PacketTypeSilentAudioFrame - || mixerPacketType == PacketTypeAudioStreamStats) { + if (mixerPacketType == PacketType::MicrophoneAudioNoEcho + || mixerPacketType == PacketType::MicrophoneAudioWithEcho + || mixerPacketType == PacketType::InjectAudio + || mixerPacketType == PacketType::SilentAudioFrame + || mixerPacketType == PacketType::AudioStreamStats) { nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket); - } else if (mixerPacketType == PacketTypeMuteEnvironment) { + } else if (mixerPacketType == PacketType::MuteEnvironment) { SharedNodePointer sendingNode = nodeList->sendingNodeForPacket(receivedPacket); if (sendingNode->getCanAdjustLocks()) { QByteArray packet = receivedPacket; - nodeList->populatePacketHeader(packet, PacketTypeMuteEnvironment); + nodeList->populatePacketHeader(packet, PacketType::MuteEnvironment); nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getType() == NodeType::Agent && node->getActiveSocket() && diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index b9fe98a2bd..c394305998 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -51,7 +51,7 @@ AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() const { int AudioMixerClientData::parseData(const QByteArray& packet) { PacketType::Value packetType = packetTypeForPacket(packet); - if (packetType == PacketTypeAudioStreamStats) { + if (packetType == PacketType::AudioStreamStats) { const char* dataAt = packet.data(); @@ -67,9 +67,9 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { } else { PositionalAudioStream* matchingStream = NULL; - if (packetType == PacketTypeMicrophoneAudioWithEcho - || packetType == PacketTypeMicrophoneAudioNoEcho - || packetType == PacketTypeSilentAudioFrame) { + if (packetType == PacketType::MicrophoneAudioWithEcho + || packetType == PacketType::MicrophoneAudioNoEcho + || packetType == PacketType::SilentAudioFrame) { QUuid nullUUID = QUuid(); if (!_audioStreams.contains(nullUUID)) { @@ -84,7 +84,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { } else { matchingStream = _audioStreams.value(nullUUID); } - } else if (packetType == PacketTypeInjectAudio) { + } else if (packetType == PacketType::InjectAudio) { // this is injected audio // grab the stream identifier for this injected audio diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index 0cece94094..68f8f718de 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -21,7 +21,7 @@ AvatarAudioStream::AvatarAudioStream(bool isStereo, const InboundAudioStream::Se int AvatarAudioStream::parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { int readBytes = 0; - if (type == PacketTypeSilentAudioFrame) { + if (type == PacketType::SilentAudioFrame) { const char* dataAt = packetAfterSeqNum.constData(); quint16 numSilentSamples = *(reinterpret_cast(dataAt)); readBytes += sizeof(quint16); @@ -31,7 +31,7 @@ int AvatarAudioStream::parseStreamProperties(PacketType::Value type, const QByte readBytes += parsePositionalData(packetAfterSeqNum.mid(readBytes)); } else { - _shouldLoopbackForNode = (type == PacketTypeMicrophoneAudioWithEcho); + _shouldLoopbackForNode = (type == PacketType::MicrophoneAudioWithEcho); // read the channel flag quint8 channelFlag = packetAfterSeqNum.at(readBytes); diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 30ce80e1eb..d64870180e 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -254,7 +254,7 @@ void AvatarMixer::broadcastAvatarData() { } PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); - PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData); + PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType::(PacketType::AvatarData); if (lastSeqToReceiver > lastSeqFromSender) { // Did we somehow get out of order packets from the sender? @@ -283,7 +283,7 @@ void AvatarMixer::broadcastAvatarData() { // set the last sent sequence number for this sender on the receiver nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(), - otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData)); + otherNode->getLastSequenceNumberForPacketType::(PacketType::AvatarData)); // start a new segment in the PacketList for this avatar avatarPacketList.startSegment(); @@ -399,11 +399,11 @@ void AvatarMixer::readPendingDatagrams() { while (readAvailableDatagram(receivedPacket, senderSockAddr)) { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { switch (packetTypeForPacket(receivedPacket)) { - case PacketTypeAvatarData: { + case PacketType::AvatarData: { nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket); break; } - case PacketTypeAvatarIdentity: { + case PacketType::AvatarIdentity: { // check if we have a matching node in our list SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); @@ -420,7 +420,7 @@ void AvatarMixer::readPendingDatagrams() { } break; } - case PacketTypeAvatarBillboard: { + case PacketType::AvatarBillboard: { // check if we have a matching node in our list SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); @@ -438,7 +438,7 @@ void AvatarMixer::readPendingDatagrams() { } break; } - case PacketTypeKillAvatar: { + case PacketType::KillAvatar: { nodeList->processKillNode(receivedPacket); break; } diff --git a/assignment-client/src/entities/EntityNodeData.h b/assignment-client/src/entities/EntityNodeData.h index a31374c4ab..054ceb07d3 100644 --- a/assignment-client/src/entities/EntityNodeData.h +++ b/assignment-client/src/entities/EntityNodeData.h @@ -22,7 +22,7 @@ public: OctreeQueryNode(), _lastDeletedEntitiesSentAt(0) { } - virtual PacketType::Value getMyPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value getMyPacketType() const { return PacketType::EntityData; } quint64 getLastDeletedEntitiesSentAt() const { return _lastDeletedEntitiesSentAt; } void setLastDeletedEntitiesSentAt(quint64 sentAt) { _lastDeletedEntitiesSentAt = sentAt; } diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index cde3958bf3..ba80c91b71 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -28,11 +28,11 @@ public: // Subclasses must implement these methods virtual OctreeQueryNode* createOctreeQueryNode(); virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual PacketType::Value getMyQueryMessageType() const { return PacketTypeEntityQuery; } + virtual PacketType::Value getMyQueryMessageType() const { return PacketType::EntityQuery; } virtual const char* getMyServerName() const { return MODEL_SERVER_NAME; } virtual const char* getMyLoggingServerTargetName() const { return MODEL_SERVER_LOGGING_TARGET_NAME; } virtual const char* getMyDefaultPersistFilename() const { return LOCAL_MODELS_PERSIST_FILE; } - virtual PacketType::Value getMyEditNackType() const { return PacketTypeEntityEditNack; } + virtual PacketType::Value getMyEditNackType() const { return PacketType::EntityEditNack; } virtual QString getMyDomainSettingsKey() const { return QString("entity_server_settings"); } // subclass may implement these method diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index f6d8eaf7c8..332edb2569 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -875,7 +875,7 @@ void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const H nodeData->initializeOctreeSendThread(this, matchingNode); } } - } else if (packetType == PacketTypeOctreeDataNack) { + } else if (packetType == PacketType::OctreeDataNack) { // If we got a nack packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. if (matchingNode) { @@ -884,7 +884,7 @@ void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const H nodeData->parseNackPacket(receivedPacket); } } - } else if (packetType == PacketTypeJurisdictionRequest) { + } else if (packetType == PacketType::JurisdictionRequest) { _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); diff --git a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp index 98b50383c7..94249e7517 100644 --- a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp +++ b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp @@ -44,7 +44,7 @@ void OctreeServerDatagramProcessor::readPendingDatagrams() { senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); PacketType::Value packetType = packetTypeForPacket(incomingPacket); - if (packetType == PacketTypePing) { + if (packetType == PacketType::Ping) { DependencyManager::get()->processNodeData(senderSockAddr, incomingPacket); return; // don't emit } diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 96980a6f48..a967392696 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -706,7 +706,7 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock nodeData->setSendingSockAddr(senderSockAddr); - // reply back to the user with a PacketTypeDomainList + // reply back to the user with a PacketType::DomainList sendDomainListToNode(newNode, senderSockAddr, nodeInterestList.toSet()); // send out this node to our other connected nodes @@ -1002,7 +1002,7 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) { auto limitedNodeList = DependencyManager::get(); // setup the add packet for this new node - QByteArray addNodePacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketTypeDomainServerAddedNode); + QByteArray addNodePacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketType::DomainServerAddedNode); QDataStream addNodeStream(&addNodePacket, QIODevice::Append); addNodeStream << *addedNode.data(); @@ -1037,14 +1037,14 @@ void DomainServer::readAvailableDatagrams() { HifiSockAddr senderSockAddr; QByteArray receivedPacket; - static QByteArray assignmentPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketTypeCreateAssignment); + static QByteArray assignmentPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketType::CreateAssignment); static int numAssignmentPacketHeaderBytes = assignmentPacket.size(); while (limitedNodeList->getNodeSocket().hasPendingDatagrams()) { receivedPacket.resize(limitedNodeList->getNodeSocket().pendingDatagramSize()); limitedNodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - if (packetTypeForPacket(receivedPacket) == PacketTypeRequestAssignment + if (packetTypeForPacket(receivedPacket) == PacketType::RequestAssignment && limitedNodeList->packetVersionAndHashMatch(receivedPacket)) { // construct the requested assignment from the packet data @@ -1108,8 +1108,8 @@ void DomainServer::readAvailableDatagrams() { processDatagram(receivedPacket, senderSockAddr); } else { // we're using DTLS, so tell the sender to get back to us using DTLS - static QByteArray dtlsRequiredPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketTypeDomainServerRequireDTLS); - static int numBytesDTLSHeader = numBytesForPacketHeaderGivenPacketType(PacketTypeDomainServerRequireDTLS); + static QByteArray dtlsRequiredPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketType::DomainServerRequireDTLS); + static int numBytesDTLSHeader = numBytesForPacketHeaderGivenPacketType::(PacketTypeDomainServerRequireDTLS); if (dtlsRequiredPacket.size() == numBytesDTLSHeader) { // pack the port that we accept DTLS traffic on @@ -1390,10 +1390,10 @@ void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiS if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType::Value requestType = packetTypeForPacket(receivedPacket); switch (requestType) { - case PacketTypeDomainConnectRequest: + case PacketType::DomainConnectRequest: handleConnectRequest(receivedPacket, senderSockAddr); break; - case PacketTypeDomainListRequest: { + case PacketType::DomainListRequest: { QUuid nodeUUID = uuidFromPacketHeader(receivedPacket); if (!nodeUUID.isNull() && nodeList->nodeWithUUID(nodeUUID)) { @@ -1422,12 +1422,12 @@ void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiS break; } - case PacketTypeDomainServerPathQuery: { + case PacketType::DomainServerPathQuery: { // have our private method attempt to respond to this path query respondToPathQuery(receivedPacket, senderSockAddr); break; } - case PacketTypeNodeJsonStats: { + case PacketType::NodeJsonStats: { SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); if (matchingNode) { reinterpret_cast(matchingNode->getLinkedData())->parseJSONStatsPacket(receivedPacket); @@ -1435,16 +1435,16 @@ void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiS break; } - case PacketTypeStunResponse: + case PacketType::StunResponse: nodeList->processSTUNResponse(receivedPacket); break; - case PacketTypeUnverifiedPing: { + case PacketType::UnverifiedPing: { QByteArray pingReplyPacket = nodeList->constructPingReplyPacket(receivedPacket); nodeList->writeUnverifiedDatagram(pingReplyPacket, senderSockAddr); break; } - case PacketTypeUnverifiedPingReply: { + case PacketType::UnverifiedPingReply: { processICEPingReply(receivedPacket, senderSockAddr); break; } @@ -2225,7 +2225,7 @@ void DomainServer::respondToPathQuery(const QByteArray& receivedPacket, const Hi // this is a query for the viewpoint resulting from a path // first pull the query path from the packet - int numHeaderBytes = numBytesForPacketHeaderGivenPacketType(PacketTypeDomainServerPathQuery); + int numHeaderBytes = numBytesForPacketHeaderGivenPacketType::(PacketTypeDomainServerPathQuery); const char* packetDataStart = receivedPacket.data() + numHeaderBytes; // figure out how many bytes the sender said this path is @@ -2257,7 +2257,7 @@ void DomainServer::respondToPathQuery(const QByteArray& receivedPacket, const Hi QByteArray viewpointUTF8 = responseViewpoint.toUtf8(); // prepare a packet for the response - QByteArray pathResponsePacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeDomainServerPathResponse); + QByteArray pathResponsePacket = nodeList->byteArrayWithPopulatedHeader(PacketType::DomainServerPathResponse); // check the number of bytes the viewpoint is quint16 numViewpointBytes = responseViewpoint.toUtf8().size(); diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 80519690b6..bc76d818c3 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -56,12 +56,12 @@ void IceServer::processDatagrams() { PacketType::Value packetType = packetTypeForPacket(incomingPacket); - if (packetType == PacketTypeIceServerHeartbeat) { + if (packetType == PacketType::IceServerHeartbeat) { SharedNetworkPeer peer = addOrUpdateHeartbeatingPeer(incomingPacket); // so that we can send packets to the heartbeating peer when we need, we need to activate a socket now peer->activateMatchingOrNewSymmetricSocket(sendingSockAddr); - } else if (packetType == PacketTypeIceServerQuery) { + } else if (packetType == PacketType::IceServerQuery) { QDataStream heartbeatStream(incomingPacket); // this is a node hoping to connect to a heartbeating peer - do we have the heartbeating peer? diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d91575c950..dfa082719a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2627,7 +2627,7 @@ void Application::update(float deltaTime) { _lastQueriedTime = now; if (DependencyManager::get()->shouldRenderEntities()) { - queryOctree(NodeType::EntityServer, PacketTypeEntityQuery, _entityServerJurisdictions); + queryOctree(NodeType::EntityServer, PacketType::EntityQuery, _entityServerJurisdictions); } _lastQueriedViewFrustum = _viewFrustum; } diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 2808601316..14e286c80e 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -55,15 +55,15 @@ void DatagramProcessor::processDatagrams() { PacketType::Value incomingType = packetTypeForPacket(incomingPacket); // only process this packet if we have a match on the packet version switch (incomingType) { - case PacketTypeAudioEnvironment: - case PacketTypeAudioStreamStats: - case PacketTypeMixedAudio: - case PacketTypeSilentAudioFrame: { - if (incomingType == PacketTypeAudioStreamStats) { + case PacketType::AudioEnvironment: + case PacketType::AudioStreamStats: + case PacketType::MixedAudio: + case PacketType::SilentAudioFrame: { + if (incomingType == PacketType::AudioStreamStats) { QMetaObject::invokeMethod(DependencyManager::get().data(), "parseAudioStreamStatsPacket", Qt::QueuedConnection, Q_ARG(QByteArray, incomingPacket)); - } else if (incomingType == PacketTypeAudioEnvironment) { + } else if (incomingType == PacketType::AudioEnvironment) { QMetaObject::invokeMethod(DependencyManager::get().data(), "parseAudioEnvironmentData", Qt::QueuedConnection, Q_ARG(QByteArray, incomingPacket)); @@ -82,10 +82,10 @@ void DatagramProcessor::processDatagrams() { break; } - case PacketTypeEntityData: - case PacketTypeEntityErase: - case PacketTypeOctreeStats: - case PacketTypeEnvironmentData: { + case PacketType::EntityData: + case PacketType::EntityErase: + case PacketType::OctreeStats: + case PacketType::EnvironmentData: { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::networkReceive()... _octreeProcessor.queueReceivedPacket()"); SharedNodePointer matchedNode = DependencyManager::get()->sendingNodeForPacket(incomingPacket); @@ -96,10 +96,10 @@ void DatagramProcessor::processDatagrams() { } break; } - case PacketTypeBulkAvatarData: - case PacketTypeKillAvatar: - case PacketTypeAvatarIdentity: - case PacketTypeAvatarBillboard: { + case PacketType::BulkAvatarData: + case PacketType::KillAvatar: + case PacketType::AvatarIdentity: + case PacketType::AvatarBillboard: { // update having heard from the avatar-mixer and record the bytes received SharedNodePointer avatarMixer = nodeList->sendingNodeForPacket(incomingPacket); @@ -112,8 +112,8 @@ void DatagramProcessor::processDatagrams() { } break; } - case PacketTypeDomainConnectionDenied: { - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeDomainConnectionDenied); + case PacketType::DomainConnectionDenied: { + int headerSize = numBytesForPacketHeaderGivenPacketType::(PacketTypeDomainConnectionDenied); QDataStream packetStream(QByteArray(incomingPacket.constData() + headerSize, incomingPacket.size() - headerSize)); QString reason; @@ -127,15 +127,15 @@ void DatagramProcessor::processDatagrams() { AccountManager::getInstance().checkAndSignalForAccessToken(); break; } - case PacketTypeNoisyMute: - case PacketTypeMuteEnvironment: { + case PacketType::NoisyMute: + case PacketType::MuteEnvironment: { bool mute = !DependencyManager::get()->isMuted(); - if (incomingType == PacketTypeMuteEnvironment) { + if (incomingType == PacketType::MuteEnvironment) { glm::vec3 position; float radius; - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); + int headerSize = numBytesForPacketHeaderGivenPacketType::(PacketTypeMuteEnvironment); memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), @@ -146,7 +146,7 @@ void DatagramProcessor::processDatagrams() { if (mute) { DependencyManager::get()->toggleMute(); - if (incomingType == PacketTypeMuteEnvironment) { + if (incomingType == PacketType::MuteEnvironment) { AudioScriptingInterface::getInstance().environmentMuted(); } else { AudioScriptingInterface::getInstance().mutedByMixer(); @@ -154,7 +154,7 @@ void DatagramProcessor::processDatagrams() { } break; } - case PacketTypeEntityEditNack: + case PacketType::EntityEditNack: if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { application->_entityEditSender.processNackPacket(incomingPacket); } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 594a8c198e..e6eba84c23 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -866,7 +866,7 @@ int MyAvatar::parseDataAtOffset(const QByteArray& packet, int offset) { void MyAvatar::sendKillAvatar() { auto nodeList = DependencyManager::get(); - QByteArray killPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeKillAvatar); + QByteArray killPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::KillAvatar); nodeList->broadcastToNodes(killPacket, NodeSet() << NodeType::AvatarMixer); } diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 498123db00..c5b4d2a4a7 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -38,7 +38,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, // note: PacketType_OCTREE_STATS can have PacketType_VOXEL_DATA // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first // then process any remaining bytes as if it was another packet - if (voxelPacketType == PacketTypeOctreeStats) { + if (voxelPacketType == PacketType::OctreeStats) { int statsMessageLength = app->parseOctreeStats(mutablePacket, sendingNode); wasStatsPacket = true; if (messageLength > statsMessageLength) { @@ -81,19 +81,19 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, if (sendingNode) { switch(voxelPacketType) { - case PacketTypeEntityErase: { + case PacketType::EntityErase: { if (DependencyManager::get()->shouldRenderEntities()) { app->_entities.processEraseMessage(mutablePacket, sendingNode); } } break; - case PacketTypeEntityData: { + case PacketType::EntityData: { if (DependencyManager::get()->shouldRenderEntities()) { app->_entities.processDatagram(mutablePacket, sendingNode); } } break; - case PacketTypeEnvironmentData: { + case PacketType::EnvironmentData: { app->_environment.parseData(*sendingNode->getActiveSocket(), mutablePacket); } break; diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index c885a67674..928662d2e8 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -132,7 +132,7 @@ int InboundAudioStream::parseData(const QByteArray& packet) { } case SequenceNumberStats::OnTime: { // Packet is on time; parse its data to the ringbuffer - if (packetType == PacketTypeSilentAudioFrame) { + if (packetType == PacketType::SilentAudioFrame) { writeDroppableSilentSamples(networkSamples); } else { readBytes += parseAudioData(packetType, packet.mid(readBytes), networkSamples); @@ -169,7 +169,7 @@ int InboundAudioStream::parseData(const QByteArray& packet) { } int InboundAudioStream::parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { - if (type == PacketTypeSilentAudioFrame) { + if (type == PacketType::SilentAudioFrame) { quint16 numSilentSamples = 0; memcpy(&numSilentSamples, packetAfterSeqNum.constData(), sizeof(quint16)); numAudioSamples = numSilentSamples; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 9a6400ae16..efc8e5c157 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1078,7 +1078,7 @@ void AvatarData::setJointMappingsFromNetworkReply() { void AvatarData::sendAvatarDataPacket() { auto nodeList = DependencyManager::get(); - QByteArray dataPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarData); + QByteArray dataPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarData); dataPacket.append(toByteArray()); nodeList->broadcastToNodes(dataPacket, NodeSet() << NodeType::AvatarMixer); @@ -1087,7 +1087,7 @@ void AvatarData::sendAvatarDataPacket() { void AvatarData::sendIdentityPacket() { auto nodeList = DependencyManager::get(); - QByteArray identityPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity); + QByteArray identityPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarIdentity); identityPacket.append(identityByteArray()); nodeList->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer); @@ -1097,7 +1097,7 @@ void AvatarData::sendBillboardPacket() { if (!_billboard.isEmpty()) { auto nodeList = DependencyManager::get(); - QByteArray billboardPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarBillboard); + QByteArray billboardPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarBillboard); billboardPacket.append(_billboard); nodeList->broadcastToNodes(billboardPacket, NodeSet() << NodeType::AvatarMixer); diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 6d0d9d8d76..60eb5c4499 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -22,16 +22,16 @@ AvatarHashMap::AvatarHashMap() { void AvatarHashMap::processAvatarMixerDatagram(const QByteArray& datagram, const QWeakPointer& mixerWeakPointer) { switch (packetTypeForPacket(datagram)) { - case PacketTypeBulkAvatarData: + case PacketType::BulkAvatarData: processAvatarDataPacket(datagram, mixerWeakPointer); break; - case PacketTypeAvatarIdentity: + case PacketType::AvatarIdentity: processAvatarIdentityPacket(datagram, mixerWeakPointer); break; - case PacketTypeAvatarBillboard: + case PacketType::AvatarBillboard: processAvatarBillboardPacket(datagram, mixerWeakPointer); break; - case PacketTypeKillAvatar: + case PacketType::KillAvatar: processKillAvatar(datagram); break; default: diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index edbb2d250f..54cd5d80e2 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -43,8 +43,8 @@ public: virtual ~EntityTreeRenderer(); virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual PacketType::Value getMyQueryMessageType() const { return PacketTypeEntityQuery; } - virtual PacketType::Value getExpectedPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value getMyQueryMessageType() const { return PacketType::EntityQuery; } + virtual PacketType::Value getExpectedPacketType() const { return PacketType::EntityData; } virtual void renderElement(OctreeElement* element, RenderArgs* args); virtual float getSizeScale() const; virtual int getBoundaryLevelAdjust() const; diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index e5225b5ebb..f228467316 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -21,7 +21,7 @@ void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew) { - if (type == PacketTypeEntityAdd || type == PacketTypeEntityEdit) { + if (type == PacketType::EntityAdd || type == PacketType::EntityEdit) { EntityItem::adjustEditPacketForClockSkew(editBuffer, length, clockSkew); } } @@ -54,6 +54,6 @@ void EntityEditPacketSender::queueEraseEntityMessage(const EntityItemID& entityI unsigned char bufferOut[MAX_PACKET_SIZE]; size_t sizeOut = 0; if (EntityItemProperties::encodeEraseEntityMessage(entityItemID, &bufferOut[0], _maxPacketSize, sizeOut)) { - queueOctreeEditMessage(PacketTypeEntityErase, bufferOut, sizeOut); + queueOctreeEditMessage(PacketType::EntityErase, bufferOut, sizeOut); } } diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 31f1f2cfc0..02e129c251 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -93,7 +93,7 @@ QUuid EntityScriptingInterface::addEntity(const EntityItemProperties& properties // queue the packet if (success) { - queueEntityMessage(PacketTypeEntityAdd, id, propertiesWithSimID); + queueEntityMessage(PacketType::EntityAdd, id, propertiesWithSimID); } return id; @@ -175,13 +175,13 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, EntityItemProperties proper entity->setLastBroadcast(usecTimestampNow()); } _entityTree->unlock(); - queueEntityMessage(PacketTypeEntityEdit, entityID, properties); + queueEntityMessage(PacketType::EntityEdit, entityID, properties); return id; } return QUuid(); } - queueEntityMessage(PacketTypeEntityEdit, entityID, properties); + queueEntityMessage(PacketType::EntityEdit, entityID, properties); return id; } @@ -446,7 +446,7 @@ bool EntityScriptingInterface::setVoxels(QUuid entityID, properties.setVoxelDataDirty(); properties.setLastEdited(now); - queueEntityMessage(PacketTypeEntityEdit, entityID, properties); + queueEntityMessage(PacketType::EntityEdit, entityID, properties); return true; } @@ -483,7 +483,7 @@ bool EntityScriptingInterface::setPoints(QUuid entityID, std::functionmarkAsChangedOnServer(); endUpdate = usecTimestampNow(); _totalUpdates++; - } else if (packetType == PacketTypeEntityAdd) { + } else if (packetType == PacketType::EntityAdd) { if (senderNode->getCanRez()) { // this is a new entity... assign a new entityID properties.setCreated(properties.getLastEdited()); @@ -766,7 +766,7 @@ bool EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumbe unsigned char* copyAt = outputBuffer; size_t numBytesPacketHeader = DependencyManager::get()->populatePacketHeader(reinterpret_cast(outputBuffer), - PacketTypeEntityErase); + PacketType::EntityErase); copyAt += numBytesPacketHeader; outputLength = numBytesPacketHeader; @@ -1072,7 +1072,7 @@ bool EntityTree::sendEntitiesOperation(OctreeElement* element, void* extraData) properties.markAllChanged(); // so the entire property set is considered new, since we're making a new entity // queue the packet to send to the server - args->packetSender->queueEditEntityMessage(PacketTypeEntityAdd, newID, properties); + args->packetSender->queueEditEntityMessage(PacketType::EntityAdd, newID, properties); // also update the local tree instantly (note: this is not our tree, but an alternate tree) if (args->localTree) { diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 5c65b94868..7ca0244f8f 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -62,10 +62,10 @@ public: // These methods will allow the OctreeServer to send your tree inbound edit packets of your // own definition. Implement these to allow your octree based server to support editing virtual bool getWantSVOfileVersions() const { return true; } - virtual PacketType::Value expectedDataPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value expectedDataPacketType() const { return PacketType::EntityData; } virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion >= VERSION_ENTITIES_USE_METERS_AND_RADIANS; } - virtual bool handlesEditPacketType(PacketType::Value packetType) const; + virtual bool handlesEditPacketType::(PacketType::Value packetType) const; virtual int processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode); diff --git a/libraries/entities/src/EntityTreeHeadlessViewer.h b/libraries/entities/src/EntityTreeHeadlessViewer.h index 7f4dda3ee1..fedbc74430 100644 --- a/libraries/entities/src/EntityTreeHeadlessViewer.h +++ b/libraries/entities/src/EntityTreeHeadlessViewer.h @@ -31,8 +31,8 @@ public: virtual ~EntityTreeHeadlessViewer(); virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual PacketType::Value getMyQueryMessageType() const { return PacketTypeEntityQuery; } - virtual PacketType::Value getExpectedPacketType() const { return PacketTypeEntityData; } + virtual PacketType::Value getMyQueryMessageType() const { return PacketType::EntityQuery; } + virtual PacketType::Value getExpectedPacketType() const { return PacketType::EntityData; } void update(); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index db7275eb49..aef732e5e1 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -353,7 +353,7 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSock PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType) { // Thanks to std::map and std::unordered_map this line either default constructs the - // PacketTypeSequenceMap and the PacketSequenceNumber or returns the existing value. + // PacketType::SequenceMap and the PacketSequenceNumber or returns the existing value. // We use the postfix increment so that the stored value is incremented and the next // return gives the correct value. diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 6aafbd65f8..4c92ce07e7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -413,7 +413,7 @@ void NodeList::sendDSPathQuery(const QString& newPath) { // send off the path query sendPacket(std::move(pathQueryPacket), _domainHandler.getSockAddr()); } else { - qCDebug(networking) << "Path" << newPath << "would make PacketTypeDomainServerPathQuery packet > MAX_PACKET_SIZE." << + qCDebug(networking) << "Path" << newPath << "would make PacketType::DomainServerPathQuery packet > MAX_PACKET_SIZE." << "Will not send query."; } } diff --git a/libraries/octree/src/EditPacketBuffer.cpp b/libraries/octree/src/EditPacketBuffer.cpp index 966a315a41..5e2f74549c 100644 --- a/libraries/octree/src/EditPacketBuffer.cpp +++ b/libraries/octree/src/EditPacketBuffer.cpp @@ -13,7 +13,7 @@ EditPacketBuffer::EditPacketBuffer() : _nodeUUID(), - _currentType(PacketTypeUnknown), + _currentType(PacketType::Unknown), _currentSize(0), _satoshiCost(0) { diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index a86130b005..029cffc101 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -57,7 +57,7 @@ bool JurisdictionListener::queueJurisdictionRequest() { } void JurisdictionListener::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { - if (packetTypeForPacket(packet) == PacketTypeJurisdiction && sendingNode) { + if (packetTypeForPacket(packet) == PacketType::Jurisdiction && sendingNode) { QUuid nodeUUID = sendingNode->getUUID(); JurisdictionMap map; map.unpackFromMessage(reinterpret_cast(packet.data()), packet.size()); diff --git a/libraries/octree/src/JurisdictionListener.h b/libraries/octree/src/JurisdictionListener.h index 7fb4fb33c7..72e4b5faf7 100644 --- a/libraries/octree/src/JurisdictionListener.h +++ b/libraries/octree/src/JurisdictionListener.h @@ -20,8 +20,8 @@ #include "JurisdictionMap.h" -/// Sends out PacketType_JURISDICTION_REQUEST packets to all voxel servers and then listens for and processes -/// the PacketType_JURISDICTION packets it receives in order to maintain an accurate state of all jurisidictions +/// Sends out PacketType::_JURISDICTION_REQUEST packets to all voxel servers and then listens for and processes +/// the PacketType::_JURISDICTION packets it receives in order to maintain an accurate state of all jurisidictions /// within the domain. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets /// and adding them to the processing queue by calling queueReceivedPacket() class JurisdictionListener : public ReceivedPacketProcessor { @@ -45,7 +45,7 @@ public slots: void nodeKilled(SharedNodePointer node); protected: - /// Callback for processing of received packets. Will process any queued PacketType_JURISDICTION and update the + /// Callback for processing of received packets. Will process any queued PacketType::_JURISDICTION and update the /// jurisdiction map member variable virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 46e758cb42..39129037a2 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -272,7 +272,7 @@ int JurisdictionMap::packEmptyJurisdictionIntoMessage(NodeType_t type, unsigned unsigned char* bufferStart = destinationBuffer; int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), - PacketTypeJurisdiction); + PacketType::Jurisdiction); destinationBuffer += headerLength; // Pack the Node Type in first byte @@ -291,7 +291,7 @@ int JurisdictionMap::packIntoMessage(unsigned char* destinationBuffer, int avail unsigned char* bufferStart = destinationBuffer; int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), - PacketTypeJurisdiction); + PacketType::Jurisdiction); destinationBuffer += headerLength; // Pack the Node Type in first byte diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index f85cf406b9..029108e6af 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -30,7 +30,7 @@ JurisdictionSender::~JurisdictionSender() { void JurisdictionSender::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { - if (packetTypeForPacket(packet) == PacketTypeJurisdictionRequest) { + if (packetTypeForPacket(packet) == PacketType::JurisdictionRequest) { if (sendingNode) { lockRequestingNodes(); _nodesRequestingJurisdictions.push(sendingNode->getUUID()); diff --git a/libraries/octree/src/JurisdictionSender.h b/libraries/octree/src/JurisdictionSender.h index a7d23d85c7..bc40f92a2c 100644 --- a/libraries/octree/src/JurisdictionSender.h +++ b/libraries/octree/src/JurisdictionSender.h @@ -19,7 +19,7 @@ #include #include "JurisdictionMap.h" -/// Will process PacketType_JURISDICTION_REQUEST packets and send out PacketType_JURISDICTION packets +/// Will process PacketType::_JURISDICTION_REQUEST packets and send out PacketType::_JURISDICTION packets /// to requesting parties. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets /// and adding them to the processing queue by calling queueReceivedPacket() class JurisdictionSender : public ReceivedPacketProcessor { diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index a48540f082..6a884ec062 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1916,7 +1916,7 @@ bool Octree::readFromStream(unsigned long streamLength, QDataStream& inputStream device->getChar(&firstChar); device->ungetChar(firstChar); - if (firstChar == (char) PacketTypeEntityData) { + if (firstChar == (char) PacketType::EntityData) { qCDebug(octree) << "Reading from SVO Stream length:" << streamLength; return readSVOFromStream(streamLength, inputStream); } else { diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index ddded47171..c432b5d33e 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -226,7 +226,7 @@ public: // These methods will allow the OctreeServer to send your tree inbound edit packets of your // own definition. Implement these to allow your octree based server to support editing virtual bool getWantSVOfileVersions() const { return false; } - virtual PacketType::Value expectedDataPacketType() const { return PacketTypeUnknown; } + virtual PacketType::Value expectedDataPacketType() const { return PacketType::Unknown; } virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion == versionForPacketType(expectedDataPacketType()); } virtual PacketVersion expectedVersion() const { return versionForPacketType(expectedDataPacketType()); } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 52c68c3e96..260f49e4b8 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -252,7 +252,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi QUuid nodeUUID = node->getUUID(); bool isMyJurisdiction = true; - if (type == PacketTypeEntityErase) { + if (type == PacketType::EntityErase) { isMyJurisdiction = true; // send erase messages to all servers } else if (_serverJurisdictions) { // we need to get the jurisdiction for this @@ -318,11 +318,11 @@ void OctreeEditPacketSender::releaseQueuedMessages() { void OctreeEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer) { _releaseQueuedPacketMutex.lock(); - if (packetBuffer._currentSize > 0 && packetBuffer._currentType != PacketTypeUnknown) { + if (packetBuffer._currentSize > 0 && packetBuffer._currentType != PacketType::Unknown) { queuePacketToNode(packetBuffer._nodeUUID, &packetBuffer._currentBuffer[0], packetBuffer._currentSize, packetBuffer._satoshiCost); packetBuffer._currentSize = 0; - packetBuffer._currentType = PacketTypeUnknown; + packetBuffer._currentType = PacketType::Unknown; } _releaseQueuedPacketMutex.unlock(); } diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index a975d21c4d..4652005730 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -481,7 +481,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, const Q qCDebug(physics) << "EntityMotionState::sendUpdate()... calling queueEditEntityMessage()..."; #endif - entityPacketSender->queueEditEntityMessage(PacketTypeEntityEdit, id, properties); + entityPacketSender->queueEditEntityMessage(PacketType::EntityEdit, id, properties); _entity->setLastBroadcast(usecTimestampNow()); } else { #ifdef WANT_DEBUG diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 55cf9e9890..61f0ed8d37 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -587,7 +587,7 @@ void ScriptEngine::run() { / (1000 * 1000)) + 0.5); const int SCRIPT_AUDIO_BUFFER_BYTES = SCRIPT_AUDIO_BUFFER_SAMPLES * sizeof(int16_t); - QByteArray avatarPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarData); + QByteArray avatarPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarData); avatarPacket.append(_avatarData->toByteArray()); nodeList->broadcastToNodes(avatarPacket, NodeSet() << NodeType::AvatarMixer); @@ -629,8 +629,8 @@ void ScriptEngine::run() { } QByteArray audioPacket = nodeList->byteArrayWithPopulatedHeader(silentFrame - ? PacketTypeSilentAudioFrame - : PacketTypeMicrophoneAudioNoEcho); + ? PacketType::SilentAudioFrame + : PacketType::MicrophoneAudioNoEcho); QDataStream packetStream(&audioPacket, QIODevice::Append); From b1c09d71f740a8210cb12a38c5c1deb5efa1f3b7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 10:02:34 -0700 Subject: [PATCH 135/582] Add packet listeners to DatagramProcessor --- interface/src/DatagramProcessor.cpp | 26 ++++++++++++++++++++++++-- interface/src/DatagramProcessor.h | 4 ++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 14e286c80e..354b7c72f1 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -23,11 +23,20 @@ #include "DatagramProcessor.h" DatagramProcessor::DatagramProcessor(QObject* parent) : - QObject(parent) + QObject(parent), + _packetListenerMap() { } +void DatagramProcessor::registerPacketListener(Packet::Type type, QObject* object, QString methodName) { + if (packetListenerMap.contains(type)) { + qDebug() << "Warning: Registering a packet listener for packet type " << type + << " that will remove a previously registered listener"; + } + packetListenerMap[type] = QPair(object, methodName); +} + void DatagramProcessor::processDatagrams() { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "DatagramProcessor::processDatagrams()"); @@ -160,7 +169,20 @@ void DatagramProcessor::processDatagrams() { } break; default: - nodeList->processNodeData(senderSockAddr, incomingPacket); + //nodeList->processNodeData(senderSockAddr, incomingPacket); + if (packetListenerMap.contains(incomingType)) { + auto& listener = packetListenerMap[incomingType]; + NLPacket packet; + bool success = QMetaObject::invokeMethod(listener.first, listener.second, + Q_ARG(std::unique_ptr, packet), + Q_ARG(HifiSockAddr, senderSockAddr)); + if (!success) { + qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first.name() << "::" << listener.second; + } + } else { + QDebug() << "No listener found for packet type: " << incomingType; + } + break; } } diff --git a/interface/src/DatagramProcessor.h b/interface/src/DatagramProcessor.h index 7fc192ee2d..b24752d0cf 100644 --- a/interface/src/DatagramProcessor.h +++ b/interface/src/DatagramProcessor.h @@ -27,10 +27,14 @@ public: void resetCounters() { _inPacketCount = 0; _outPacketCount = 0; _inByteCount = 0; _outByteCount = 0; } void shutdown() { _isShuttingDown = true; } + + void registerPacketListener(Packet::Type type, QObject* object, QString methodName); + public slots: void processDatagrams(); private: + QMap> packetListenerMap; int _inPacketCount = 0; int _outPacketCount = 0; int _inByteCount = 0; From e89dbe8541fc29e05af0112ff2212a4e26e776ff Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 10:02:56 -0700 Subject: [PATCH 136/582] Update PacketType in DatagramProcessor --- interface/src/DatagramProcessor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 354b7c72f1..6730a1716e 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -122,7 +122,7 @@ void DatagramProcessor::processDatagrams() { break; } case PacketType::DomainConnectionDenied: { - int headerSize = numBytesForPacketHeaderGivenPacketType::(PacketTypeDomainConnectionDenied); + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::DomainConnectionDenied); QDataStream packetStream(QByteArray(incomingPacket.constData() + headerSize, incomingPacket.size() - headerSize)); QString reason; @@ -144,7 +144,7 @@ void DatagramProcessor::processDatagrams() { glm::vec3 position; float radius; - int headerSize = numBytesForPacketHeaderGivenPacketType::(PacketTypeMuteEnvironment); + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::MuteEnvironment); memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), From 9d25612ff8ce4303940071d3816258b20ffa530e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 10:04:56 -0700 Subject: [PATCH 137/582] Move DatagramProcessor to PacketProcessor --- .../networking/src/PacketProcessor.cpp | 3 ++- .../networking/src/PacketProcessor.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) rename interface/src/DatagramProcessor.cpp => libraries/networking/src/PacketProcessor.cpp (99%) rename interface/src/DatagramProcessor.h => libraries/networking/src/PacketProcessor.h (95%) diff --git a/interface/src/DatagramProcessor.cpp b/libraries/networking/src/PacketProcessor.cpp similarity index 99% rename from interface/src/DatagramProcessor.cpp rename to libraries/networking/src/PacketProcessor.cpp index 6730a1716e..7e0cfdd668 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/libraries/networking/src/PacketProcessor.cpp @@ -1,8 +1,9 @@ // -// DatagramProcessor.cpp +// PacketProcessor.cpp // interface/src // // Created by Stephen Birarda on 1/23/2014. +// Update by Ryan Huffman on 7/8/2015. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/interface/src/DatagramProcessor.h b/libraries/networking/src/PacketProcessor.h similarity index 95% rename from interface/src/DatagramProcessor.h rename to libraries/networking/src/PacketProcessor.h index b24752d0cf..b400c7b09c 100644 --- a/interface/src/DatagramProcessor.h +++ b/libraries/networking/src/PacketProcessor.h @@ -1,8 +1,9 @@ // -// DatagramProcessor.h +// PacketProcessor.h // interface/src // // Created by Stephen Birarda on 1/23/2014. +// Update by Ryan Huffman on 7/8/2015. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. From 818521864bc8e33efcc8a8f2ee7955ed6711a6c8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:27:32 -0700 Subject: [PATCH 138/582] fix missed bad PacketType replacement --- interface/src/DatagramProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 14e286c80e..0205d0be62 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -113,7 +113,7 @@ void DatagramProcessor::processDatagrams() { break; } case PacketType::DomainConnectionDenied: { - int headerSize = numBytesForPacketHeaderGivenPacketType::(PacketTypeDomainConnectionDenied); + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeDomainConnectionDenied); QDataStream packetStream(QByteArray(incomingPacket.constData() + headerSize, incomingPacket.size() - headerSize)); QString reason; From 7713219718924dc1a31f2fc16650c27d15ef0a89 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 10:40:35 -0700 Subject: [PATCH 139/582] Compile fixes --- libraries/audio/src/AudioInjector.cpp | 2 +- libraries/networking/src/NodeList.cpp | 2 +- libraries/octree/src/JurisdictionListener.cpp | 2 +- libraries/octree/src/JurisdictionMap.cpp | 6 +++--- libraries/octree/src/OctreeSceneStats.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 7dfaa1fdb5..446c59660b 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -156,7 +156,7 @@ void AudioInjector::injectToMixer() { auto audioPacket = NLPacket::create(PacketType::InjectAudio); // setup the packet for injected audio - QDataStream audioPacketStream(&audioPacket); + QDataStream audioPacketStream(audioPacket.get()); // pack some placeholder sequence number for now audioPacketStream << (quint16) 0; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 4c92ce07e7..0d81fb89a3 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -618,7 +618,7 @@ void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { if (!node->getSymmetricSocket().isNull()) { auto symmetricPingPacket = constructPingPacket(PingType::Symmetric); - sendPacket(symmetricPingPacket, node, node->getSymmetricSocket()); + sendPacket(std::move(symmetricPingPacket), node, node->getSymmetricSocket()); } node->incrementConnectionAttempts(); diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index 029cffc101..d725ce3555 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -41,7 +41,7 @@ bool JurisdictionListener::queueJurisdictionRequest() { nodeList->eachNode([&](const SharedNodePointer& node) { if (node->getType() == getNodeType() && node->getActiveSocket()) { - _packetSender.queuePacketForSending(node, packet); + _packetSender.queuePacketForSending(node, std::move(packet)); nodeCount++; } }); diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 39129037a2..c9b491fe6b 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -271,8 +271,8 @@ bool JurisdictionMap::writeToFile(const char* filename) { int JurisdictionMap::packEmptyJurisdictionIntoMessage(NodeType_t type, unsigned char* destinationBuffer, int availableBytes) { unsigned char* bufferStart = destinationBuffer; - int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), - PacketType::Jurisdiction); + int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), + PacketType::Jurisdiction); destinationBuffer += headerLength; // Pack the Node Type in first byte @@ -290,7 +290,7 @@ int JurisdictionMap::packEmptyJurisdictionIntoMessage(NodeType_t type, unsigned int JurisdictionMap::packIntoMessage(unsigned char* destinationBuffer, int availableBytes) { unsigned char* bufferStart = destinationBuffer; - int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), + int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), PacketType::Jurisdiction); destinationBuffer += headerLength; diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index 901a9f1544..280f0e2a35 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -176,7 +176,7 @@ private: bool _isReadyToSend; - std::unique_ptr _statsPacket { NLPacket::create(PacketType::OctreeStats); } + std::unique_ptr _statsPacket = NLPacket::create(PacketType::OctreeStats); // scene timing data in usecs bool _isStarted; From 04b3ca3efddc80b15215895b6807bd9cdb75ea30 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:43:05 -0700 Subject: [PATCH 140/582] fix a bad replacement in AvatarMixer --- assignment-client/src/avatars/AvatarMixer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index d64870180e..c2b93bc48b 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -254,7 +254,7 @@ void AvatarMixer::broadcastAvatarData() { } PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); - PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType::(PacketType::AvatarData); + PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData); if (lastSeqToReceiver > lastSeqFromSender) { // Did we somehow get out of order packets from the sender? @@ -283,7 +283,7 @@ void AvatarMixer::broadcastAvatarData() { // set the last sent sequence number for this sender on the receiver nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(), - otherNode->getLastSequenceNumberForPacketType::(PacketType::AvatarData)); + otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData)); // start a new segment in the PacketList for this avatar avatarPacketList.startSegment(); From 122fd6145121d1395f6de1e2cb5f66e0b0090000 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:44:40 -0700 Subject: [PATCH 141/582] fix a bad replacement in DatagramProcessor --- interface/src/DatagramProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 0205d0be62..cb95e1d104 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -135,7 +135,7 @@ void DatagramProcessor::processDatagrams() { glm::vec3 position; float radius; - int headerSize = numBytesForPacketHeaderGivenPacketType::(PacketTypeMuteEnvironment); + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), From 78bc0979ccf445136b3fdb573f68c0bcb391342c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:47:54 -0700 Subject: [PATCH 142/582] move the symmetric ping packet --- libraries/networking/src/NodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 4c92ce07e7..0d81fb89a3 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -618,7 +618,7 @@ void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { if (!node->getSymmetricSocket().isNull()) { auto symmetricPingPacket = constructPingPacket(PingType::Symmetric); - sendPacket(symmetricPingPacket, node, node->getSymmetricSocket()); + sendPacket(std::move(symmetricPingPacket), node, node->getSymmetricSocket()); } node->incrementConnectionAttempts(); From 92462db4e1ea5b7e9258500d86158cd73e2c45df Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 10:49:00 -0700 Subject: [PATCH 143/582] Rename DatagramProcessor and add packet listener mutex --- libraries/networking/src/PacketProcessor.cpp | 17 ++++++++++++----- libraries/networking/src/PacketProcessor.h | 11 ++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libraries/networking/src/PacketProcessor.cpp b/libraries/networking/src/PacketProcessor.cpp index 7e0cfdd668..27261d36f5 100644 --- a/libraries/networking/src/PacketProcessor.cpp +++ b/libraries/networking/src/PacketProcessor.cpp @@ -21,26 +21,28 @@ #include "Menu.h" #include "InterfaceLogging.h" -#include "DatagramProcessor.h" +#include "PacketProcessor.h" -DatagramProcessor::DatagramProcessor(QObject* parent) : +PacketProcessor::PacketProcessor(QObject* parent) : QObject(parent), _packetListenerMap() { } -void DatagramProcessor::registerPacketListener(Packet::Type type, QObject* object, QString methodName) { +void PacketProcessor::registerPacketListener(Packet::Type type, QObject* object, QString methodName) { + packetListenerLock.lock(); if (packetListenerMap.contains(type)) { qDebug() << "Warning: Registering a packet listener for packet type " << type << " that will remove a previously registered listener"; } packetListenerMap[type] = QPair(object, methodName); + packetListenerLock.unlock(); } -void DatagramProcessor::processDatagrams() { +void PacketProcessor::processDatagrams() { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), - "DatagramProcessor::processDatagrams()"); + "PacketProcessor::processDatagrams()"); if (_isShuttingDown) { return; // bail early... we're shutting down. @@ -171,6 +173,11 @@ void DatagramProcessor::processDatagrams() { break; default: //nodeList->processNodeData(senderSockAddr, incomingPacket); + + packetListenerLock.lock(); + auto& listener = packetListenerMap[incomingType]; + packetListenerLock.unlock(); + if (packetListenerMap.contains(incomingType)) { auto& listener = packetListenerMap[incomingType]; NLPacket packet; diff --git a/libraries/networking/src/PacketProcessor.h b/libraries/networking/src/PacketProcessor.h index b400c7b09c..08d5e1c2a0 100644 --- a/libraries/networking/src/PacketProcessor.h +++ b/libraries/networking/src/PacketProcessor.h @@ -10,15 +10,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_DatagramProcessor_h -#define hifi_DatagramProcessor_h +#ifndef hifi_PacketProcessor_h +#define hifi_PacketProcessor_h #include -class DatagramProcessor : public QObject { +class PacketProcessor : public QObject { Q_OBJECT public: - DatagramProcessor(QObject* parent = 0); + PacketProcessor(QObject* parent = 0); int getInPacketCount() const { return _inPacketCount; } int getOutPacketCount() const { return _outPacketCount; } @@ -35,6 +35,7 @@ public slots: void processDatagrams(); private: + QMutex packetListenerLock; QMap> packetListenerMap; int _inPacketCount = 0; int _outPacketCount = 0; @@ -43,4 +44,4 @@ private: bool _isShuttingDown = false; }; -#endif // hifi_DatagramProcessor_h +#endif // hifi_PacketProcessor_h From 44c34ac566a85929a85d15817b27384ad8f847e0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 10:49:30 -0700 Subject: [PATCH 144/582] Rename PacketProcessor to PacketReceiver --- libraries/networking/src/PacketProcessor.cpp | 12 ++++++------ libraries/networking/src/PacketProcessor.h | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libraries/networking/src/PacketProcessor.cpp b/libraries/networking/src/PacketProcessor.cpp index 27261d36f5..09d7c5488b 100644 --- a/libraries/networking/src/PacketProcessor.cpp +++ b/libraries/networking/src/PacketProcessor.cpp @@ -1,5 +1,5 @@ // -// PacketProcessor.cpp +// PacketReceiver.cpp // interface/src // // Created by Stephen Birarda on 1/23/2014. @@ -21,16 +21,16 @@ #include "Menu.h" #include "InterfaceLogging.h" -#include "PacketProcessor.h" +#include "PacketReceiver.h" -PacketProcessor::PacketProcessor(QObject* parent) : +PacketReceiver::PacketReceiver(QObject* parent) : QObject(parent), _packetListenerMap() { } -void PacketProcessor::registerPacketListener(Packet::Type type, QObject* object, QString methodName) { +void PacketReceiver::registerPacketListener(Packet::Type type, QObject* object, QString methodName) { packetListenerLock.lock(); if (packetListenerMap.contains(type)) { qDebug() << "Warning: Registering a packet listener for packet type " << type @@ -40,9 +40,9 @@ void PacketProcessor::registerPacketListener(Packet::Type type, QObject* object, packetListenerLock.unlock(); } -void PacketProcessor::processDatagrams() { +void PacketReceiver::processDatagrams() { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), - "PacketProcessor::processDatagrams()"); + "PacketReceiver::processDatagrams()"); if (_isShuttingDown) { return; // bail early... we're shutting down. diff --git a/libraries/networking/src/PacketProcessor.h b/libraries/networking/src/PacketProcessor.h index 08d5e1c2a0..58bd9b468b 100644 --- a/libraries/networking/src/PacketProcessor.h +++ b/libraries/networking/src/PacketProcessor.h @@ -1,5 +1,5 @@ // -// PacketProcessor.h +// PacketReceiver.h // interface/src // // Created by Stephen Birarda on 1/23/2014. @@ -10,15 +10,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_PacketProcessor_h -#define hifi_PacketProcessor_h +#ifndef hifi_PacketReceiver_h +#define hifi_PacketReceiver_h #include -class PacketProcessor : public QObject { +class PacketReceiver : public QObject { Q_OBJECT public: - PacketProcessor(QObject* parent = 0); + PacketReceiver(QObject* parent = 0); int getInPacketCount() const { return _inPacketCount; } int getOutPacketCount() const { return _outPacketCount; } @@ -44,4 +44,4 @@ private: bool _isShuttingDown = false; }; -#endif // hifi_PacketProcessor_h +#endif // hifi_PacketReceiver_h From 5940aee0e7972d99ad7bfc7504f5369ad71730a5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 10:50:26 -0700 Subject: [PATCH 145/582] Rename PacketProcessor files --- .../networking/src/{PacketProcessor.cpp => PacketReceiver.cpp} | 0 libraries/networking/src/{PacketProcessor.h => PacketReceiver.h} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename libraries/networking/src/{PacketProcessor.cpp => PacketReceiver.cpp} (100%) rename libraries/networking/src/{PacketProcessor.h => PacketReceiver.h} (100%) diff --git a/libraries/networking/src/PacketProcessor.cpp b/libraries/networking/src/PacketReceiver.cpp similarity index 100% rename from libraries/networking/src/PacketProcessor.cpp rename to libraries/networking/src/PacketReceiver.cpp diff --git a/libraries/networking/src/PacketProcessor.h b/libraries/networking/src/PacketReceiver.h similarity index 100% rename from libraries/networking/src/PacketProcessor.h rename to libraries/networking/src/PacketReceiver.h From 1b9f523f68b3431edcbd103166d505add3611f1f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:50:47 -0700 Subject: [PATCH 146/582] fix construction of QDataStream in AudioInjector --- libraries/audio/src/AudioInjector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 7dfaa1fdb5..446c59660b 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -156,7 +156,7 @@ void AudioInjector::injectToMixer() { auto audioPacket = NLPacket::create(PacketType::InjectAudio); // setup the packet for injected audio - QDataStream audioPacketStream(&audioPacket); + QDataStream audioPacketStream(audioPacket.get()); // pack some placeholder sequence number for now audioPacketStream << (quint16) 0; From 6bf05fbf1f91d5890de84b71eceeea7cb6973147 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 10:50:51 -0700 Subject: [PATCH 147/582] Pointer fixes --- libraries/audio/src/AudioInjector.cpp | 14 +++++++------- libraries/shared/src/RingBufferHistory.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 446c59660b..c23b5856a6 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -172,7 +172,7 @@ void AudioInjector::injectToMixer() { audioPacketStream << loopbackFlag; // pack the position for injected audio - int positionOptionOffset = audioPacket.pos(); + int positionOptionOffset = audioPacket->pos(); audioPacketStream.writeRawData(reinterpret_cast(&_options.position), sizeof(_options.position)); @@ -185,13 +185,13 @@ void AudioInjector::injectToMixer() { audioPacketStream << radius; // pack 255 for attenuation byte - int volumeOptionOffset = audioPacket.pos(); + int volumeOptionOffset = audioPacket->pos(); quint8 volume = MAX_INJECTOR_VOLUME * _options.volume; audioPacketStream << volume; audioPacketStream << _options.ignorePenumbra; - int audioDataOffset = audioPacket.pos(); + int audioDataOffset = audioPacket->pos(); QElapsedTimer timer; timer.start(); @@ -216,17 +216,17 @@ void AudioInjector::injectToMixer() { _loudness /= (float)(bytesToCopy / sizeof(int16_t)); audioPacket->seek(positionOptionOffset); - audioPacket->write(&_options.position, sizeof(_options.position)); - audioPacket.write(&_options.orientation, sizeof(_options.orientation)); + audioPacket->write(reinterpret_cast(&_options.position), sizeof(_options.position)); + audioPacket->write(reinterpret_cast(&_options.orientation), sizeof(_options.orientation)); volume = MAX_INJECTOR_VOLUME * _options.volume; audioPacket->seek(volumeOptionOffset); - audioPacket->write(&volume, sizeof(volume)); + audioPacket->write(reinterpret_cast(&volume), sizeof(volume)); audioPacket->seek(audioDataOffset); // pack the sequence number - audioPacket->write(&outgoingInjectedAudioSequenceNumber, sizeof(quint16)); + audioPacket->write(reinterpret_cast(&outgoingInjectedAudioSequenceNumber), sizeof(quint16)); // copy the next NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL bytes to the packet audioPacket->write(_audioData.data() + _currentSendPosition, bytesToCopy); diff --git a/libraries/shared/src/RingBufferHistory.h b/libraries/shared/src/RingBufferHistory.h index 60b9f2caad..4ab87329df 100644 --- a/libraries/shared/src/RingBufferHistory.h +++ b/libraries/shared/src/RingBufferHistory.h @@ -209,7 +209,7 @@ public: T* _at; }; - Iterator begin() { return Iterator(&_buffer.first(), &_buffer.last(), &_buffer[_newestEntryAtIndex], &_buffer[_newestEntryAtIndex]); } + Iterator begin() { return Iterator(&_buffer.front(), &_buffer.back(), &_buffer[_newestEntryAtIndex], &_buffer[_newestEntryAtIndex]); } Iterator end() { int endAtIndex = _newestEntryAtIndex - _numEntries; From f725ca09b2b26f6da68a73cb70c18977b719197d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:52:29 -0700 Subject: [PATCH 148/582] remaining fixes for write and pos in AudioInjector --- libraries/audio/src/AudioInjector.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 446c59660b..46b1201398 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -185,13 +185,13 @@ void AudioInjector::injectToMixer() { audioPacketStream << radius; // pack 255 for attenuation byte - int volumeOptionOffset = audioPacket.pos(); + int volumeOptionOffset = audioPacket->pos(); quint8 volume = MAX_INJECTOR_VOLUME * _options.volume; audioPacketStream << volume; audioPacketStream << _options.ignorePenumbra; - int audioDataOffset = audioPacket.pos(); + int audioDataOffset = audioPacket->pos(); QElapsedTimer timer; timer.start(); @@ -216,17 +216,17 @@ void AudioInjector::injectToMixer() { _loudness /= (float)(bytesToCopy / sizeof(int16_t)); audioPacket->seek(positionOptionOffset); - audioPacket->write(&_options.position, sizeof(_options.position)); - audioPacket.write(&_options.orientation, sizeof(_options.orientation)); + audioPacket->write(reinterpret_cast(&_options.position), sizeof(_options.position)); + audioPacket.write(reinterpret_cast(&_options.orientation), sizeof(_options.orientation)); volume = MAX_INJECTOR_VOLUME * _options.volume; audioPacket->seek(volumeOptionOffset); - audioPacket->write(&volume, sizeof(volume)); + audioPacket->write(reinterpret_cast(&volume), sizeof(volume)); audioPacket->seek(audioDataOffset); // pack the sequence number - audioPacket->write(&outgoingInjectedAudioSequenceNumber, sizeof(quint16)); + audioPacket->write(reinterpret_cast(&outgoingInjectedAudioSequenceNumber), sizeof(quint16)); // copy the next NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL bytes to the packet audioPacket->write(_audioData.data() + _currentSendPosition, bytesToCopy); From dcf1465a0c05de3b3c8ac0daaf47989a4bf9934e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 10:54:04 -0700 Subject: [PATCH 149/582] fix reference to packet pos in AudioInjector --- libraries/audio/src/AudioInjector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 46b1201398..fb8d3ca393 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -172,7 +172,7 @@ void AudioInjector::injectToMixer() { audioPacketStream << loopbackFlag; // pack the position for injected audio - int positionOptionOffset = audioPacket.pos(); + int positionOptionOffset = audioPacket->pos(); audioPacketStream.writeRawData(reinterpret_cast(&_options.position), sizeof(_options.position)); From 9d0bffaa19c6785b67ba602bc278e17e0e6ee501 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 11:14:43 -0700 Subject: [PATCH 150/582] Add PacketReceiver to LimitedNodeList --- libraries/networking/src/LimitedNodeList.cpp | 3 +++ libraries/networking/src/LimitedNodeList.h | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index aef732e5e1..2559c1b233 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -48,6 +48,7 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short _localSockAddr(), _publicSockAddr(), _stunSockAddr(STUN_SERVER_HOSTNAME, STUN_SERVER_PORT), + _packetReceiver(this), _numCollectedPackets(0), _numCollectedBytes(0), _packetStatTimer(), @@ -92,6 +93,8 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short // check the local socket right now updateLocalSockAddr(); + connect(_nodeSocket, &QUdpSocket::readyRead, _packetReceiver, &PacketReceiver::processDatagrams); + _packetStatTimer.start(); } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 7fc93b4f64..0df8f7232f 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -121,6 +121,8 @@ public: bool packetVersionAndHashMatch(const QByteArray& packet); + PacketReceiver& getPacketReceiver() { return _packetReceiver; } + // QByteArray byteArrayWithPopulatedHeader(PacketType::Value packetType) // { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } // int populatePacketHeader(QByteArray& packet, PacketType::Value packetType) @@ -305,6 +307,8 @@ protected: HifiSockAddr _publicSockAddr; HifiSockAddr _stunSockAddr; + PacketReceiver _packetReceiver; + // XXX can BandwidthRecorder be used for this? int _numCollectedPackets; int _numCollectedBytes; From 8a415b2adbe69b5faddde64cfc97c583f7e2e301 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 11:15:00 -0700 Subject: [PATCH 151/582] Register for packet types in NodeList --- libraries/networking/src/NodeList.cpp | 17 +++++++++++++++++ libraries/networking/src/NodeList.h | 1 + 2 files changed, 18 insertions(+) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 4c92ce07e7..66d7f1e25f 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -90,6 +90,18 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned // we definitely want STUN to update our public socket, so call the LNL to kick that off startSTUNPublicSocketUpdate(); + + auto packetReceiver = getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::DomainList, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::DomainServerAddedNode, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::DomainServerRequireDTLS, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::ICEServerPeerInformation, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::Ping, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::PingReply, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::ICEPing, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::ICEPingReply, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::StunResponse, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::DomainServerPathResponse, this, "processReceivedPacket"); } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { @@ -152,6 +164,11 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& } } +// TODO: Break this out into individual packet types +void NodeList::processReceivedPacket(std::unique_ptr, HifiSockAddr senderSockAddr) { + qDebug() << "Got packet!"; +} + void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) { PacketType::Value packetType = packetTypeForPacket(packet); switch (packetType) { diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 43e35f8958..6ac08fcbd9 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -61,6 +61,7 @@ public: void addSetOfNodeTypesToNodeInterestSet(const NodeSet& setOfNodeTypes); void resetNodeInterestSet() { _nodeTypesOfInterest.clear(); } + void processReceivedPacket(std::unique_ptr, HifiSockAddr senderSockAddr); void processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet); void setAssignmentServerSocket(const HifiSockAddr& serverSocket) { _assignmentServerSocket = serverSocket; } From fef51682d57c2b8615980f15571e7487b0ad1c86 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 11:19:57 -0700 Subject: [PATCH 152/582] Jurisdiction map uses new packet API --- libraries/audio-client/src/AudioClient.h | 2 + libraries/octree/src/JurisdictionMap.cpp | 51 +++++++-------------- libraries/octree/src/JurisdictionMap.h | 4 +- libraries/octree/src/JurisdictionSender.cpp | 14 ++---- 4 files changed, 24 insertions(+), 47 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 484e3a14e8..2e5e2e1221 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -75,6 +75,8 @@ typedef struct ty_gverb ty_gverb; typedef glm::vec3 (*AudioPositionGetter)(); typedef glm::quat (*AudioOrientationGetter)(); +class NLPacket; + class AudioClient : public AbstractAudioInterface, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index c9b491fe6b..3398d4b653 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -268,49 +268,35 @@ bool JurisdictionMap::writeToFile(const char* filename) { return true; } -int JurisdictionMap::packEmptyJurisdictionIntoMessage(NodeType_t type, unsigned char* destinationBuffer, int availableBytes) { - unsigned char* bufferStart = destinationBuffer; - - int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), - PacketType::Jurisdiction); - destinationBuffer += headerLength; +std::unique_ptr JurisdictionMap::packEmptyJurisdictionIntoMessage(NodeType_t type) { + int bytes = 0; + auto packet = NLPacket::create(PacketType::Jurisdiction); // Pack the Node Type in first byte - memcpy(destinationBuffer, &type, sizeof(type)); - destinationBuffer += sizeof(type); - + packet->write(reinterpret_cast(&type), sizeof(type)); // No root or end node details to pack! - int bytes = 0; - memcpy(destinationBuffer, &bytes, sizeof(bytes)); - destinationBuffer += sizeof(bytes); + packet->write(reinterpret_cast(&bytes), sizeof(bytes)); - return destinationBuffer - bufferStart; // includes header! + return std::move(packet); // includes header! } -int JurisdictionMap::packIntoMessage(unsigned char* destinationBuffer, int availableBytes) { - unsigned char* bufferStart = destinationBuffer; - - int headerLength = DependencyManager::get()->populatePacketHeader(reinterpret_cast(destinationBuffer), - PacketType::Jurisdiction); - destinationBuffer += headerLength; +std::unique_ptr JurisdictionMap::packIntoMessage() { + auto packet = NLPacket::create(PacketType::Jurisdiction); // Pack the Node Type in first byte NodeType_t type = getNodeType(); - memcpy(destinationBuffer, &type, sizeof(type)); - destinationBuffer += sizeof(type); + packet->write(reinterpret_cast(&type), sizeof(type)); // add the root jurisdiction if (_rootOctalCode) { size_t bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_rootOctalCode)); - memcpy(destinationBuffer, &bytes, sizeof(bytes)); - destinationBuffer += sizeof(bytes); - memcpy(destinationBuffer, _rootOctalCode, bytes); - destinationBuffer += bytes; + // No root or end node details to pack! + packet->write(reinterpret_cast(&bytes), sizeof(bytes)); + packet->write(reinterpret_cast(_rootOctalCode), bytes); // if and only if there's a root jurisdiction, also include the end nodes int endNodeCount = _endNodes.size(); - memcpy(destinationBuffer, &endNodeCount, sizeof(endNodeCount)); - destinationBuffer += sizeof(endNodeCount); + packet->write(reinterpret_cast(&endNodeCount), sizeof(endNodeCount)); for (int i=0; i < endNodeCount; i++) { unsigned char* endNodeCode = _endNodes[i]; @@ -318,18 +304,15 @@ int JurisdictionMap::packIntoMessage(unsigned char* destinationBuffer, int avail if (endNodeCode) { bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); } - memcpy(destinationBuffer, &bytes, sizeof(bytes)); - destinationBuffer += sizeof(bytes); - memcpy(destinationBuffer, endNodeCode, bytes); - destinationBuffer += bytes; + packet->write(reinterpret_cast(&bytes), sizeof(bytes)); + packet->write(reinterpret_cast(endNodeCode), bytes); } } else { int bytes = 0; - memcpy(destinationBuffer, &bytes, sizeof(bytes)); - destinationBuffer += sizeof(bytes); + packet->write(reinterpret_cast(&bytes), sizeof(bytes)); } - return destinationBuffer - bufferStart; // includes header! + return std::move(packet); // includes header! } int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes) { diff --git a/libraries/octree/src/JurisdictionMap.h b/libraries/octree/src/JurisdictionMap.h index ba75e3102b..ad6e4ee833 100644 --- a/libraries/octree/src/JurisdictionMap.h +++ b/libraries/octree/src/JurisdictionMap.h @@ -61,10 +61,10 @@ public: void copyContents(unsigned char* rootCodeIn, const std::vector& endNodesIn); int unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes); - int packIntoMessage(unsigned char* destinationBuffer, int availableBytes); + std::unique_ptr packIntoMessage(); /// Available to pack an empty or unknown jurisdiction into a network packet, used when no JurisdictionMap is available - static int packEmptyJurisdictionIntoMessage(NodeType_t type, unsigned char* destinationBuffer, int availableBytes); + static std::unique_ptr packEmptyJurisdictionIntoMessage(NodeType_t type); void displayDebugDetails() const; diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index 029108e6af..9493061354 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -44,16 +44,8 @@ bool JurisdictionSender::process() { // call our ReceivedPacketProcessor base class process so we'll get any pending packets if (continueProcessing && (continueProcessing = ReceivedPacketProcessor::process())) { - // add our packet to our own queue, then let the PacketSender class do the rest of the work. - static unsigned char buffer[MAX_PACKET_SIZE]; - unsigned char* bufferOut = &buffer[0]; - int sizeOut = 0; - - if (_jurisdictionMap) { - sizeOut = _jurisdictionMap->packIntoMessage(bufferOut, MAX_PACKET_SIZE); - } else { - sizeOut = JurisdictionMap::packEmptyJurisdictionIntoMessage(getNodeType(), bufferOut, MAX_PACKET_SIZE); - } + auto packet = (_jurisdictionMap) ? _jurisdictionMap->packIntoMessage() + : JurisdictionMap::packEmptyJurisdictionIntoMessage(getNodeType()); int nodeCount = 0; lockRequestingNodes(); @@ -64,7 +56,7 @@ bool JurisdictionSender::process() { SharedNodePointer node = DependencyManager::get()->nodeWithUUID(nodeUUID); if (node && node->getActiveSocket()) { - _packetSender.queuePacketForSending(node, QByteArray(reinterpret_cast(bufferOut), sizeOut)); + _packetSender.queuePacketForSending(node, packet); nodeCount++; } } From 10f843b197454cda26e295d4c84f74509dda015f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 11:28:11 -0700 Subject: [PATCH 153/582] Packet type fixes in audio client --- libraries/audio-client/src/AudioClient.cpp | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a75b9124db..b7e0faaf0a 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -767,7 +767,7 @@ void AudioClient::handleAudioInput() { while (_inputRingBuffer.samplesAvailable() >= inputSamplesRequired) { const int numNetworkBytes = _isStereoInput - ? AudioConstants::NETWORK_FRAME_BYTES_STEREO` + ? AudioConstants::NETWORK_FRAME_BYTES_STEREO : AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL; const int numNetworkSamples = _isStereoInput ? AudioConstants::NETWORK_FRAME_SAMPLES_STEREO @@ -842,14 +842,13 @@ void AudioClient::handleAudioInput() { glm::quat headOrientation = _orientationGetter(); quint8 isStereo = _isStereoInput ? 1 : 0; - PacketType::Value packetType; if (_lastInputLoudness == 0) { - _audioPacket->setType(PacketType::SilentAudioFrame); + _audioPacket->setPacketType(PacketType::SilentAudioFrame); } else { if (_shouldEchoToServer) { - _audioPacket->setType(PacketType::MicrophoneAudioWithEcho); + _audioPacket->setPacketType(PacketType::MicrophoneAudioWithEcho); } else { - _audioPacket->setType(PacketType::MicrophoneAudioNoEcho); + _audioPacket->setPacketType(PacketType::MicrophoneAudioNoEcho); } } @@ -857,23 +856,24 @@ void AudioClient::handleAudioInput() { _audioPacket->reset(); // write sequence number - _audioPacket->write(&_outgoingAvatarAudioSequenceNumber, sizeof(quint16)); + _audioPacket->write(reinterpret_cast(&_outgoingAvatarAudioSequenceNumber), sizeof(quint16)); - if (packetType == PacketType::SilentAudioFrame) { + if (_audioPacket->getPacketType() == PacketType::SilentAudioFrame) { // pack num silent samples - _audioPacket->write(&numSilentSamples, sizeof(quint16)); + quint16 numSilentSamples = numNetworkSamples; + _audioPacket->write(reinterpret_cast(&numSilentSamples), sizeof(quint16)); } else { // set the mono/stereo byte - _audioPacket->write(&isStereo, sizeof(isStereo)); + _audioPacket->write(reinterpret_cast(&isStereo), sizeof(isStereo)); } // pack the three float positions - _audioPacket->write(&headPosition, sizeof(headPosition)); + _audioPacket->write(reinterpret_cast(&headPosition), sizeof(headPosition)); // pack the orientation - _audioPacket->write(&headOrientation, sizeof(headOrientation)); + _audioPacket->write(reinterpret_cast(&headOrientation), sizeof(headOrientation)); - if (packetType != PacketType::SilentAudioFrame) { + if (_audioPacket->getPacketType() != PacketType::SilentAudioFrame) { // audio samples have already been packed (written to networkAudioSamples) _audioPacket->setSizeUsed(_audioPacket->getSizeUsed() + numNetworkBytes); } @@ -912,12 +912,12 @@ void AudioClient::sendMuteEnvironmentPacket() { auto mutePacket = NLPacket::create(PacketType::MuteEnvironment, dataSize); - const float MUTE_RADIUS = 50; + float MUTE_RADIUS = 50; glm::vec3 currentSourcePosition = _positionGetter(); - mutePacket->write(¤tSourcePosition, sizeof(currentSourcePosition)); - mutePacket->write(&MUTE_RADIUS, sizeof(MUTE_RADIUS)); + mutePacket->write(reinterpret_cast(¤tSourcePosition), sizeof(currentSourcePosition)); + mutePacket->write(reinterpret_cast(&MUTE_RADIUS), sizeof(MUTE_RADIUS)); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); From b960d86f8095e87eefc042e940067de5a368256d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 11:54:06 -0700 Subject: [PATCH 154/582] Remove datagramProcessor from Application --- interface/src/Application.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dfa082719a..3b633580ee 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -308,7 +308,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _window(new MainWindow(desktop())), _toolWindow(NULL), _friendsWindow(NULL), - _datagramProcessor(), _undoStack(), _undoStackScriptingInterface(&_undoStack), _frameCount(0), @@ -387,8 +386,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // make sure the node thread is given highest priority nodeThread->setPriority(QThread::TimeCriticalPriority); - _datagramProcessor = new DatagramProcessor(nodeList.data()); - // have the NodeList use deleteLater from DM customDeleter nodeList->setCustomDeleter([](Dependency* dependency) { static_cast(dependency)->deleteLater(); @@ -404,9 +401,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : ResourceCache* geometryCache = geometryCacheP.data(); connect(this, &Application::checkBackgroundDownloads, geometryCache, &ResourceCache::checkAsynchronousGets); - // connect the DataProcessor processDatagrams slot to the QUDPSocket readyRead() signal - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, _datagramProcessor, &DatagramProcessor::processDatagrams); - // put the audio processing on a separate thread QThread* audioThread = new QThread(); audioThread->setObjectName("Audio Thread"); @@ -641,6 +635,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : auto applicationUpdater = DependencyManager::get(); connect(applicationUpdater.data(), &AutoUpdater::newVersionIsAvailable, dialogsManager.data(), &DialogsManager::showUpdateDialog); applicationUpdater->checkForUpdate(); + + auto& packetReceiver = nodeList->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::DomainConnectionDenied, this, "handleDomainConnectionDeniedPacket"); } void Application::aboutToQuit() { @@ -654,7 +651,7 @@ void Application::cleanupBeforeQuit() { _entities.clear(); // this will allow entity scripts to properly shutdown - _datagramProcessor->shutdown(); // tell the datagram processor we're shutting down, so it can short circuit + //_datagramProcessor->shutdown(); // tell the datagram processor we're shutting down, so it can short circuit _entities.shutdown(); // tell the entities system we're shutting down, so it will stop running scripts ScriptEngine::stopAllScripts(this); // stop all currently running global scripts @@ -1783,7 +1780,7 @@ void Application::checkFPS() { _fps = (float)_frameCount / diffTime; _frameCount = 0; - _datagramProcessor->resetCounters(); + //_datagramProcessor->resetCounters(); _timerStart.start(); // ask the node list to check in with the domain server From 0b0446e527e452647f54973b0db28cf5969dfa00 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 11:54:22 -0700 Subject: [PATCH 155/582] Add handleComainConnectionDeniedPacket to Application --- interface/src/Application.cpp | 15 +++++++++++++++ interface/src/Application.h | 3 +-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3b633580ee..fb01af2747 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3815,6 +3815,21 @@ void Application::domainConnectionDenied(const QString& reason) { } } +void handleDomainConnectionDeniedPacket(std::unique_ptr, HifiSockAddr senderSockAddr) { + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::DomainConnectionDenied); + QDataStream packetStream(QByteArray(incomingPacket.constData() + headerSize, + incomingPacket.size() - headerSize)); + QString reason; + packetStream >> reason; + + // output to the log so the user knows they got a denied connection request + // and check and signal for an access token so that we can make sure they are logged in + qCDebug(interfaceapp) << "The domain-server denied a connection request: " << reason; + qCDebug(interfaceapp) << "You may need to re-log to generate a keypair so you can provide a username signature."; + domainConnectionDenied(reason); + AccountManager::getInstance().checkAndSignalForAccessToken(); +} + void Application::connectedToDomain(const QString& hostname) { AccountManager& accountManager = AccountManager::getInstance(); const QUuid& domainID = DependencyManager::get()->getDomainHandler().getUUID(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 0131fdb19a..8ae00cdd38 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -445,6 +445,7 @@ public slots: void notifyPacketVersionMismatch(); void domainConnectionDenied(const QString& reason); + void handleDomainConnectionDeniedPacket(std::unique_ptr, HifiSockAddr senderSockAddr); void cameraMenuChanged(); @@ -528,8 +529,6 @@ private: ToolWindow* _toolWindow; WebWindowClass* _friendsWindow; - DatagramProcessor* _datagramProcessor; - QUndoStack _undoStack; UndoStackScriptingInterface _undoStackScriptingInterface; From f1bf52602fdd16043b82c1f1463c8bb1d479ab50 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 11:54:50 -0700 Subject: [PATCH 156/582] Fix Packet::Type (PacketType::Value) --- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 1 + libraries/networking/src/NodeList.cpp | 2 +- libraries/networking/src/PacketReceiver.cpp | 17 +---------------- libraries/networking/src/PacketReceiver.h | 4 ++-- 5 files changed, 6 insertions(+), 20 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2559c1b233..efd2373a82 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -93,7 +93,7 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short // check the local socket right now updateLocalSockAddr(); - connect(_nodeSocket, &QUdpSocket::readyRead, _packetReceiver, &PacketReceiver::processDatagrams); + connect(&_nodeSocket, &QUdpSocket::readyRead, &_packetReceiver, &PacketReceiver::processDatagrams); _packetStatTimer.start(); } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 0df8f7232f..84b40c70ff 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -39,6 +39,7 @@ #include "NLPacket.h" #include "PacketHeaders.h" #include "PacketList.h" +#include "PacketReceiver.h" #include "UUIDHasher.h" const int MAX_PACKET_SIZE = 1450; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 66d7f1e25f..94b6e2a0e7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -91,7 +91,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned // we definitely want STUN to update our public socket, so call the LNL to kick that off startSTUNPublicSocketUpdate(); - auto packetReceiver = getPacketReceiver(); + auto& packetReceiver = getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::DomainList, this, "processReceivedPacket"); packetReceiver.registerPacketListener(PacketType::DomainServerAddedNode, this, "processReceivedPacket"); packetReceiver.registerPacketListener(PacketType::DomainServerRequireDTLS, this, "processReceivedPacket"); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 09d7c5488b..b3b839014b 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -30,7 +30,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : } -void PacketReceiver::registerPacketListener(Packet::Type type, QObject* object, QString methodName) { +void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* object, QString methodName) { packetListenerLock.lock(); if (packetListenerMap.contains(type)) { qDebug() << "Warning: Registering a packet listener for packet type " << type @@ -124,21 +124,6 @@ void PacketReceiver::processDatagrams() { } break; } - case PacketType::DomainConnectionDenied: { - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::DomainConnectionDenied); - QDataStream packetStream(QByteArray(incomingPacket.constData() + headerSize, - incomingPacket.size() - headerSize)); - QString reason; - packetStream >> reason; - - // output to the log so the user knows they got a denied connection request - // and check and signal for an access token so that we can make sure they are logged in - qCDebug(interfaceapp) << "The domain-server denied a connection request: " << reason; - qCDebug(interfaceapp) << "You may need to re-log to generate a keypair so you can provide a username signature."; - application->domainConnectionDenied(reason); - AccountManager::getInstance().checkAndSignalForAccessToken(); - break; - } case PacketType::NoisyMute: case PacketType::MuteEnvironment: { bool mute = !DependencyManager::get()->isMuted(); diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 58bd9b468b..cc61bdb3cb 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -29,14 +29,14 @@ public: void shutdown() { _isShuttingDown = true; } - void registerPacketListener(Packet::Type type, QObject* object, QString methodName); + void registerPacketListener(PacketType::Value type, QObject* object, QString methodName); public slots: void processDatagrams(); private: QMutex packetListenerLock; - QMap> packetListenerMap; + QMap> packetListenerMap; int _inPacketCount = 0; int _outPacketCount = 0; int _inByteCount = 0; From e13360b1b6faebce3d592943f621b344b7b3749d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 12:18:38 -0700 Subject: [PATCH 157/582] initial changes to OctreeEditPacketSender for new API --- .../networking/src/SentPacketHistory.cpp | 8 +- libraries/networking/src/SentPacketHistory.h | 2 +- libraries/octree/src/EditPacketBuffer.cpp | 30 ---- libraries/octree/src/EditPacketBuffer.h | 34 ---- .../octree/src/OctreeEditPacketSender.cpp | 169 ++++++++---------- libraries/octree/src/OctreeEditPacketSender.h | 67 +++---- .../octree/src/OctreeScriptingInterface.h | 14 +- 7 files changed, 110 insertions(+), 214 deletions(-) delete mode 100644 libraries/octree/src/EditPacketBuffer.cpp delete mode 100644 libraries/octree/src/EditPacketBuffer.h diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 2a90f0f094..770973f8d8 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -24,7 +24,7 @@ SentPacketHistory::SentPacketHistory(int size) } -void SentPacketHistory::packetSent(uint16_t sequenceNumber, const NLPacket& packet) { +void SentPacketHistory::packetSent(uint16_t sequenceNumber, const std::unique_ptr& packet) { // check if given seq number has the expected value. if not, something's wrong with // the code calling this function @@ -34,10 +34,8 @@ void SentPacketHistory::packetSent(uint16_t sequenceNumber, const NLPacket& pack << "Expected:" << expectedSequenceNumber << "Actual:" << sequenceNumber; } _newestSequenceNumber = sequenceNumber; - - auto temp = std::unique_ptr(const_cast(&packet)); - _sentPackets.insert(NLPacket::createCopy(temp)); - temp.release(); + + _sentPackets.insert(NLPacket::createCopy(packet)); } const std::unique_ptr& SentPacketHistory::getPacket(uint16_t sequenceNumber) const { diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index 08aa2f9764..ad03f87f88 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -24,7 +24,7 @@ class SentPacketHistory { public: SentPacketHistory(int size = MAX_REASONABLE_SEQUENCE_GAP); - void packetSent(uint16_t sequenceNumber, const NLPacket& packet); + void packetSent(uint16_t sequenceNumber, const std::unique_ptr& packet); const std::unique_ptr& getPacket(uint16_t sequenceNumber) const; private: diff --git a/libraries/octree/src/EditPacketBuffer.cpp b/libraries/octree/src/EditPacketBuffer.cpp deleted file mode 100644 index 5e2f74549c..0000000000 --- a/libraries/octree/src/EditPacketBuffer.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// EditPacketBuffer.cpp -// libraries/octree/src -// -// Created by Stephen Birarda on 2014-07-30. -// Copyright 2014 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 "EditPacketBuffer.h" - -EditPacketBuffer::EditPacketBuffer() : - _nodeUUID(), - _currentType(PacketType::Unknown), - _currentSize(0), - _satoshiCost(0) -{ - -} - -EditPacketBuffer::EditPacketBuffer(PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost, QUuid nodeUUID) : - _nodeUUID(nodeUUID), - _currentType(type), - _currentSize(length), - _satoshiCost(satoshiCost) -{ - memcpy(_currentBuffer, buffer, length); -} \ No newline at end of file diff --git a/libraries/octree/src/EditPacketBuffer.h b/libraries/octree/src/EditPacketBuffer.h deleted file mode 100644 index 9a7ec47b9a..0000000000 --- a/libraries/octree/src/EditPacketBuffer.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// EditPacketBuffer.h -// libraries/octree/src -// -// Created by Stephen Birarda on 2014-07-30. -// Copyright 2014 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_EditPacketBuffer_h -#define hifi_EditPacketBuffer_h - -#include - -#include -#include - -/// Used for construction of edit packets -class EditPacketBuffer { -public: - EditPacketBuffer(); - EditPacketBuffer(PacketType::Value type, unsigned char* codeColorBuffer, size_t length, - qint64 satoshiCost = 0, const QUuid nodeUUID = QUuid()); - - QUuid _nodeUUID; - PacketType::Value _currentType; - unsigned char _currentBuffer[MAX_PACKET_SIZE]; - size_t _currentSize; - qint64 _satoshiCost; -}; - -#endif // hifi_EditPacketBuffer_h \ No newline at end of file diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 260f49e4b8..0b1bd02cf7 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -27,7 +27,6 @@ OctreeEditPacketSender::OctreeEditPacketSender() : _maxPendingMessages(DEFAULT_MAX_PENDING_MESSAGES), _releaseQueuedMessagesPending(false), _serverJurisdictions(NULL), - _maxPacketSize(MAX_PACKET_SIZE), _destinationWalletUUID() { @@ -35,16 +34,8 @@ OctreeEditPacketSender::OctreeEditPacketSender() : OctreeEditPacketSender::~OctreeEditPacketSender() { _pendingPacketsLock.lock(); - while (!_preServerSingleMessagePackets.empty()) { - EditPacketBuffer* packet = _preServerSingleMessagePackets.front(); - delete packet; - _preServerSingleMessagePackets.erase(_preServerSingleMessagePackets.begin()); - } - while (!_preServerPackets.empty()) { - EditPacketBuffer* packet = _preServerPackets.front(); - delete packet; - _preServerPackets.erase(_preServerPackets.begin()); - } + _preServerSingleMessagePackets.clear(); + _preServerEdits.clear(); _pendingPacketsLock.unlock(); } @@ -82,8 +73,7 @@ bool OctreeEditPacketSender::serversExist() const { // This method is called when the edit packet layer has determined that it has a fully formed packet destined for // a known nodeID. -void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned char* buffer, - size_t length, qint64 satoshiCost) { +void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::unique_ptr packet) { bool wantDebug = false; DependencyManager::get()->eachNode([&](const SharedNodePointer& node){ @@ -92,40 +82,38 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned c && ((node->getUUID() == nodeUUID) || (nodeUUID.isNull())) && node->getActiveSocket()) { + // jump to the beginning of the payload + packet->seek(0); + // pack sequence number - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(buffer)); - unsigned char* sequenceAt = buffer + numBytesPacketHeader; quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++; - memcpy(sequenceAt, &sequence, sizeof(quint16)); + packet->write(reinterpret_cast(&sequence), sizeof(sequence)); - // send packet - QByteArray packet(reinterpret_cast(buffer), length); + // debugging output... + if (wantDebug) { + unsigned short int sequence; + quint64 createdAt; - queuePacketForSending(node, packet); + packet->seek(0); - if (hasDestinationWalletUUID() && satoshiCost > 0) { - // if we have a destination wallet UUID and a cost associated with this packet, signal that it - // needs to be sent - emit octreePaymentRequired(satoshiCost, nodeUUID, _destinationWalletUUID); + // read the sequence number and createdAt + packet->read(&sequence); + packet->read(&createdAt); + + quint64 queuedAt = usecTimestampNow(); + quint64 transitTime = queuedAt - createdAt; + + qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << buffer[0] << + " - command to node bytes=" << length << + " satoshiCost=" << satoshiCost << + " sequence=" << sequence << + " transitTimeSoFar=" << transitTime << " usecs"; } // add packet to history _sentPacketHistories[nodeUUID].packetSent(sequence, packet); - // debugging output... - if (wantDebug) { - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(buffer)); - unsigned short int sequence = (*((unsigned short int*)(buffer + numBytesPacketHeader))); - quint64 createdAt = (*((quint64*)(buffer + numBytesPacketHeader + sizeof(sequence)))); - quint64 queuedAt = usecTimestampNow(); - quint64 transitTime = queuedAt - createdAt; - - qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << buffer[0] << - " - command to node bytes=" << length << - " satoshiCost=" << satoshiCost << - " sequence=" << sequence << - " transitTimeSoFar=" << transitTime << " usecs"; - } + queuePacketForSending(node, packet); } }); } @@ -136,19 +124,18 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { // First send out all the single message packets... _pendingPacketsLock.lock(); while (!_preServerSingleMessagePackets.empty()) { - EditPacketBuffer* packet = _preServerSingleMessagePackets.front(); - queuePacketToNodes(&packet->_currentBuffer[0], packet->_currentSize, packet->_satoshiCost); - delete packet; - _preServerSingleMessagePackets.erase(_preServerSingleMessagePackets.begin()); + std::unique_ptr packet = std::move(_preServerSingleMessagePackets.front()); + queuePacketToNodes(std::move(packet)); + _preServerSingleMessagePackets.pop_front(); } // Then "process" all the packable messages... while (!_preServerPackets.empty()) { - EditPacketBuffer* packet = _preServerPackets.front(); - queueOctreeEditMessage(packet->_currentType, &packet->_currentBuffer[0], packet->_currentSize); - delete packet; - _preServerPackets.erase(_preServerPackets.begin()); + EditMessageTuple editMessage = std::move(_preServerEdits.front()); + queueOctreeEditMessage(editMessage.first(), editMessage.second(), editMessage.third()); + _preServerPackets.pop_front(); } + _pendingPacketsLock.unlock(); // if while waiting for the jurisdictions the caller called releaseQueuedMessages() @@ -159,34 +146,29 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { } } -void OctreeEditPacketSender::queuePendingPacketToNodes(PacketType::Value type, unsigned char* buffer, - size_t length, qint64 satoshiCost) { +void OctreeEditPacketSender::queuePendingPacketToNodes(std::unique_ptr packet) { // If we're asked to save messages while waiting for voxel servers to arrive, then do so... if (_maxPendingMessages > 0) { - EditPacketBuffer* packet = new EditPacketBuffer(type, buffer, length, satoshiCost); _pendingPacketsLock.lock(); _preServerSingleMessagePackets.push_back(packet); // if we've saved MORE than our max, then clear out the oldest packet... int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerPackets.size(); if (allPendingMessages > _maxPendingMessages) { - EditPacketBuffer* packet = _preServerSingleMessagePackets.front(); - delete packet; - _preServerSingleMessagePackets.erase(_preServerSingleMessagePackets.begin()); + _preServerSingleMessagePackets.pop_front(); } _pendingPacketsLock.unlock(); } } -void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, size_t length, qint64 satoshiCost) { +void OctreeEditPacketSender::queuePacketToNodes(std::unique_ptr packet) { if (!_shouldSend) { return; // bail early } assert(serversExist()); // we must have jurisdictions to be here!! - int headerBytes = numBytesForPacketHeader(reinterpret_cast(buffer)) + sizeof(short) + sizeof(quint64); - unsigned char* octCode = buffer + headerBytes; // skip the packet header to get to the octcode + const unsigned char* octCode = reinterpret_cast(packet->getPayload()) + sizeof(short) + sizeof(quint64); // We want to filter out edit messages for servers based on the server's Jurisdiction // But we can't really do that with a packed message, since each edit message could be destined @@ -204,8 +186,11 @@ void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, size_t le const JurisdictionMap& map = (*_serverJurisdictions)[nodeUUID]; isMyJurisdiction = (map.isMyJurisdiction(octCode, CHECK_NODE_ONLY) == JurisdictionMap::WITHIN); _serverJurisdictions->unlock(); + if (isMyJurisdiction) { - queuePacketToNode(nodeUUID, buffer, length, satoshiCost); + // make a copy of this packet for this node and queue + auto packetCopy = NLPacket::createCopy(packet); + queuePacketToNode(std::move(packetCopy)); } } }); @@ -213,8 +198,7 @@ void OctreeEditPacketSender::queuePacketToNodes(unsigned char* buffer, size_t le // NOTE: editPacketBuffer - is JUST the octcode/color and does not contain the packet header! -void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsigned char* editPacketBuffer, - size_t length, qint64 satoshiCost) { +void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsigned char* editPacketBuffer, size_t length) { if (!_shouldSend) { return; // bail early @@ -224,16 +208,14 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi // jurisdictions for processing if (!serversExist()) { if (_maxPendingMessages > 0) { - EditPacketBuffer* packet = new EditPacketBuffer(type, editPacketBuffer, length); + EditMessageTuple messageTuple { type, editPacketBuffer, length }; _pendingPacketsLock.lock(); - _preServerPackets.push_back(packet); + _preServerEdits.push_back(messageTuple); // if we've saved MORE than out max, then clear out the oldest packet... int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerPackets.size(); if (allPendingMessages > _maxPendingMessages) { - EditPacketBuffer* packet = _preServerPackets.front(); - delete packet; - _preServerPackets.erase(_preServerPackets.begin()); + _preServerEdits.pop_front(); } _pendingPacketsLock.unlock(); } @@ -267,19 +249,22 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi _serverJurisdictions->unlock(); } if (isMyJurisdiction) { - EditPacketBuffer& packetBuffer = _pendingEditPackets[nodeUUID]; - packetBuffer._nodeUUID = nodeUUID; + std::unique_ptr& bufferedPacket = _pendingEditPackets[nodeUUID]; - // If we're switching type, then we send the last one and start over - if ((type != packetBuffer._currentType && packetBuffer._currentSize > 0) || - (packetBuffer._currentSize + length >= (size_t)_maxPacketSize)) { - releaseQueuedPacket(packetBuffer); - initializePacket(packetBuffer, type, node->getClockSkewUsec()); - } + if (!bufferedPacket) { + bufferedPacket = NLPacket::create(type); + } else { + // If we're switching type, then we send the last one and start over + if ((type != bufferedPacket->getType() && bufferedPacket->getSizeUsed() > 0) || + (length >= bufferedPacket->bytesAvailable())) { - // If the buffer is empty and not correctly initialized for our type... - if (type != packetBuffer._currentType && packetBuffer._currentSize == 0) { - initializePacket(packetBuffer, type, node->getClockSkewUsec()); + // create the new packet and swap it with the packet in _pendingEditPackets + auto packetToRelease = initializePacket(type, node->getClockSkewUsec()); + bufferedPacket.swap(packetToRelease); + + // release the previously buffered packet + releaseQueuedPacket(packetToRelease); + } } // This is really the first time we know which server/node this particular edit message @@ -290,9 +275,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi adjustEditPacketForClockSkew(type, editPacketBuffer, length, node->getClockSkewUsec()); } - memcpy(&packetBuffer._currentBuffer[packetBuffer._currentSize], editPacketBuffer, length); - packetBuffer._currentSize += length; - packetBuffer._satoshiCost += satoshiCost; + bufferedPacket->write(reinterpret_cast(editPacketBuffer), length); } } }); @@ -309,47 +292,45 @@ void OctreeEditPacketSender::releaseQueuedMessages() { _releaseQueuedMessagesPending = true; } else { _packetsQueueLock.lock(); - for (QHash::iterator i = _pendingEditPackets.begin(); i != _pendingEditPackets.end(); i++) { - releaseQueuedPacket(i.value()); + for (auto i = _pendingEditPackets.begin(); i != _pendingEditPackets.end(); i++) { + // construct a null unique_ptr to an NL packet + std::unique_ptr releasedPacket; + + // swap the null ptr with the packet we want to release + i.value().swap(releasedPacket); + + // move and release the queued packet + releaseQueuedPacket(i.key(), std::move(releasedPacket)); } _packetsQueueLock.unlock(); } } -void OctreeEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer) { +void OctreeEditPacketSender::releaseQueuedPacket(std::unique_ptr packet) { _releaseQueuedPacketMutex.lock(); if (packetBuffer._currentSize > 0 && packetBuffer._currentType != PacketType::Unknown) { - queuePacketToNode(packetBuffer._nodeUUID, &packetBuffer._currentBuffer[0], - packetBuffer._currentSize, packetBuffer._satoshiCost); + queuePacketToNode(std::move(packet)); packetBuffer._currentSize = 0; packetBuffer._currentType = PacketType::Unknown; } _releaseQueuedPacketMutex.unlock(); } -void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType::Value type, int nodeClockSkew) { - packetBuffer._currentSize = - DependencyManager::get()->populatePacketHeader(reinterpret_cast(&packetBuffer._currentBuffer[0]), type); +std::unique_ptr OctreeEditPacketSender::initializePacket(PacketType::Value type, int nodeClockSkew) { + auto newPacket = NLPacket::create(type); // skip over sequence number for now; will be packed when packet is ready to be sent out - packetBuffer._currentSize += sizeof(quint16); + newPacket->seek(sizeof(quint16)); // pack in timestamp quint64 now = usecTimestampNow() + nodeClockSkew; - quint64* timeAt = (quint64*)&packetBuffer._currentBuffer[packetBuffer._currentSize]; - *timeAt = now; - packetBuffer._currentSize += sizeof(quint64); // nudge past timestamp - - packetBuffer._currentType = type; - - // reset cost for packet to 0 - packetBuffer._satoshiCost = 0; + newPacket->write(reinterpret_cast(&now), sizeof(now)); } bool OctreeEditPacketSender::process() { // if we have server jurisdiction details, and we have pending pre-jurisdiction packets, then process those // before doing our normal process step. This processPreJurisdictionPackets() - if (serversExist() && (!_preServerPackets.empty() || !_preServerSingleMessagePackets.empty() )) { + if (serversExist() && (!_preServerEdits.empty() || !_preServerSingleMessagePackets.empty() )) { processPreServerExistsPackets(); } diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index caeeea5508..fdc4bfc189 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -16,7 +16,6 @@ #include #include -#include "EditPacketBuffer.h" #include "JurisdictionMap.h" #include "SentPacketHistory.h" @@ -26,17 +25,17 @@ class OctreeEditPacketSender : public PacketSender { public: OctreeEditPacketSender(); ~OctreeEditPacketSender(); - - /// Queues a single edit message. Will potentially send a pending multi-command packet. Determines which server - /// node or nodes the packet should be sent to. Can be called even before servers are known, in which case up to - /// MaxPendingMessages will be buffered and processed when servers are known. - void queueOctreeEditMessage(PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - /// Releases all queued messages even if those messages haven't filled an MTU packet. This will move the packed message + /// Queues a single edit message. Will potentially send a pending multi-command packet. Determines which server + /// node or nodes the packet should be sent to. Can be called even before servers are known, in which case up to + /// MaxPendingMessages will be buffered and processed when servers are known. + void queueOctreeEditMessage(EditMessageTuple); + + /// Releases all queued messages even if those messages haven't filled an MTU packet. This will move the packed message /// packets onto the send queue. If running in threaded mode, the caller does not need to do any further processing to /// have these packets get sent. If running in non-threaded mode, the caller must still call process() on a regular - /// interval to ensure that the packets are actually sent. Can be called even before servers are known, in - /// which case up to MaxPendingMessages of the released messages will be buffered and actually released when + /// interval to ensure that the packets are actually sent. Can be called even before servers are known, in + /// which case up to MaxPendingMessages of the released messages will be buffered and actually released when /// servers are known. void releaseQueuedMessages(); @@ -53,7 +52,7 @@ public: /// The internal contents of the jurisdiction map may change throughout the lifetime of the OctreeEditPacketSender. This map /// can be set prior to servers being present, so long as the contents of the map accurately reflect the current /// known jurisdictions. - void setServerJurisdictions(NodeToJurisdictionMap* serverJurisdictions) { + void setServerJurisdictions(NodeToJurisdictionMap* serverJurisdictions) { _serverJurisdictions = serverJurisdictions; } @@ -61,33 +60,23 @@ public: virtual bool process(); /// Set the desired number of pending messages that the OctreeEditPacketSender should attempt to queue even if - /// servers are not present. This only applies to how the OctreeEditPacketSender will manage messages when no + /// servers are not present. This only applies to how the OctreeEditPacketSender will manage messages when no /// servers are present. By default, this value is the same as the default packets that will be sent in one second. - /// Which means the OctreeEditPacketSender will not buffer all messages given to it if no servers are present. + /// Which means the OctreeEditPacketSender will not buffer all messages given to it if no servers are present. /// This is the maximum number of queued messages and single messages. void setMaxPendingMessages(int maxPendingMessages) { _maxPendingMessages = maxPendingMessages; } // the default number of pending messages we will store if no servers are available static const int DEFAULT_MAX_PENDING_MESSAGES; - // is there an octree server available to send packets to + // is there an octree server available to send packets to bool serversExist() const; - /// Set the desired max packet size in bytes that the OctreeEditPacketSender should create - void setMaxPacketSize(int maxPacketSize) { _maxPacketSize = maxPacketSize; } - - /// returns the current desired max packet size in bytes that the OctreeEditPacketSender will create - int getMaxPacketSize() const { return _maxPacketSize; } - // you must override these... virtual char getMyNodeType() const = 0; - virtual void adjustEditPacketForClockSkew(PacketType::Value type, + virtual void adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editPacketBuffer, size_t length, int clockSkew) { } - - bool hasDestinationWalletUUID() const { return !_destinationWalletUUID.isNull(); } - void setDestinationWalletUUID(const QUuid& destinationWalletUUID) { _destinationWalletUUID = destinationWalletUUID; } - const QUuid& getDestinationWalletUUID() { return _destinationWalletUUID; } - + void processNackPacket(const QByteArray& packet); public slots: @@ -95,38 +84,36 @@ public slots: signals: void octreePaymentRequired(qint64 satoshiAmount, const QUuid& nodeUUID, const QUuid& destinationWalletUUID); - + protected: + using EditMessageTuple = std::tuple; + bool _shouldSend; - void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - void queuePendingPacketToNodes(PacketType::Value type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - void queuePacketToNodes(unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - void initializePacket(EditPacketBuffer& packetBuffer, PacketType::Value type, int nodeClockSkew); - void releaseQueuedPacket(EditPacketBuffer& packetBuffer); // releases specific queued packet - + void queuePacketToNode(const QUuid& nodeID, std::unique_ptr packet); + void queuePendingPacketToNodes(PacketType::Value type, unsigned char* buffer, size_t length); + void queuePacketToNodes(std::unique_ptr packet); + std::unique_ptr initializePacket(PacketType::Value type, int nodeClockSkew); + void releaseQueuedPacket(const QUuid& nodeUUID, std::unique_ptr packetBuffer); // releases specific queued packet + void processPreServerExistsPackets(); // These are packets which are destined from know servers but haven't been released because they're still too small - QHash _pendingEditPackets; - + QHash> _pendingEditPackets; + // These are packets that are waiting to be processed because we don't yet know if there are servers int _maxPendingMessages; bool _releaseQueuedMessagesPending; QMutex _pendingPacketsLock; QMutex _packetsQueueLock; // don't let different threads release the queue while another thread is writing to it - QVector _preServerPackets; // these will get packed into other larger packets - QVector _preServerSingleMessagePackets; // these will go out as is + std::list _preServerEdits; // these will get packed into other larger packets + std::list> _preServerSingleMessagePackets; // these will go out as is NodeToJurisdictionMap* _serverJurisdictions; - - int _maxPacketSize; QMutex _releaseQueuedPacketMutex; // TODO: add locks for this and _pendingEditPackets QHash _sentPacketHistories; QHash _outgoingSequenceNumbers; - - QUuid _destinationWalletUUID; }; #endif // hifi_OctreeEditPacketSender_h diff --git a/libraries/octree/src/OctreeScriptingInterface.h b/libraries/octree/src/OctreeScriptingInterface.h index 52d7c8be34..ea897bbb4f 100644 --- a/libraries/octree/src/OctreeScriptingInterface.h +++ b/libraries/octree/src/OctreeScriptingInterface.h @@ -21,7 +21,7 @@ class OctreeScriptingInterface : public QObject { Q_OBJECT public: - OctreeScriptingInterface(OctreeEditPacketSender* packetSender = NULL, + OctreeScriptingInterface(OctreeEditPacketSender* packetSender = NULL, JurisdictionListener* jurisdictionListener = NULL); ~OctreeScriptingInterface(); @@ -31,20 +31,14 @@ public: void setPacketSender(OctreeEditPacketSender* packetSender); void setJurisdictionListener(JurisdictionListener* jurisdictionListener); void init(); - + virtual NodeType_t getServerNodeType() const = 0; virtual OctreeEditPacketSender* createPacketSender() = 0; private slots: void cleanupManagedObjects(); - + public slots: - /// Set the desired max packet size in bytes that should be created - void setMaxPacketSize(int maxPacketSize) { return _packetSender->setMaxPacketSize(maxPacketSize); } - - /// returns the current desired max packet size in bytes that will be created - int getMaxPacketSize() const { return _packetSender->getMaxPacketSize(); } - /// set the max packets per second send rate void setPacketsPerSecond(int packetsPerSecond) { return _packetSender->setPacketsPerSecond(packetsPerSecond); } @@ -65,7 +59,7 @@ public slots: /// returns the bytes per second send rate of this object over its lifetime float getLifetimeBPS() const { return _packetSender->getLifetimeBPS(); } - + /// returns the packets per second queued rate of this object over its lifetime float getLifetimePPSQueued() const { return _packetSender->getLifetimePPSQueued(); } From c365ea60ad3993e992d6a0c035ffb88fb0f0d268 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 13:13:21 -0700 Subject: [PATCH 158/582] Add packet listening to AvatarManager --- interface/src/avatar/AvatarManager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index dbd46cbfbd..955394a465 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -66,6 +66,12 @@ AvatarManager::AvatarManager(QObject* parent) : // register a meta type for the weak pointer we'll use for the owning avatar mixer for each avatar qRegisterMetaType >("NodeWeakPointer"); _myAvatar = std::make_shared(); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::BulkAvatarData, this, ...); + packetReceiver.registerPacketListener(PacketType::KillAvatar, this, ...); + packetReceiver.registerPacketListener(PacketType::AvatarIdentity, this, ...); + packetReceiver.registerPacketListener(PacketType::AvatarBillboard, this, ...); } void AvatarManager::init() { From d9e10db011e4ec9eb8e79ecbb79c296cfb71dc4a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 13:43:37 -0700 Subject: [PATCH 159/582] use of new API in OctreeEditPacketSender --- libraries/networking/src/LimitedNodeList.h | 25 +++++++---- libraries/octree/src/JurisdictionMap.h | 15 ++++--- libraries/octree/src/JurisdictionSender.cpp | 2 +- .../octree/src/OctreeEditPacketSender.cpp | 43 ++++++++----------- libraries/octree/src/OctreeEditPacketSender.h | 7 +-- 5 files changed, 47 insertions(+), 45 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 7fc93b4f64..1eb687fe82 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -12,6 +12,7 @@ #ifndef hifi_LimitedNodeList_h #define hifi_LimitedNodeList_h +#include #include #include #include @@ -145,14 +146,20 @@ public: // const HifiSockAddr& overridenSockAddr = HifiSockAddr()); // - qint64 sendUnreliablePacket(std::unique_ptr& packet, const SharedNodePointer& destinationNode) {}; - qint64 sendUnreliablePacket(std::unique_ptr& packet, const HifiSockAddr& sockAddr) {}; + qint64 sendUnreliablePacket(std::unique_ptr& packet, const SharedNodePointer& destinationNode) + { assert(false); return 0; } + qint64 sendUnreliablePacket(std::unique_ptr& packet, const HifiSockAddr& sockAddr) + { assert(false); return 0; } - qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) {}; - qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) {}; + qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) + { assert(false); return 0; } + qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) + { assert(false); return 0; } - qint64 sendPacketList(NLPacketList& packetList, const SharedNodePointer& destinationNode) {}; - qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) {}; + qint64 sendPacketList(NLPacketList& packetList, const SharedNodePointer& destinationNode) + { assert(false); return 0; } + qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) + { assert(false); return 0; } void (*linkedDataCreateCallback)(Node *); @@ -177,7 +184,8 @@ public: int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray& packet); int findNodeAndUpdateWithDataFromPacket(const QByteArray& packet); - unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) {}; + unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) + { assert(false); return 0; } SharedNodePointer soloNodeOfType(char nodeType); void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); @@ -293,7 +301,8 @@ protected: const QUuid& peerRequestID = QUuid()); qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr) {}; + const HifiSockAddr& overridenSockAddr) + { assert(false); return 0; } QUuid _sessionUUID; diff --git a/libraries/octree/src/JurisdictionMap.h b/libraries/octree/src/JurisdictionMap.h index ad6e4ee833..eccaef0a60 100644 --- a/libraries/octree/src/JurisdictionMap.h +++ b/libraries/octree/src/JurisdictionMap.h @@ -20,6 +20,7 @@ #include #include +#include #include class JurisdictionMap { @@ -29,7 +30,7 @@ public: WITHIN, BELOW }; - + // standard constructors JurisdictionMap(NodeType_t type = NodeType::EntityServer); // default constructor JurisdictionMap(const JurisdictionMap& other); // copy constructor @@ -42,8 +43,8 @@ public: JurisdictionMap(JurisdictionMap&& other); // move constructor JurisdictionMap& operator= (JurisdictionMap&& other); // move assignment #endif - - // application constructors + + // application constructors JurisdictionMap(const char* filename); JurisdictionMap(unsigned char* rootOctalCode, const std::vector& endNodes); JurisdictionMap(const char* rootHextString, const char* endNodesHextString); @@ -62,15 +63,15 @@ public: int unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes); std::unique_ptr packIntoMessage(); - + /// Available to pack an empty or unknown jurisdiction into a network packet, used when no JurisdictionMap is available static std::unique_ptr packEmptyJurisdictionIntoMessage(NodeType_t type); void displayDebugDetails() const; - + NodeType_t getNodeType() const { return _nodeType; } void setNodeType(NodeType_t type) { _nodeType = type; } - + private: void copyContents(const JurisdictionMap& other); // use assignment instead void clear(); @@ -81,7 +82,7 @@ private: NodeType_t _nodeType; }; -/// Map between node IDs and their reported JurisdictionMap. Typically used by classes that need to know which nodes are +/// Map between node IDs and their reported JurisdictionMap. Typically used by classes that need to know which nodes are /// managing which jurisdictions. class NodeToJurisdictionMap : public QMap, public QReadWriteLock {}; typedef QMap::iterator NodeToJurisdictionMapIterator; diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index 9493061354..e9aa8f99bf 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -56,7 +56,7 @@ bool JurisdictionSender::process() { SharedNodePointer node = DependencyManager::get()->nodeWithUUID(nodeUUID); if (node && node->getActiveSocket()) { - _packetSender.queuePacketForSending(node, packet); + _packetSender.queuePacketForSending(node, std::move(packet)); nodeCount++; } } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 0b1bd02cf7..77bc6a9c70 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -26,8 +26,7 @@ OctreeEditPacketSender::OctreeEditPacketSender() : _shouldSend(true), _maxPendingMessages(DEFAULT_MAX_PENDING_MESSAGES), _releaseQueuedMessagesPending(false), - _serverJurisdictions(NULL), - _destinationWalletUUID() + _serverJurisdictions(NULL) { } @@ -103,17 +102,15 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu quint64 queuedAt = usecTimestampNow(); quint64 transitTime = queuedAt - createdAt; - qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << buffer[0] << - " - command to node bytes=" << length << - " satoshiCost=" << satoshiCost << - " sequence=" << sequence << - " transitTimeSoFar=" << transitTime << " usecs"; + qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << packet->readType() + << " - command to node bytes=" << packet->getSizeWithHeader() + << " sequence=" << sequence << " transitTimeSoFar=" << transitTime << " usecs"; } // add packet to history _sentPacketHistories[nodeUUID].packetSent(sequence, packet); - queuePacketForSending(node, packet); + queuePacketForSending(node, std::move(packet)); } }); } @@ -130,10 +127,10 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { } // Then "process" all the packable messages... - while (!_preServerPackets.empty()) { + while (!_preServerEdits.empty()) { EditMessageTuple editMessage = std::move(_preServerEdits.front()); - queueOctreeEditMessage(editMessage.first(), editMessage.second(), editMessage.third()); - _preServerPackets.pop_front(); + queueOctreeEditMessage(std::get<0>(editMessage), std::get<1>(editMessage), std::get<2>(editMessage)); + _preServerEdits.pop_front(); } _pendingPacketsLock.unlock(); @@ -153,7 +150,7 @@ void OctreeEditPacketSender::queuePendingPacketToNodes(std::unique_ptr _pendingPacketsLock.lock(); _preServerSingleMessagePackets.push_back(packet); // if we've saved MORE than our max, then clear out the oldest packet... - int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerPackets.size(); + int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerEdits.size(); if (allPendingMessages > _maxPendingMessages) { _preServerSingleMessagePackets.pop_front(); } @@ -168,7 +165,7 @@ void OctreeEditPacketSender::queuePacketToNodes(std::unique_ptr packet assert(serversExist()); // we must have jurisdictions to be here!! - const unsigned char* octCode = reinterpret_cast(packet->getPayload()) + sizeof(short) + sizeof(quint64); + const unsigned char* octCode = reinterpret_cast(packet->getPayload()) + sizeof(short) + sizeof(quint64); // We want to filter out edit messages for servers based on the server's Jurisdiction // But we can't really do that with a packed message, since each edit message could be destined @@ -190,7 +187,7 @@ void OctreeEditPacketSender::queuePacketToNodes(std::unique_ptr packet if (isMyJurisdiction) { // make a copy of this packet for this node and queue auto packetCopy = NLPacket::createCopy(packet); - queuePacketToNode(std::move(packetCopy)); + queuePacketToNode(nodeUUID, std::move(packetCopy)); } } }); @@ -213,7 +210,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi _preServerEdits.push_back(messageTuple); // if we've saved MORE than out max, then clear out the oldest packet... - int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerPackets.size(); + int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerEdits.size(); if (allPendingMessages > _maxPendingMessages) { _preServerEdits.pop_front(); } @@ -255,7 +252,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi bufferedPacket = NLPacket::create(type); } else { // If we're switching type, then we send the last one and start over - if ((type != bufferedPacket->getType() && bufferedPacket->getSizeUsed() > 0) || + if ((type != bufferedPacket->readType() && bufferedPacket->getSizeUsed() > 0) || (length >= bufferedPacket->bytesAvailable())) { // create the new packet and swap it with the packet in _pendingEditPackets @@ -263,7 +260,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi bufferedPacket.swap(packetToRelease); // release the previously buffered packet - releaseQueuedPacket(packetToRelease); + releaseQueuedPacket(nodeUUID, std::move(packetToRelease)); } } @@ -306,12 +303,10 @@ void OctreeEditPacketSender::releaseQueuedMessages() { } } -void OctreeEditPacketSender::releaseQueuedPacket(std::unique_ptr packet) { +void OctreeEditPacketSender::releaseQueuedPacket(const QUuid& nodeID, std::unique_ptr packet) { _releaseQueuedPacketMutex.lock(); - if (packetBuffer._currentSize > 0 && packetBuffer._currentType != PacketType::Unknown) { - queuePacketToNode(std::move(packet)); - packetBuffer._currentSize = 0; - packetBuffer._currentType = PacketType::Unknown; + if (packet->getSizeUsed() > 0 && packet->readType() != PacketType::Unknown) { + queuePacketToNode(nodeID, std::move(packet)); } _releaseQueuedPacketMutex.unlock(); } @@ -363,10 +358,10 @@ void OctreeEditPacketSender::processNackPacket(const QByteArray& packet) { dataAt += sizeof(unsigned short int); // retrieve packet from history - const QByteArray* packet = sentPacketHistory.getPacket(sequenceNumber); + const std::unique_ptr& packet = sentPacketHistory.getPacket(sequenceNumber); if (packet) { const SharedNodePointer& node = DependencyManager::get()->nodeWithUUID(sendingNodeUUID); - queuePacketForSending(node, *packet); + queuePacketForSending(node, NLPacket::createCopy(packet)); } } } diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index fdc4bfc189..22ad9c6679 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -29,7 +29,7 @@ public: /// Queues a single edit message. Will potentially send a pending multi-command packet. Determines which server /// node or nodes the packet should be sent to. Can be called even before servers are known, in which case up to /// MaxPendingMessages will be buffered and processed when servers are known. - void queueOctreeEditMessage(EditMessageTuple); + void queueOctreeEditMessage(PacketType::Value type, unsigned char* editPacketBuffer, size_t length); /// Releases all queued messages even if those messages haven't filled an MTU packet. This will move the packed message /// packets onto the send queue. If running in threaded mode, the caller does not need to do any further processing to @@ -82,15 +82,12 @@ public: public slots: void nodeKilled(SharedNodePointer node); -signals: - void octreePaymentRequired(qint64 satoshiAmount, const QUuid& nodeUUID, const QUuid& destinationWalletUUID); - protected: using EditMessageTuple = std::tuple; bool _shouldSend; void queuePacketToNode(const QUuid& nodeID, std::unique_ptr packet); - void queuePendingPacketToNodes(PacketType::Value type, unsigned char* buffer, size_t length); + void queuePendingPacketToNodes(std::unique_ptr packet); void queuePacketToNodes(std::unique_ptr packet); std::unique_ptr initializePacket(PacketType::Value type, int nodeClockSkew); void releaseQueuedPacket(const QUuid& nodeUUID, std::unique_ptr packetBuffer); // releases specific queued packet From 7329ad63346eb3119a38825a47d5c7ecfcd02c01 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 13:45:12 -0700 Subject: [PATCH 160/582] Templated read/write in Packet --- libraries/audio-client/src/AudioClient.cpp | 16 ++++++++-------- libraries/audio/src/AudioInjector.cpp | 8 ++++---- libraries/networking/src/Packet.cpp | 8 ++++++++ libraries/networking/src/Packet.h | 3 +++ libraries/octree/src/JurisdictionSender.cpp | 1 - 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index b7e0faaf0a..8a743ebc00 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -856,22 +856,22 @@ void AudioClient::handleAudioInput() { _audioPacket->reset(); // write sequence number - _audioPacket->write(reinterpret_cast(&_outgoingAvatarAudioSequenceNumber), sizeof(quint16)); + _audioPacket->write(_outgoingAvatarAudioSequenceNumber); if (_audioPacket->getPacketType() == PacketType::SilentAudioFrame) { // pack num silent samples quint16 numSilentSamples = numNetworkSamples; - _audioPacket->write(reinterpret_cast(&numSilentSamples), sizeof(quint16)); + _audioPacket->write(numSilentSamples); } else { // set the mono/stereo byte - _audioPacket->write(reinterpret_cast(&isStereo), sizeof(isStereo)); + _audioPacket->write(isStereo); } // pack the three float positions - _audioPacket->write(reinterpret_cast(&headPosition), sizeof(headPosition)); + _audioPacket->write(headPosition); // pack the orientation - _audioPacket->write(reinterpret_cast(&headOrientation), sizeof(headOrientation)); + _audioPacket->write(headOrientation); if (_audioPacket->getPacketType() != PacketType::SilentAudioFrame) { // audio samples have already been packed (written to networkAudioSamples) @@ -912,12 +912,12 @@ void AudioClient::sendMuteEnvironmentPacket() { auto mutePacket = NLPacket::create(PacketType::MuteEnvironment, dataSize); - float MUTE_RADIUS = 50; + const float MUTE_RADIUS = 50; glm::vec3 currentSourcePosition = _positionGetter(); - mutePacket->write(reinterpret_cast(¤tSourcePosition), sizeof(currentSourcePosition)); - mutePacket->write(reinterpret_cast(&MUTE_RADIUS), sizeof(MUTE_RADIUS)); + mutePacket->write(currentSourcePosition); + mutePacket->write(MUTE_RADIUS); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index c23b5856a6..16a5bfc5e0 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -216,17 +216,17 @@ void AudioInjector::injectToMixer() { _loudness /= (float)(bytesToCopy / sizeof(int16_t)); audioPacket->seek(positionOptionOffset); - audioPacket->write(reinterpret_cast(&_options.position), sizeof(_options.position)); - audioPacket->write(reinterpret_cast(&_options.orientation), sizeof(_options.orientation)); + audioPacket->write(_options.position); + audioPacket->write(_options.orientation); volume = MAX_INJECTOR_VOLUME * _options.volume; audioPacket->seek(volumeOptionOffset); - audioPacket->write(reinterpret_cast(&volume), sizeof(volume)); + audioPacket->write(volume); audioPacket->seek(audioDataOffset); // pack the sequence number - audioPacket->write(reinterpret_cast(&outgoingInjectedAudioSequenceNumber), sizeof(quint16)); + audioPacket->write(outgoingInjectedAudioSequenceNumber); // copy the next NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL bytes to the packet audioPacket->write(_audioData.data() + _currentSendPosition, bytesToCopy); diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index b11564428f..0a48ae9800 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -156,6 +156,14 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { &seqNum, sizeof(seqNum)); } +template qint64 Packet::read(T* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(T)); +} + +template qint64 Packet::write(const T& data) { + return QIODevice::write(reinterpret_cast(&data), sizeof(T)); +} + static const qint64 PACKET_WRITE_ERROR = -1; qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 471237b212..f05feab2ea 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -59,6 +59,9 @@ public: virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } virtual qint64 size() const { return _capacity; } + template qint64 read(T* data); + template qint64 write(const T& data); + protected: Packet(PacketType::Value type, int64_t size); Packet(const Packet& other); diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index 9493061354..b3c9794fcf 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -28,7 +28,6 @@ JurisdictionSender::JurisdictionSender(JurisdictionMap* map, NodeType_t type) : JurisdictionSender::~JurisdictionSender() { } - void JurisdictionSender::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { if (packetTypeForPacket(packet) == PacketType::JurisdictionRequest) { if (sendingNode) { From fa71c781f49ea51a7fb8661446ecb72323d96c75 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:12:04 -0700 Subject: [PATCH 161/582] cleanup edit message memory management in octree packet sending --- .../entities/src/EntityEditPacketSender.cpp | 27 +- .../entities/src/EntityEditPacketSender.h | 2 +- libraries/entities/src/EntityItem.cpp | 96 +++---- libraries/entities/src/EntityItem.h | 20 +- .../entities/src/EntityItemProperties.cpp | 262 +++++++++--------- libraries/entities/src/EntityItemProperties.h | 12 +- .../octree/src/OctreeEditPacketSender.cpp | 22 +- libraries/octree/src/OctreeEditPacketSender.h | 9 +- 8 files changed, 223 insertions(+), 227 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index f228467316..0faba6541c 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -18,31 +18,28 @@ #include "EntityItem.h" -void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, - unsigned char* editBuffer, size_t length, int clockSkew) { - +void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew) { + if (type == PacketType::EntityAdd || type == PacketType::EntityEdit) { - EntityItem::adjustEditPacketForClockSkew(editBuffer, length, clockSkew); + EntityItem::adjustEditPacketForClockSkew(buffer, clockSkew); } } -void EntityEditPacketSender::queueEditEntityMessage(PacketType::Value type, EntityItemID modelID, +void EntityEditPacketSender::queueEditEntityMessage(PacketType::Value type, EntityItemID modelID, const EntityItemProperties& properties) { if (!_shouldSend) { return; // bail early } - // use MAX_PACKET_SIZE since it's static and guaranteed to be larger than _maxPacketSize - unsigned char bufferOut[MAX_PACKET_SIZE]; - int sizeOut = 0; + QByteArray bufferOut(NLPacket::maxPayloadSize(type), 0); - if (EntityItemProperties::encodeEntityEditPacket(type, modelID, properties, &bufferOut[0], _maxPacketSize, sizeOut)) { + if (EntityItemProperties::encodeEntityEditPacket(type, modelID, properties, bufferOut)) { #ifdef WANT_DEBUG qCDebug(entities) << "calling queueOctreeEditMessage()..."; qCDebug(entities) << " id:" << modelID; qCDebug(entities) << " properties:" << properties; #endif - queueOctreeEditMessage(type, bufferOut, sizeOut); + queueOctreeEditMessage(type, bufferOut); } } @@ -50,10 +47,10 @@ void EntityEditPacketSender::queueEraseEntityMessage(const EntityItemID& entityI if (!_shouldSend) { return; // bail early } - // use MAX_PACKET_SIZE since it's static and guaranteed to be larger than _maxPacketSize - unsigned char bufferOut[MAX_PACKET_SIZE]; - size_t sizeOut = 0; - if (EntityItemProperties::encodeEraseEntityMessage(entityItemID, &bufferOut[0], _maxPacketSize, sizeOut)) { - queueOctreeEditMessage(PacketType::EntityErase, bufferOut, sizeOut); + + QByteArray bufferOut(NLPacket::maxPayloadSize(PacketType::EntityErase), 0); + + if (EntityItemProperties::encodeEraseEntityMessage(entityItemID, bufferOut)) { + queueOctreeEditMessage(PacketType::EntityErase, bufferOut); } } diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index ce88f41b04..63c2d8e81b 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -30,6 +30,6 @@ public: // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } - virtual void adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew); + virtual void adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew); }; #endif // hifi_EntityEditPacketSender_h diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 6559289e33..d7fbec715d 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -99,7 +99,7 @@ EntityItem::~EntityItem() { clearActions(simulation); } - // these pointers MUST be correct at delete, else we probably have a dangling backpointer + // these pointers MUST be correct at delete, else we probably have a dangling backpointer // to this EntityItem in the corresponding data structure. assert(!_simulated); assert(!_element); @@ -142,7 +142,7 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param return requestedProperties; } -OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packetData, EncodeBitstreamParams& params, +OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packetData, EncodeBitstreamParams& params, EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData) const { // ALL this fits... // object ID [16 bytes] @@ -151,7 +151,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet // ByteCountCoded(last_edited to last_updated delta) [~1-8 bytes] // PropertyFlags<>( everything ) [1-2 bytes] // ~27-35 bytes... - + OctreeElement::AppendState appendState = OctreeElement::COMPLETED; // assume the best // encode our ID as a byte count coded byte stream @@ -189,7 +189,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet #ifdef WANT_DEBUG float editedAgo = getEditedAgo(); QString agoAsString = formatSecondsElapsed(editedAgo); - qCDebug(entities) << "Writing entity " << getEntityItemID() << " to buffer, lastEdited =" << lastEdited + qCDebug(entities) << "Writing entity " << getEntityItemID() << " to buffer, lastEdited =" << lastEdited << " ago=" << editedAgo << "seconds - " << agoAsString; #endif @@ -221,7 +221,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet if (successLastUpdatedFits) { successLastSimulatedFits = packetData->appendRawData(encodedSimulatedDelta); } - + if (successLastSimulatedFits) { propertyFlagsOffset = packetData->getUncompressedByteOffset(); encodedPropertyFlags = propertyFlags; @@ -229,7 +229,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet successPropertyFlagsFits = packetData->appendRawData(encodedPropertyFlags); } - bool headerFits = successIDFits && successTypeFits && successCreatedFits && successLastEditedFits + bool headerFits = successIDFits && successTypeFits && successCreatedFits && successLastEditedFits && successLastUpdatedFits && successPropertyFlagsFits; int startOfEntityItemData = packetData->getUncompressedByteOffset(); @@ -286,9 +286,9 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet int endOfEntityItemData = packetData->getUncompressedByteOffset(); encodedPropertyFlags = propertyFlags; int newPropertyFlagsLength = encodedPropertyFlags.length(); - packetData->updatePriorBytes(propertyFlagsOffset, + packetData->updatePriorBytes(propertyFlagsOffset, (const unsigned char*)encodedPropertyFlags.constData(), encodedPropertyFlags.length()); - + // if the size of the PropertyFlags shrunk, we need to shift everything down to front of packet. if (newPropertyFlagsLength < oldPropertyFlagsLength) { int oldSize = packetData->getUncompressedSize(); @@ -302,13 +302,13 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet } else { assert(newPropertyFlagsLength == oldPropertyFlagsLength); // should not have grown } - + packetData->endLevel(entityLevel); } else { packetData->discardLevel(entityLevel); appendState = OctreeElement::NONE; // if we got here, then we didn't include the item } - + // If any part of the model items didn't fit, then the element is considered partial if (appendState != OctreeElement::COMPLETED) { // add this item into our list for the next appendElementData() pass @@ -338,7 +338,7 @@ int EntityItem::expectedBytes() { // clients use this method to unpack FULL updates from entity-server int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args) { if (args.bitstreamVersion < VERSION_ENTITIES_SUPPORT_SPLIT_MTU) { - + // NOTE: This shouldn't happen. The only versions of the bit stream that didn't support split mtu buffers should // be handled by the model subclass and shouldn't call this routine. qCDebug(entities) << "EntityItem::readEntityDataFromBuffer()... " @@ -373,7 +373,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef _id = QUuid::fromRfc4122(encodedID); dataAt += encodedID.size(); bytesRead += encodedID.size(); - + // type QByteArray encodedType = originalDataBuffer.mid(bytesRead); // maximum possible size ByteCountCoded typeCoder = encodedType; @@ -671,7 +671,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef const QUuid& myNodeID = nodeList->getSessionUUID(); if (overwriteLocalData) { if (!_simulationOwner.matchesValidID(myNodeID)) { - + _lastSimulated = now; } } @@ -688,8 +688,8 @@ void EntityItem::debugDump() const { } // adjust any internal timestamps to fix clock skew for this server -void EntityItem::adjustEditPacketForClockSkew(unsigned char* editPacketBuffer, size_t length, int clockSkew) { - unsigned char* dataAt = editPacketBuffer; +void EntityItem::adjustEditPacketForClockSkew(QByteArray& buffer, int clockSkew) { + unsigned char* dataAt = reinterpret_cast(buffer.data()); int octets = numberOfThreeBitSectionsInCode(dataAt); int lengthOfOctcode = bytesRequiredForCodeLength(octets); dataAt += lengthOfOctcode; @@ -734,7 +734,7 @@ void EntityItem::setMass(float mass) { // Setting the mass actually changes the _density (at fixed volume), however // we must protect the density range to help maintain stability of physics simulation // therefore this method might not accept the mass that is supplied. - + float volume = _volumeMultiplier * getDimensions().x * getDimensions().y * getDimensions().z; // compute new density @@ -830,7 +830,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed, bool setFlags) { rotation = glm::normalize(dQ * rotation); dt -= PHYSICS_ENGINE_FIXED_SUBSTEP; } - // NOTE: this final partial substep can drift away from a real Bullet simulation however + // NOTE: this final partial substep can drift away from a real Bullet simulation however // it only becomes significant for rapidly rotating objects // (e.g. around PI/4 radians per substep, or 7.5 rotations/sec at 60 substeps/sec). glm::quat dQ = computeBulletRotationStep(_angularVelocity, dt); @@ -866,7 +866,7 @@ void EntityItem::simulateKinematicMotion(float timeElapsed, bool setFlags) { qCDebug(entities) << " newPosition:" << newPosition; qCDebug(entities) << " glm::distance(newPosition, position):" << glm::distance(newPosition, position); #endif - + position = newPosition; // apply effective acceleration, which will be the same as gravity if the Entity isn't at rest. @@ -920,7 +920,7 @@ glm::vec3 EntityItem::worldToEntity(const glm::vec3& point) const { } bool EntityItem::lifetimeHasExpired() const { - return isMortal() && (getAge() > getLifetime()); + return isMortal() && (getAge() > getLifetime()); } quint64 EntityItem::getExpiry() const { @@ -934,7 +934,7 @@ EntityItemProperties EntityItem::getProperties() const { properties._created = _created; properties._type = getType(); - + COPY_ENTITY_PROPERTY_TO_PROPERTIES(simulationOwner, getSimulationOwner); COPY_ENTITY_PROPERTY_TO_PROPERTIES(position, getPosition); COPY_ENTITY_PROPERTY_TO_PROPERTIES(dimensions, getDimensions); // NOTE: radius is obsolete @@ -968,7 +968,7 @@ EntityItemProperties EntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(actionData, getActionData); properties._defaultSettings = false; - + return properties; } @@ -1089,7 +1089,7 @@ void EntityItem::setTranformToCenter(const Transform& transform) { setTransform(transform); return; } - + Transform copy = transform; copy.postTranslate(getRegistrationPoint() - ENTITY_ITEM_HALF_VEC3); // Center to position setTransform(copy); @@ -1104,8 +1104,8 @@ void EntityItem::setDimensions(const glm::vec3& value) { /// The maximum bounding cube for the entity, independent of it's rotation. /// This accounts for the registration point (upon which rotation occurs around). -/// -AACube EntityItem::getMaximumAACube() const { +/// +AACube EntityItem::getMaximumAACube() const { // * we know that the position is the center of rotation glm::vec3 centerOfRotation = getPosition(); // also where _registration point is @@ -1115,7 +1115,7 @@ AACube EntityItem::getMaximumAACube() const { glm::vec3 registrationPoint = (getDimensions() * getRegistrationPoint()); glm::vec3 registrationRemainder = (getDimensions() * (glm::vec3(1.0f, 1.0f, 1.0f) - getRegistrationPoint())); glm::vec3 furthestExtentFromRegistration = glm::max(registrationPoint, registrationRemainder); - + // * we know that if you rotate in any direction you would create a sphere // that has a radius of the length of furthest extent from registration point float radius = glm::length(furthestExtentFromRegistration); @@ -1130,8 +1130,8 @@ AACube EntityItem::getMaximumAACube() const { /// The minimum bounding cube for the entity accounting for it's rotation. /// This accounts for the registration point (upon which rotation occurs around). -/// -AACube EntityItem::getMinimumAACube() const { +/// +AACube EntityItem::getMinimumAACube() const { // _position represents the position of the registration point. glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; @@ -1142,15 +1142,15 @@ AACube EntityItem::getMinimumAACube() const { // shift the extents to be relative to the position/registration point rotatedExtentsRelativeToRegistrationPoint.shiftBy(getPosition()); - + // the cube that best encompasses extents is... AABox box(rotatedExtentsRelativeToRegistrationPoint); glm::vec3 centerOfBox = box.calcCenter(); float longestSide = box.getLargestDimension(); float halfLongestSide = longestSide / 2.0f; glm::vec3 cornerOfCube = centerOfBox - glm::vec3(halfLongestSide, halfLongestSide, halfLongestSide); - - + + // old implementation... not correct!!! return AACube(cornerOfCube, longestSide); } @@ -1158,15 +1158,15 @@ AACube EntityItem::getMinimumAACube() const { AABox EntityItem::getAABox() const { // _position represents the position of the registration point. glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; - + glm::vec3 unrotatedMinRelativeToEntity = - (getDimensions() * _registrationPoint); glm::vec3 unrotatedMaxRelativeToEntity = getDimensions() * registrationRemainder; Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(getRotation()); - + // shift the extents to be relative to the position/registration point rotatedExtentsRelativeToRegistrationPoint.shiftBy(getPosition()); - + return AABox(rotatedExtentsRelativeToRegistrationPoint); } @@ -1182,8 +1182,8 @@ AABox EntityItem::getAABox() const { // ... ((radius * 2.0f) ^2) / 3 = maxDimension ^ 2 // ... sqrt(((radius * 2.0f) ^2) / 3) = maxDimension // ... sqrt((diameter ^2) / 3) = maxDimension -// -void EntityItem::setRadius(float value) { +// +void EntityItem::setRadius(float value) { float diameter = value * 2.0f; float maxDimension = sqrt((diameter * diameter) / 3.0f); setDimensions(glm::vec3(maxDimension, maxDimension, maxDimension)); @@ -1193,7 +1193,7 @@ void EntityItem::setRadius(float value) { // ... radius = cornerToCornerLength / 2.0f // ... cornerToCornerLength = sqrt(3 x maxDimension ^ 2) // ... radius = sqrt(3 x maxDimension ^ 2) / 2.0f; -float EntityItem::getRadius() const { +float EntityItem::getRadius() const { return 0.5f * glm::length(getDimensions()); } @@ -1211,7 +1211,7 @@ void EntityItem::computeShapeInfo(ShapeInfo& info) { info.setParams(getShapeType(), 0.5f * getDimensions()); } -void EntityItem::updatePosition(const glm::vec3& value) { +void EntityItem::updatePosition(const glm::vec3& value) { auto delta = glm::distance(getPosition(), value); if (delta > IGNORE_POSITION_DELTA) { _dirtyFlags |= EntityItem::DIRTY_POSITION; @@ -1222,7 +1222,7 @@ void EntityItem::updatePosition(const glm::vec3& value) { } } -void EntityItem::updateDimensions(const glm::vec3& value) { +void EntityItem::updateDimensions(const glm::vec3& value) { auto delta = glm::distance(getDimensions(), value); if (delta > IGNORE_DIMENSIONS_DELTA) { setDimensions(value); @@ -1233,7 +1233,7 @@ void EntityItem::updateDimensions(const glm::vec3& value) { } } -void EntityItem::updateRotation(const glm::quat& rotation) { +void EntityItem::updateRotation(const glm::quat& rotation) { if (getRotation() != rotation) { setRotation(rotation); @@ -1273,7 +1273,7 @@ void EntityItem::updateMass(float mass) { } } -void EntityItem::updateVelocity(const glm::vec3& value) { +void EntityItem::updateVelocity(const glm::vec3& value) { auto delta = glm::distance(_velocity, value); if (delta > IGNORE_LINEAR_VELOCITY_DELTA) { _dirtyFlags |= EntityItem::DIRTY_LINEAR_VELOCITY; @@ -1290,7 +1290,7 @@ void EntityItem::updateVelocity(const glm::vec3& value) { } } -void EntityItem::updateDamping(float value) { +void EntityItem::updateDamping(float value) { auto clampedDamping = glm::clamp(value, 0.0f, 1.0f); if (fabsf(_damping - clampedDamping) > IGNORE_DAMPING_DELTA) { _damping = clampedDamping; @@ -1298,7 +1298,7 @@ void EntityItem::updateDamping(float value) { } } -void EntityItem::updateGravity(const glm::vec3& value) { +void EntityItem::updateGravity(const glm::vec3& value) { auto delta = glm::distance(_gravity, value); if (delta > IGNORE_GRAVITY_DELTA) { _gravity = value; @@ -1309,7 +1309,7 @@ void EntityItem::updateGravity(const glm::vec3& value) { } } -void EntityItem::updateAngularVelocity(const glm::vec3& value) { +void EntityItem::updateAngularVelocity(const glm::vec3& value) { auto delta = glm::distance(_angularVelocity, value); if (delta > IGNORE_ANGULAR_VELOCITY_DELTA) { _dirtyFlags |= EntityItem::DIRTY_ANGULAR_VELOCITY; @@ -1326,7 +1326,7 @@ void EntityItem::updateAngularVelocity(const glm::vec3& value) { } } -void EntityItem::updateAngularDamping(float value) { +void EntityItem::updateAngularDamping(float value) { auto clampedDamping = glm::clamp(value, 0.0f, 1.0f); if (fabsf(_angularDamping - clampedDamping) > IGNORE_DAMPING_DELTA) { _angularDamping = clampedDamping; @@ -1334,16 +1334,16 @@ void EntityItem::updateAngularDamping(float value) { } } -void EntityItem::updateIgnoreForCollisions(bool value) { +void EntityItem::updateIgnoreForCollisions(bool value) { if (_ignoreForCollisions != value) { - _ignoreForCollisions = value; + _ignoreForCollisions = value; _dirtyFlags |= EntityItem::DIRTY_COLLISION_GROUP; } } -void EntityItem::updateCollisionsWillMove(bool value) { +void EntityItem::updateCollisionsWillMove(bool value) { if (_collisionsWillMove != value) { - _collisionsWillMove = value; + _collisionsWillMove = value; _dirtyFlags |= EntityItem::DIRTY_MOTION_TYPE; } } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index bc8901c6b1..7efe1569d2 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -73,7 +73,7 @@ const float ACTIVATION_ANGULAR_VELOCITY_DELTA = 0.03f; /// one directly, instead you must only construct one of it's derived classes with additional features. class EntityItem { // These two classes manage lists of EntityItem pointers and must be able to cleanup pointers when an EntityItem is deleted. - // To make the cleanup robust each EntityItem has backpointers to its manager classes (which are only ever set/cleared by + // To make the cleanup robust each EntityItem has backpointers to its manager classes (which are only ever set/cleared by // the managers themselves, hence they are fiends) whose NULL status can be used to determine which managers still need to // do cleanup. friend class EntityTreeElement; @@ -161,15 +161,15 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { return 0; } - virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, + virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { return false; } // by default entity items don't add to scene - virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, + virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { } // by default entity items don't add to scene virtual void render(RenderArgs* args) { } // by default entity items don't know how to render static int expectedBytes(); - static void adjustEditPacketForClockSkew(unsigned char* codeColorBuffer, size_t length, int clockSkew); + static void adjustEditPacketForClockSkew(QByteArray& buffer, int clockSkew); // perform update virtual void update(const quint64& now) { _lastUpdated = now; } @@ -190,20 +190,20 @@ public: // attributes applicable to all entity types EntityTypes::EntityType getType() const { return _type; } - + inline glm::vec3 getCenterPosition() const { return getTransformToCenter().getTranslation(); } void setCenterPosition(const glm::vec3& position); - + const Transform getTransformToCenter() const; void setTranformToCenter(const Transform& transform); - + inline const Transform& getTransform() const { return _transform; } inline void setTransform(const Transform& transform) { _transform = transform; } - + /// Position in meters (0.0 - TREE_SCALE) inline const glm::vec3& getPosition() const { return _transform.getTranslation(); } inline void setPosition(const glm::vec3& value) { _transform.setTranslation(value); } - + inline const glm::quat& getRotation() const { return _transform.getRotation(); } inline void setRotation(const glm::quat& rotation) { _transform.setRotation(rotation); } @@ -416,7 +416,7 @@ protected: float _glowLevel; float _localRenderAlpha; float _density = ENTITY_ITEM_DEFAULT_DENSITY; // kg/m^3 - // NOTE: _volumeMultiplier is used to allow some mass properties code exist in the EntityItem base class + // NOTE: _volumeMultiplier is used to allow some mass properties code exist in the EntityItem base class // rather than in all of the derived classes. If we ever collapse these classes to one we could do it a // different way. float _volumeMultiplier = 1.0f; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 7e7b21417e..c864ed1bca 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -132,7 +132,7 @@ void EntityItemProperties::setAnimationSettings(const QString& value) { // the animations setting is a JSON string that may contain various animation settings. // if it includes fps, frameIndex, or running, those values will be parsed out and // will over ride the regular animation settings - + QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); QJsonObject settingsAsJsonObject = settingsAsJson.object(); QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); @@ -140,17 +140,17 @@ void EntityItemProperties::setAnimationSettings(const QString& value) { float fps = settingsMap["fps"].toFloat(); setAnimationFPS(fps); } - + if (settingsMap.contains("frameIndex")) { float frameIndex = settingsMap["frameIndex"].toFloat(); setAnimationFrameIndex(frameIndex); } - + if (settingsMap.contains("running")) { bool running = settingsMap["running"].toBool(); setAnimationIsPlaying(running); } - + _animationSettings = value; _animationSettingsChanged = true; } @@ -160,20 +160,20 @@ QString EntityItemProperties::getAnimationSettings() const { // if it includes fps, frameIndex, or running, those values will be parsed out and // will over ride the regular animation settings QString value = _animationSettings; - + QJsonDocument settingsAsJson = QJsonDocument::fromJson(value.toUtf8()); QJsonObject settingsAsJsonObject = settingsAsJson.object(); QVariantMap settingsMap = settingsAsJsonObject.toVariantMap(); - + QVariant fpsValue(getAnimationFPS()); settingsMap["fps"] = fpsValue; - + QVariant frameIndexValue(getAnimationFrameIndex()); settingsMap["frameIndex"] = frameIndexValue; - + QVariant runningValue(getAnimationIsPlaying()); settingsMap["running"] = runningValue; - + settingsAsJsonObject = QJsonObject::fromVariantMap(settingsMap); QJsonDocument newDocument(settingsAsJsonObject); QByteArray jsonByteArray = newDocument.toJson(QJsonDocument::Compact); @@ -194,10 +194,10 @@ void EntityItemProperties::debugDump() const { qCDebug(entities) << " _dimensions=" << getDimensions(); qCDebug(entities) << " _modelURL=" << _modelURL; qCDebug(entities) << " _compoundShapeURL=" << _compoundShapeURL; - + getAtmosphere().debugDump(); getSkybox().debugDump(); - + qCDebug(entities) << " changed properties..."; EntityPropertyFlags props = getChangedProperties(); props.debugDumpBits(); @@ -287,7 +287,7 @@ void EntityItemProperties::setBackgroundModeFromString(const QString& background EntityPropertyFlags EntityItemProperties::getChangedProperties() const { EntityPropertyFlags changedProperties; - + CHECK_PROPERTY_CHANGE(PROP_POSITION, position); CHECK_PROPERTY_CHANGE(PROP_DIMENSIONS, dimensions); CHECK_PROPERTY_CHANGE(PROP_ROTATION, rotation); @@ -357,18 +357,18 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { changedProperties += _stage.getChangedProperties(); changedProperties += _atmosphere.getChangedProperties(); changedProperties += _skybox.getChangedProperties(); - + return changedProperties; } QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool skipDefaults) const { QScriptValue properties = engine->newObject(); EntityItemProperties defaultEntityProperties; - + if (_idSet) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(id, _id.toString()); } - + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(type, EntityTypes::getEntityTypeName(_type)); COPY_PROPERTY_TO_QSCRIPTVALUE(position); COPY_PROPERTY_TO_QSCRIPTVALUE(dimensions); @@ -435,7 +435,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(marketplaceID); COPY_PROPERTY_TO_QSCRIPTVALUE(name); COPY_PROPERTY_TO_QSCRIPTVALUE(collisionSoundURL); - + COPY_PROPERTY_TO_QSCRIPTVALUE(keyLightColor); COPY_PROPERTY_TO_QSCRIPTVALUE(keyLightIntensity); COPY_PROPERTY_TO_QSCRIPTVALUE(keyLightAmbientIntensity); @@ -465,7 +465,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool sittingPoints.setProperty("length", _sittingPoints.size()); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(sittingPoints, sittingPoints); // gettable, but not settable } - + if (!skipDefaults) { AABox aaBox = getAABox(); QScriptValue boundingBox = engine->newObject(); @@ -479,16 +479,16 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool boundingBox.setProperty("dimensions", boundingBoxDimensions); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(boundingBox, boundingBox); // gettable, but not settable } - + QString textureNamesList = _textureNames.join(",\n"); if (!skipDefaults) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(originalTextures, textureNamesList); // gettable, but not settable } - + _stage.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); _atmosphere.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); _skybox.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); - + return properties; } @@ -497,7 +497,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool if (typeScriptValue.isValid()) { setType(typeScriptValue.toVariant().toString()); } - + COPY_PROPERTY_FROM_QSCRIPTVALUE(position, glmVec3, setPosition); COPY_PROPERTY_FROM_QSCRIPTVALUE(dimensions, glmVec3, setDimensions); COPY_PROPERTY_FROM_QSCRIPTVALUE(rotation, glmQuat, setRotation); @@ -549,7 +549,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID); COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName); COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionSoundURL, QString, setCollisionSoundURL); - + COPY_PROPERTY_FROM_QSCRIPTVALUE(keyLightColor, xColor, setKeyLightColor); COPY_PROPERTY_FROM_QSCRIPTVALUE(keyLightIntensity, float, setKeyLightIntensity); COPY_PROPERTY_FROM_QSCRIPTVALUE(keyLightAmbientIntensity, float, setKeyLightAmbientIntensity); @@ -615,14 +615,13 @@ void EntityItemPropertiesFromScriptValueHonorReadOnly(const QScriptValue &object // TODO: Implement support for script and visible properties. // bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, - unsigned char* bufferOut, int sizeIn, int& sizeOut) { - OctreePacketData ourDataPacket(false, sizeIn); // create a packetData object to add out packet details too. + QByteArray& buffer) { + OctreePacketData ourDataPacket(false, buffer.size()); // create a packetData object to add out packet details too. OctreePacketData* packetData = &ourDataPacket; // we want a pointer to this so we can use our APPEND_ENTITY_PROPERTY macro - + bool success = true; // assume the best OctreeElement::AppendState appendState = OctreeElement::COMPLETED; // assume the best - sizeOut = 0; - + // TODO: We need to review how jurisdictions should be handled for entities. (The old Models and Particles code // didn't do anything special for jurisdictions, so we're keeping that same behavior here.) // @@ -632,35 +631,35 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent glm::vec3 rootPosition(0); float rootScale = 0.5f; unsigned char* octcode = pointToOctalCode(rootPosition.x, rootPosition.y, rootPosition.z, rootScale); - + success = packetData->startSubTree(octcode); delete[] octcode; - + // assuming we have rome to fit our octalCode, proceed... if (success) { - + // Now add our edit content details... - + // id // encode our ID as a byte count coded byte stream QByteArray encodedID = id.toRfc4122(); // NUM_BYTES_RFC4122_UUID - + // encode our ID as a byte count coded byte stream ByteCountCoded tokenCoder; QByteArray encodedToken; - + // encode our type as a byte count coded byte stream ByteCountCoded typeCoder = (quint32)properties.getType(); QByteArray encodedType = typeCoder; - + quint64 updateDelta = 0; // this is an edit so by definition, it's update is in sync ByteCountCoded updateDeltaCoder = updateDelta; QByteArray encodedUpdateDelta = updateDeltaCoder; - + EntityPropertyFlags propertyFlags(PROP_LAST_ITEM); EntityPropertyFlags requestedProperties = properties.getChangedProperties(); EntityPropertyFlags propertiesDidntFit = requestedProperties; - + // TODO: we need to handle the multi-pass form of this, similar to how we handle entity data // // If we are being called for a subsequent pass at appendEntityData() that failed to completely encode this item, @@ -668,46 +667,46 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent //if (modelTreeElementExtraEncodeData && modelTreeElementExtraEncodeData->includedItems.contains(getEntityItemID())) { // requestedProperties = modelTreeElementExtraEncodeData->includedItems.value(getEntityItemID()); //} - + LevelDetails entityLevel = packetData->startLevel(); - + // Last Edited quint64 always first, before any other details, which allows us easy access to adjusting this // timestamp for clock skew quint64 lastEdited = properties.getLastEdited(); bool successLastEditedFits = packetData->appendValue(lastEdited); - + bool successIDFits = packetData->appendRawData(encodedID); if (successIDFits) { successIDFits = packetData->appendRawData(encodedToken); } bool successTypeFits = packetData->appendRawData(encodedType); - + // NOTE: We intentionally do not send "created" times in edit messages. This is because: // 1) if the edit is to an existing entity, the created time can not be changed // 2) if the edit is to a new entity, the created time is the last edited time - + // TODO: Should we get rid of this in this in edit packets, since this has to always be 0? bool successLastUpdatedFits = packetData->appendRawData(encodedUpdateDelta); - + int propertyFlagsOffset = packetData->getUncompressedByteOffset(); QByteArray encodedPropertyFlags = propertyFlags; int oldPropertyFlagsLength = encodedPropertyFlags.length(); bool successPropertyFlagsFits = packetData->appendRawData(encodedPropertyFlags); int propertyCount = 0; - + bool headerFits = successIDFits && successTypeFits && successLastEditedFits && successLastUpdatedFits && successPropertyFlagsFits; - + int startOfEntityItemData = packetData->getUncompressedByteOffset(); - + if (headerFits) { bool successPropertyFits; propertyFlags -= PROP_LAST_ITEM; // clear the last item for now, we may or may not set it as the actual item - + // These items would go here once supported.... // PROP_PAGED_PROPERTY, // PROP_CUSTOM_PROPERTIES_INCLUDED, - + APPEND_ENTITY_PROPERTY(PROP_SIMULATION_OWNER, properties._simulationOwner.toByteArray()); APPEND_ENTITY_PROPERTY(PROP_POSITION, properties.getPosition()); APPEND_ENTITY_PROPERTY(PROP_DIMENSIONS, properties.getDimensions()); // NOTE: PROP_RADIUS obsolete @@ -733,12 +732,12 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent APPEND_ENTITY_PROPERTY(PROP_USER_DATA, properties.getUserData()); APPEND_ENTITY_PROPERTY(PROP_HREF, properties.getHref()); APPEND_ENTITY_PROPERTY(PROP_DESCRIPTION, properties.getDescription()); - - + + if (properties.getType() == EntityTypes::Web) { APPEND_ENTITY_PROPERTY(PROP_SOURCE_URL, properties.getSourceUrl()); } - + if (properties.getType() == EntityTypes::Text) { APPEND_ENTITY_PROPERTY(PROP_TEXT, properties.getText()); APPEND_ENTITY_PROPERTY(PROP_LINE_HEIGHT, properties.getLineHeight()); @@ -746,7 +745,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_COLOR, properties.getBackgroundColor()); APPEND_ENTITY_PROPERTY(PROP_FACE_CAMERA, properties.getFaceCamera()); } - + if (properties.getType() == EntityTypes::Model) { APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, properties.getModelURL()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); @@ -758,7 +757,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent APPEND_ENTITY_PROPERTY(PROP_ANIMATION_SETTINGS, properties.getAnimationSettings()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)(properties.getShapeType())); } - + if (properties.getType() == EntityTypes::Light) { APPEND_ENTITY_PROPERTY(PROP_IS_SPOTLIGHT, properties.getIsSpotlight()); APPEND_ENTITY_PROPERTY(PROP_COLOR, properties.getColor()); @@ -766,7 +765,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent APPEND_ENTITY_PROPERTY(PROP_EXPONENT, properties.getExponent()); APPEND_ENTITY_PROPERTY(PROP_CUTOFF, properties.getCutoff()); } - + if (properties.getType() == EntityTypes::ParticleEffect) { APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FPS, properties.getAnimationFPS()); APPEND_ENTITY_PROPERTY(PROP_ANIMATION_FRAME_INDEX, properties.getAnimationFrameIndex()); @@ -781,24 +780,24 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent APPEND_ENTITY_PROPERTY(PROP_LOCAL_GRAVITY, properties.getLocalGravity()); APPEND_ENTITY_PROPERTY(PROP_PARTICLE_RADIUS, properties.getParticleRadius()); } - + if (properties.getType() == EntityTypes::Zone) { APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_COLOR, properties.getKeyLightColor()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, properties.getKeyLightIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_AMBIENT_INTENSITY, properties.getKeyLightAmbientIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, properties.getKeyLightDirection()); - + _staticStage.setProperties(properties); _staticStage.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); - + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, (uint32_t)properties.getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, properties.getCompoundShapeURL()); - + APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_MODE, (uint32_t)properties.getBackgroundMode()); - + _staticAtmosphere.setProperties(properties); _staticAtmosphere.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); - + _staticSkybox.setProperties(properties); _staticSkybox.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); } @@ -808,12 +807,12 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent APPEND_ENTITY_PROPERTY(PROP_VOXEL_DATA, properties.getVoxelData()); APPEND_ENTITY_PROPERTY(PROP_VOXEL_SURFACE_STYLE, properties.getVoxelSurfaceStyle()); } - + if (properties.getType() == EntityTypes::Line) { APPEND_ENTITY_PROPERTY(PROP_LINE_WIDTH, properties.getLineWidth()); APPEND_ENTITY_PROPERTY(PROP_LINE_POINTS, properties.getLinePoints()); } - + APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); @@ -821,62 +820,63 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent } if (propertyCount > 0) { int endOfEntityItemData = packetData->getUncompressedByteOffset(); - + encodedPropertyFlags = propertyFlags; int newPropertyFlagsLength = encodedPropertyFlags.length(); packetData->updatePriorBytes(propertyFlagsOffset, (const unsigned char*)encodedPropertyFlags.constData(), encodedPropertyFlags.length()); - + // if the size of the PropertyFlags shrunk, we need to shift everything down to front of packet. if (newPropertyFlagsLength < oldPropertyFlagsLength) { int oldSize = packetData->getUncompressedSize(); - + const unsigned char* modelItemData = packetData->getUncompressedData(propertyFlagsOffset + oldPropertyFlagsLength); int modelItemDataLength = endOfEntityItemData - startOfEntityItemData; int newEntityItemDataStart = propertyFlagsOffset + newPropertyFlagsLength; packetData->updatePriorBytes(newEntityItemDataStart, modelItemData, modelItemDataLength); - + int newSize = oldSize - (oldPropertyFlagsLength - newPropertyFlagsLength); packetData->setUncompressedSize(newSize); - + } else { assert(newPropertyFlagsLength == oldPropertyFlagsLength); // should not have grown } - + packetData->endLevel(entityLevel); } else { packetData->discardLevel(entityLevel); appendState = OctreeElement::NONE; // if we got here, then we didn't include the item } - + // If any part of the model items didn't fit, then the element is considered partial if (appendState != OctreeElement::COMPLETED) { - + // TODO: handle mechanism for handling partial fitting data! // add this item into our list for the next appendElementData() pass //modelTreeElementExtraEncodeData->includedItems.insert(getEntityItemID(), propertiesDidntFit); - + // for now, if it's not complete, it's not successful success = false; } } - + if (success) { packetData->endSubTree(); + const unsigned char* finalizedData = packetData->getFinalizedData(); - int finalizedSize = packetData->getFinalizedSize(); - if (finalizedSize <= sizeIn) { - memcpy(bufferOut, finalizedData, finalizedSize); - sizeOut = finalizedSize; + int finalizedSize = packetData->getFinalizedSize(); + + if (finalizedSize <= buffer.size()) { + buffer.replace(0, finalizedSize, finalizedData, finalizedSize); + buffer.resize(finalizedSize); } else { qCDebug(entities) << "ERROR - encoded edit message doesn't fit in output buffer."; - sizeOut = 0; success = false; } } else { packetData->discardSubTree(); - sizeOut = 0; } + return success; } @@ -899,19 +899,19 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes, EntityItemID& entityID, EntityItemProperties& properties) { bool valid = false; - + const unsigned char* dataAt = data; processedBytes = 0; - + // the first part of the data is an octcode, this is a required element of the edit packet format, but we don't // actually use it, we do need to skip it and read to the actual data we care about. int octets = numberOfThreeBitSectionsInCode(data); int bytesToReadOfOctcode = bytesRequiredForCodeLength(octets); - + // we don't actually do anything with this octcode... dataAt += bytesToReadOfOctcode; processedBytes += bytesToReadOfOctcode; - + // Edit packets have a last edited time stamp immediately following the octcode. // NOTE: the edit times have been set by the editor to match out clock, so we don't need to adjust // these times for clock skew at this point. @@ -920,20 +920,20 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int dataAt += sizeof(lastEdited); processedBytes += sizeof(lastEdited); properties.setLastEdited(lastEdited); - + // NOTE: We intentionally do not send "created" times in edit messages. This is because: // 1) if the edit is to an existing entity, the created time can not be changed // 2) if the edit is to a new entity, the created time is the last edited time - + // encoded id QByteArray encodedID((const char*)dataAt, NUM_BYTES_RFC4122_UUID); // maximum possible size QUuid editID = QUuid::fromRfc4122(encodedID); dataAt += encodedID.size(); processedBytes += encodedID.size(); - + entityID = editID; valid = true; - + // Entity Type... QByteArray encodedType((const char*)dataAt, (bytesToRead - processedBytes)); ByteCountCoded typeCoder = encodedType; @@ -942,22 +942,22 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int encodedType = typeCoder; // determine true bytesToRead dataAt += encodedType.size(); processedBytes += encodedType.size(); - + // Update Delta - when was this item updated relative to last edit... this really should be 0 // TODO: Should we get rid of this in this in edit packets, since this has to always be 0? // TODO: do properties need to handle lastupdated??? - + // last updated is stored as ByteCountCoded delta from lastEdited QByteArray encodedUpdateDelta((const char*)dataAt, (bytesToRead - processedBytes)); ByteCountCoded updateDeltaCoder = encodedUpdateDelta; encodedUpdateDelta = updateDeltaCoder; // determine true bytesToRead dataAt += encodedUpdateDelta.size(); processedBytes += encodedUpdateDelta.size(); - + // TODO: Do we need this lastUpdated?? We don't seem to use it. //quint64 updateDelta = updateDeltaCoder; //quint64 lastUpdated = lastEdited + updateDelta; // don't adjust for clock skew since we already did that for lastEdited - + // Property Flags... QByteArray encodedPropertyFlags((const char*)dataAt, (bytesToRead - processedBytes)); EntityPropertyFlags propertyFlags = encodedPropertyFlags; @@ -989,12 +989,12 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_USER_DATA, QString, setUserData); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_HREF, QString, setHref); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_DESCRIPTION, QString, setDescription); - - + + if (properties.getType() == EntityTypes::Web) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SOURCE_URL, QString, setSourceUrl); } - + if (properties.getType() == EntityTypes::Text) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXT, QString, setText); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_HEIGHT, float, setLineHeight); @@ -1002,7 +1002,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_COLOR, xColor, setBackgroundColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_FACE_CAMERA, bool, setFaceCamera); } - + if (properties.getType() == EntityTypes::Model) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MODEL_URL, QString, setModelURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); @@ -1014,7 +1014,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); } - + if (properties.getType() == EntityTypes::Light) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_IS_SPOTLIGHT, bool, setIsSpotlight); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLOR, xColor, setColor); @@ -1022,14 +1022,14 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EXPONENT, float, setExponent); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CUTOFF, float, setCutoff); } - + if (properties.getType() == EntityTypes::ParticleEffect) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FPS, float, setAnimationFPS); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_FRAME_INDEX, float, setAnimationFrameIndex); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_PLAYING, bool, setAnimationIsPlaying); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ANIMATION_SETTINGS, QString, setAnimationSettings); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_TEXTURES, QString, setTextures); - + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MAX_PARTICLES, float, setMaxParticles); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIFESPAN, float, setLifespan); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EMIT_RATE, float, setEmitRate); @@ -1038,15 +1038,15 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LOCAL_GRAVITY, float, setLocalGravity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_PARTICLE_RADIUS, float, setParticleRadius); } - + if (properties.getType() == EntityTypes::Zone) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEYLIGHT_COLOR, xColor, setKeyLightColor); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEYLIGHT_INTENSITY, float, setKeyLightIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEYLIGHT_AMBIENT_INTENSITY, float, setKeyLightAmbientIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEYLIGHT_DIRECTION, glm::vec3, setKeyLightDirection); - + properties.getStage().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); - + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_MODE, BackgroundMode, setBackgroundMode); @@ -1059,12 +1059,12 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_DATA, QByteArray, setVoxelData); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_VOXEL_SURFACE_STYLE, uint16_t, setVoxelSurfaceStyle); } - + if (properties.getType() == EntityTypes::Line) { READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_WIDTH, float, setLineWidth); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LINE_POINTS, QVector, setLinePoints); } - + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); @@ -1077,28 +1077,28 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int // NOTE: This version will only encode the portion of the edit message immediately following the // header it does not include the send times and sequence number because that is handled by the // edit packet sender... -bool EntityItemProperties::encodeEraseEntityMessage(const EntityItemID& entityItemID, - unsigned char* outputBuffer, size_t maxLength, size_t& outputLength) { - - unsigned char* copyAt = outputBuffer; +bool EntityItemProperties::encodeEraseEntityMessage(const EntityItemID& entityItemID, QByteArray& buffer) { + + char* copyAt = buffer.data(); uint16_t numberOfIds = 1; // only one entity ID in this message - - if (maxLength < sizeof(numberOfIds) + NUM_BYTES_RFC4122_UUID) { + + int outputLength = 0; + + if (buffer.size() < sizeof(numberOfIds) + NUM_BYTES_RFC4122_UUID) { qCDebug(entities) << "ERROR - encodeEraseEntityMessage() called with buffer that is too small!"; - outputLength = 0; return false; } + memcpy(copyAt, &numberOfIds, sizeof(numberOfIds)); copyAt += sizeof(numberOfIds); outputLength = sizeof(numberOfIds); - - QUuid entityID = entityItemID; - QByteArray encodedEntityID = entityID.toRfc4122(); - - memcpy(copyAt, encodedEntityID.constData(), NUM_BYTES_RFC4122_UUID); + + memcpy(copyAt, entityItemID.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); copyAt += NUM_BYTES_RFC4122_UUID; outputLength += NUM_BYTES_RFC4122_UUID; - + + buffer.resize(outputLength); + return true; } @@ -1137,19 +1137,19 @@ void EntityItemProperties::markAllChanged() { _isSpotlightChanged = true; _ignoreForCollisionsChanged = true; _collisionsWillMoveChanged = true; - + _intensityChanged = true; _exponentChanged = true; _cutoffChanged = true; _lockedChanged = true; _texturesChanged = true; - + _textChanged = true; _lineHeightChanged = true; _textColorChanged = true; _backgroundColorChanged = true; _shapeTypeChanged = true; - + _maxParticlesChanged = true; _lifespanChanged = true; _emitRateChanged = true; @@ -1157,24 +1157,24 @@ void EntityItemProperties::markAllChanged() { _emitStrengthChanged = true; _localGravityChanged = true; _particleRadiusChanged = true; - + _marketplaceIDChanged = true; - + _keyLightColorChanged = true; _keyLightIntensityChanged = true; _keyLightAmbientIntensityChanged = true; _keyLightDirectionChanged = true; - + _backgroundModeChanged = true; _stage.markAllChanged(); _atmosphere.markAllChanged(); _skybox.markAllChanged(); - + _sourceUrlChanged = true; _voxelVolumeSizeChanged = true; _voxelDataChanged = true; _voxelSurfaceStyleChanged = true; - + _lineWidthChanged = true; _linePointsChanged = true; @@ -1190,40 +1190,40 @@ void EntityItemProperties::markAllChanged() { AACube EntityItemProperties::getMaximumAACube() const { // * we know that the position is the center of rotation glm::vec3 centerOfRotation = _position; // also where _registration point is - + // * we know that the registration point is the center of rotation // * we can calculate the length of the furthest extent from the registration point // as the dimensions * max (registrationPoint, (1.0,1.0,1.0) - registrationPoint) glm::vec3 registrationPoint = (_dimensions * _registrationPoint); glm::vec3 registrationRemainder = (_dimensions * (glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint)); glm::vec3 furthestExtentFromRegistration = glm::max(registrationPoint, registrationRemainder); - + // * we know that if you rotate in any direction you would create a sphere // that has a radius of the length of furthest extent from registration point float radius = glm::length(furthestExtentFromRegistration); - + // * we know that the minimum bounding cube of this maximum possible sphere is // (center - radius) to (center + radius) glm::vec3 minimumCorner = centerOfRotation - glm::vec3(radius, radius, radius); float diameter = radius * 2.0f; - + return AACube(minimumCorner, diameter); } // The minimum bounding box for the entity. AABox EntityItemProperties::getAABox() const { - + // _position represents the position of the registration point. glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; - + glm::vec3 unrotatedMinRelativeToEntity = - (_dimensions * _registrationPoint); glm::vec3 unrotatedMaxRelativeToEntity = _dimensions * registrationRemainder; Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(getRotation()); - + // shift the extents to be relative to the position/registration point rotatedExtentsRelativeToRegistrationPoint.shiftBy(_position); - + return AABox(rotatedExtentsRelativeToRegistrationPoint); } @@ -1233,7 +1233,7 @@ bool EntityItemProperties::hasTerseUpdateChanges() const { } bool EntityItemProperties::hasMiscPhysicsChanges() const { - return _gravityChanged || _dimensionsChanged || _densityChanged || _frictionChanged + return _gravityChanged || _dimensionsChanged || _densityChanged || _frictionChanged || _restitutionChanged || _dampingChanged || _angularDampingChanged || _registrationPointChanged || _compoundShapeURLChanged || _collisionsWillMoveChanged || _ignoreForCollisionsChanged; } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 8bc932c0ed..34c15043c0 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -175,11 +175,9 @@ public: void setLocalRenderAlpha(float value) { _localRenderAlpha = value; _localRenderAlphaChanged = true; } static bool encodeEntityEditPacket(PacketType::Value command, EntityItemID id, const EntityItemProperties& properties, - unsigned char* bufferOut, int sizeIn, int& sizeOut); - - static bool encodeEraseEntityMessage(const EntityItemID& entityItemID, - unsigned char* outputBuffer, size_t maxLength, size_t& outputLength); + QByteArray& buffer); + static bool encodeEraseEntityMessage(const EntityItemID& entityItemID, QByteArray& buffer); static bool decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes, EntityItemID& entityID, EntityItemProperties& properties); @@ -201,7 +199,7 @@ public: QString getSimulatorIDAsString() const { return _simulationOwner.getID().toString().mid(1,36).toUpper(); } void setVoxelDataDirty() { _voxelDataChanged = true; } - + void setLinePointsDirty() {_linePointsChanged = true; } void setCreated(QDateTime& v); @@ -244,12 +242,12 @@ void EntityItemPropertiesFromScriptValueHonorReadOnly(const QScriptValue &object // define these inline here so the macros work -inline void EntityItemProperties::setPosition(const glm::vec3& value) +inline void EntityItemProperties::setPosition(const glm::vec3& value) { _position = glm::clamp(value, 0.0f, (float)TREE_SCALE); _positionChanged = true; } inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { debug << "EntityItemProperties[" << "\n"; - + debug << " _type:" << properties.getType() << "\n"; // TODO: figure out why position and animationSettings don't seem to like the macro approach diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 77bc6a9c70..1b3008d4e7 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -128,8 +128,8 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { // Then "process" all the packable messages... while (!_preServerEdits.empty()) { - EditMessageTuple editMessage = std::move(_preServerEdits.front()); - queueOctreeEditMessage(std::get<0>(editMessage), std::get<1>(editMessage), std::get<2>(editMessage)); + EditMessagePair& editMessage = _preServerEdits.front(); + queueOctreeEditMessage(editMessage.first, editMessage.second); _preServerEdits.pop_front(); } @@ -194,8 +194,8 @@ void OctreeEditPacketSender::queuePacketToNodes(std::unique_ptr packet } -// NOTE: editPacketBuffer - is JUST the octcode/color and does not contain the packet header! -void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsigned char* editPacketBuffer, size_t length) { +// NOTE: editMessage - is JUST the octcode/color and does not contain the packet header +void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, QByteArray& editMessage) { if (!_shouldSend) { return; // bail early @@ -205,9 +205,10 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi // jurisdictions for processing if (!serversExist()) { if (_maxPendingMessages > 0) { - EditMessageTuple messageTuple { type, editPacketBuffer, length }; + EditMessagePair messagePair { type, QByteArray(editMessage) }; + _pendingPacketsLock.lock(); - _preServerEdits.push_back(messageTuple); + _preServerEdits.push_back(messagePair); // if we've saved MORE than out max, then clear out the oldest packet... int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerEdits.size(); @@ -239,7 +240,8 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi _serverJurisdictions->lockForRead(); if ((*_serverJurisdictions).find(nodeUUID) != (*_serverJurisdictions).end()) { const JurisdictionMap& map = (*_serverJurisdictions)[nodeUUID]; - isMyJurisdiction = (map.isMyJurisdiction(editPacketBuffer, CHECK_NODE_ONLY) == JurisdictionMap::WITHIN); + isMyJurisdiction = (map.isMyJurisdiction(reinterpret_cast(editMessage.data()), + CHECK_NODE_ONLY) == JurisdictionMap::WITHIN); } else { isMyJurisdiction = false; } @@ -253,7 +255,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi } else { // If we're switching type, then we send the last one and start over if ((type != bufferedPacket->readType() && bufferedPacket->getSizeUsed() > 0) || - (length >= bufferedPacket->bytesAvailable())) { + (editMessage.size() >= bufferedPacket->bytesAvailable())) { // create the new packet and swap it with the packet in _pendingEditPackets auto packetToRelease = initializePacket(type, node->getClockSkewUsec()); @@ -269,10 +271,10 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, unsi // We call this virtual function that allows our specific type of EditPacketSender to // fixup the buffer for any clock skew if (node->getClockSkewUsec() != 0) { - adjustEditPacketForClockSkew(type, editPacketBuffer, length, node->getClockSkewUsec()); + adjustEditPacketForClockSkew(type, editMessage, node->getClockSkewUsec()); } - bufferedPacket->write(reinterpret_cast(editPacketBuffer), length); + bufferedPacket->write(editMessage); } } }); diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 22ad9c6679..9a54e76aea 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -29,7 +29,7 @@ public: /// Queues a single edit message. Will potentially send a pending multi-command packet. Determines which server /// node or nodes the packet should be sent to. Can be called even before servers are known, in which case up to /// MaxPendingMessages will be buffered and processed when servers are known. - void queueOctreeEditMessage(PacketType::Value type, unsigned char* editPacketBuffer, size_t length); + void queueOctreeEditMessage(PacketType::Value type, QByteArray& editMessage); /// Releases all queued messages even if those messages haven't filled an MTU packet. This will move the packed message /// packets onto the send queue. If running in threaded mode, the caller does not need to do any further processing to @@ -74,8 +74,7 @@ public: // you must override these... virtual char getMyNodeType() const = 0; - virtual void adjustEditPacketForClockSkew(PacketType::Value type, - unsigned char* editPacketBuffer, size_t length, int clockSkew) { } + virtual void adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew) { } void processNackPacket(const QByteArray& packet); @@ -83,7 +82,7 @@ public slots: void nodeKilled(SharedNodePointer node); protected: - using EditMessageTuple = std::tuple; + using EditMessagePair = std::pair; bool _shouldSend; void queuePacketToNode(const QUuid& nodeID, std::unique_ptr packet); @@ -102,7 +101,7 @@ protected: bool _releaseQueuedMessagesPending; QMutex _pendingPacketsLock; QMutex _packetsQueueLock; // don't let different threads release the queue while another thread is writing to it - std::list _preServerEdits; // these will get packed into other larger packets + std::list _preServerEdits; // these will get packed into other larger packets std::list> _preServerSingleMessagePackets; // these will go out as is NodeToJurisdictionMap* _serverJurisdictions; From d8b03189e3fa1958adcbb2c5303704207e460ad4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:21:26 -0700 Subject: [PATCH 162/582] fixes for writes with new API --- libraries/networking/src/LimitedNodeList.cpp | 4 +- libraries/networking/src/NodeList.cpp | 4 +- libraries/octree/src/JurisdictionMap.cpp | 66 +++++++++---------- .../octree/src/OctreeEditPacketSender.cpp | 2 +- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index aef732e5e1..d0aa260bd6 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -559,7 +559,7 @@ std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUui auto icePingPacket = NLPacket::create(PacketType::ICEPing, packetSize); icePingPacket->write(iceID.toRfc4122()); - icePingPacket->write(reinterpret_cast(&pingType), sizeof(pingType)); + icePingPacket->write(pingType); return icePingPacket; } @@ -575,7 +575,7 @@ std::unique_ptr constructICEPingReplyPacket(const QByteArray& pingPack // pack the ICE ID and then the ping type icePingReplyPacket->write(iceID.toRfc4122()); - icePingReplyPacket->write(reinterpret_cast(&pingType), sizeof(pingType)); + icePingReplyPacket->write(pingType); return icePingReplyPacket; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 0d81fb89a3..948a2a16d7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -400,9 +400,9 @@ void NodeList::sendDSPathQuery(const QString& newPath) { // get the size of the UTF8 representation of the desired path qint64 numPathBytes = pathQueryUTF8.size(); - if (numPathBytes + sizeof(numPathBytes) < pathQueryPacket->bytesAvailable()) { + if (numPathBytes + ((qint64) sizeof(numPathBytes)) < pathQueryPacket->bytesAvailable()) { // append the size of the path to the query packet - pathQueryPacket->write(reinterpret_cast(&numPathBytes), sizeof(numPathBytes)); + pathQueryPacket->write(numPathBytes); // append the path itself to the query packet pathQueryPacket->write(pathQueryUTF8); diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 3398d4b653..dca33287db 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -24,7 +24,7 @@ // standard assignment -// copy assignment +// copy assignment JurisdictionMap& JurisdictionMap::operator=(const JurisdictionMap& other) { copyContents(other); return *this; @@ -63,7 +63,7 @@ void JurisdictionMap::copyContents(unsigned char* rootCodeIn, const std::vector< rootCode = new unsigned char[1]; *rootCode = 0; } - + for (size_t i = 0; i < endNodesIn.size(); i++) { if (endNodesIn[i]) { size_t bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodesIn[i])); @@ -89,7 +89,7 @@ void JurisdictionMap::clear() { delete[] _rootOctalCode; _rootOctalCode = NULL; } - + for (size_t i = 0; i < _endNodes.size(); i++) { if (_endNodes[i]) { delete[] _endNodes[i]; @@ -102,7 +102,7 @@ JurisdictionMap::JurisdictionMap(NodeType_t type) : _rootOctalCode(NULL) { _nodeType = type; unsigned char* rootCode = new unsigned char[1]; *rootCode = 0; - + std::vector emptyEndNodes; init(rootCode, emptyEndNodes); } @@ -112,7 +112,7 @@ JurisdictionMap::JurisdictionMap(const char* filename) : _rootOctalCode(NULL) { readFromFile(filename); } -JurisdictionMap::JurisdictionMap(unsigned char* rootOctalCode, const std::vector& endNodes) +JurisdictionMap::JurisdictionMap(unsigned char* rootOctalCode, const std::vector& endNodes) : _rootOctalCode(NULL) { init(rootOctalCode, endNodes); } @@ -123,12 +123,12 @@ void myDebugoutputBits(unsigned char byte, bool withNewLine) { } else { printf("[ %d (0x%x): ", byte, byte); } - + for (int i = 0; i < 8; i++) { printf("%d", byte >> (7 - i) & 1); } printf(" ] "); - + if (withNewLine) { printf("\n"); } @@ -158,7 +158,7 @@ JurisdictionMap::JurisdictionMap(const char* rootHexCode, const char* endNodesHe qCDebug(octree, "JurisdictionMap::JurisdictionMap() _rootOctalCode=%p octalCode=", _rootOctalCode); myDebugPrintOctalCode(_rootOctalCode, true); - + QString endNodesHexStrings(endNodesHexCodes); QString delimiterPattern(","); QStringList endNodeList = endNodesHexStrings.split(delimiterPattern); @@ -167,17 +167,17 @@ JurisdictionMap::JurisdictionMap(const char* rootHexCode, const char* endNodesHe QString endNodeHexString = endNodeList.at(i); unsigned char* endNodeOctcode = hexStringToOctalCode(endNodeHexString); - + qCDebug(octree, "JurisdictionMap::JurisdictionMap() endNodeList(%d)=%s", i, endNodeHexString.toLocal8Bit().constData()); - + //printOctalCode(endNodeOctcode); _endNodes.push_back(endNodeOctcode); qCDebug(octree, "JurisdictionMap::JurisdictionMap() endNodeOctcode=%p octalCode=", endNodeOctcode); myDebugPrintOctalCode(endNodeOctcode, true); - } + } } @@ -194,7 +194,7 @@ JurisdictionMap::Area JurisdictionMap::isMyJurisdiction(const unsigned char* nod if (isAncestorOf(nodeOctalCode, _rootOctalCode)) { return ABOVE; } - + // otherwise... bool isInJurisdiction = isAncestorOf(_rootOctalCode, nodeOctalCode, childIndex); // if we're under the root, then we can't be under any of the endpoints @@ -230,7 +230,7 @@ bool JurisdictionMap::readFromFile(const char* filename) { unsigned char* octcode = hexStringToOctalCode(childValue); printOctalCode(octcode); - + _endNodes.push_back(octcode); } settings.endGroup(); @@ -241,7 +241,7 @@ void JurisdictionMap::displayDebugDetails() const { QString rootNodeValue = octalCodeToHexString(_rootOctalCode); qCDebug(octree) << "root:" << rootNodeValue; - + for (size_t i = 0; i < _endNodes.size(); i++) { QString value = octalCodeToHexString(_endNodes[i]); qCDebug(octree) << "End node[" << i << "]: " << rootNodeValue; @@ -257,7 +257,7 @@ bool JurisdictionMap::writeToFile(const char* filename) { QString rootNodeValue = octalCodeToHexString(_rootOctalCode); settings.setValue("root", rootNodeValue); - + settings.beginGroup("endNodes"); for (size_t i = 0; i < _endNodes.size(); i++) { QString key = QString("endnode%1").arg(i); @@ -270,13 +270,13 @@ bool JurisdictionMap::writeToFile(const char* filename) { std::unique_ptr JurisdictionMap::packEmptyJurisdictionIntoMessage(NodeType_t type) { int bytes = 0; - auto packet = NLPacket::create(PacketType::Jurisdiction); + auto packet = NLPacket::create(PacketType::Jurisdiction, sizeof(type) + sizeof(bytes)); // Pack the Node Type in first byte - packet->write(reinterpret_cast(&type), sizeof(type)); + packet->write(type); // No root or end node details to pack! - packet->write(reinterpret_cast(&bytes), sizeof(bytes)); - + packet->write(bytes); + return std::move(packet); // includes header! } @@ -285,18 +285,18 @@ std::unique_ptr JurisdictionMap::packIntoMessage() { // Pack the Node Type in first byte NodeType_t type = getNodeType(); - packet->write(reinterpret_cast(&type), sizeof(type)); + packet->write(type); // add the root jurisdiction if (_rootOctalCode) { size_t bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_rootOctalCode)); // No root or end node details to pack! - packet->write(reinterpret_cast(&bytes), sizeof(bytes)); + packet->write(bytes); packet->write(reinterpret_cast(_rootOctalCode), bytes); - + // if and only if there's a root jurisdiction, also include the end nodes - int endNodeCount = _endNodes.size(); - packet->write(reinterpret_cast(&endNodeCount), sizeof(endNodeCount)); + int endNodeCount = _endNodes.size(); + packet->write(endNodeCount); for (int i=0; i < endNodeCount; i++) { unsigned char* endNodeCode = _endNodes[i]; @@ -304,15 +304,15 @@ std::unique_ptr JurisdictionMap::packIntoMessage() { if (endNodeCode) { bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); } - packet->write(reinterpret_cast(&bytes), sizeof(bytes)); + packet->write(bytes); packet->write(reinterpret_cast(endNodeCode), bytes); } } else { int bytes = 0; - packet->write(reinterpret_cast(&bytes), sizeof(bytes)); + packet->write(bytes); } - - return std::move(packet); // includes header! + + return std::move(packet); } int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes) { @@ -323,7 +323,7 @@ int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int av int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(sourceBuffer)); sourceBuffer += numBytesPacketHeader; int remainingBytes = availableBytes - numBytesPacketHeader; - + // read the root jurisdiction int bytes = 0; memcpy(&bytes, sourceBuffer, sizeof(bytes)); @@ -335,7 +335,7 @@ int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int av memcpy(_rootOctalCode, sourceBuffer, bytes); sourceBuffer += bytes; remainingBytes -= bytes; - + // if and only if there's a root jurisdiction, also include the end nodes int endNodeCount = 0; memcpy(&endNodeCount, sourceBuffer, sizeof(endNodeCount)); @@ -345,13 +345,13 @@ int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int av memcpy(&bytes, sourceBuffer, sizeof(bytes)); sourceBuffer += sizeof(bytes); remainingBytes -= sizeof(bytes); - + if (bytes <= remainingBytes) { unsigned char* endNodeCode = new unsigned char[bytes]; memcpy(endNodeCode, sourceBuffer, bytes); sourceBuffer += bytes; remainingBytes -= bytes; - + // if the endNodeCode was 0 length then don't add it if (bytes > 0) { _endNodes.push_back(endNodeCode); @@ -359,6 +359,6 @@ int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int av } } } - + return sourceBuffer - startPosition; // includes header! } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 1b3008d4e7..0fb91649e9 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -321,7 +321,7 @@ std::unique_ptr OctreeEditPacketSender::initializePacket(PacketType::V // pack in timestamp quint64 now = usecTimestampNow() + nodeClockSkew; - newPacket->write(reinterpret_cast(&now), sizeof(now)); + newPacket->write(now); } bool OctreeEditPacketSender::process() { From b983f662eea9d45ee67b5dc864b632768e608c37 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:24:32 -0700 Subject: [PATCH 163/582] use templated write for sequence number in OctreeEditPacketSender --- libraries/octree/src/OctreeEditPacketSender.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 0fb91649e9..fe3f3b10a6 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -86,7 +86,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu // pack sequence number quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++; - packet->write(reinterpret_cast(&sequence), sizeof(sequence)); + packet->write(sequence); // debugging output... if (wantDebug) { From 4fe6102a7cc5f9c2fc7251887e7556fc50189b34 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:25:14 -0700 Subject: [PATCH 164/582] change readPacketType and readPacketTypeVersion --- libraries/networking/src/Packet.cpp | 42 ++++++++++++++--------------- libraries/networking/src/Packet.h | 36 ++++++++++++------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 0a48ae9800..23675dd167 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -33,7 +33,7 @@ std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { // Invalid size, return null pointer return std::unique_ptr(); } - + // allocate memory return std::unique_ptr(new Packet(type, size)); } @@ -59,10 +59,10 @@ Packet::Packet(PacketType::Value type, qint64 size) : _capacity(size) { // Sanity check Q_ASSERT(size <= maxPayloadSize(type)); - + // copy packet type and version in header writePacketTypeAndVersion(type); - + // Set control bit and sequence number to 0 if necessary if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { writeSequenceNumber(0); @@ -77,12 +77,12 @@ Packet& Packet::operator=(const Packet& other) { _packetSize = other._packetSize; _packet = std::unique_ptr(new char(_packetSize)); memcpy(_packet.get(), other._packet.get(), _packetSize); - + _payloadStart = _packet.get() + (other._payloadStart - other._packet.get()); _capacity = other._capacity; - + _sizeUsed = other._sizeUsed; - + return *this; } @@ -93,12 +93,12 @@ Packet::Packet(Packet&& other) { Packet& Packet::operator=(Packet&& other) { _packetSize = other._packetSize; _packet = std::move(other._packet); - + _payloadStart = other._payloadStart; _capacity = other._capacity; - + _sizeUsed = other._sizeUsed; - + return *this; } @@ -106,16 +106,16 @@ void Packet::setPacketType(PacketType::Value type) { auto currentHeaderSize = totalHeadersSize(); _type = type; writePacketTypeAndVersion(_type); - + // Setting new packet type with a different header size not currently supported Q_ASSERT(currentHeaderSize == totalHeadersSize()); } -PacketType::Value Packet::readPacketType() const { +PacketType::Value Packet::readType() const { return (PacketType::Value)arithmeticCodingValueFromBuffer(_packet.get()); } -PacketVersion Packet::readPacketTypeVersion() const { +PacketVersion Packet::readVersion() const { return *reinterpret_cast(_packet.get() + numBytesForArithmeticCodedPacketType(_type)); } @@ -142,7 +142,7 @@ bool Packet::readIsControlPacket() const { void Packet::writePacketTypeAndVersion(PacketType::Value type) { // Pack the packet type auto offset = packArithmeticallyCodedValue(type, _packet.get()); - + // Pack the packet version auto version = versionForPacketType(type); memcpy(_packet.get() + offset, &version, sizeof(version)); @@ -169,16 +169,16 @@ qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block if (maxSize <= bytesAvailable()) { qint64 currentPos = pos(); - + // good to go - write the data memcpy(_payloadStart + currentPos, data, maxSize); - + // seek to the new position based on where our write just finished seek(currentPos + maxSize); - + // keep track of _sizeUsed so we can just write the actual data when packet is about to be sent _sizeUsed = std::max(pos() + 1, _sizeUsed); - + // return the number of bytes written return maxSize; } else { @@ -190,16 +190,16 @@ qint64 Packet::writeData(const char* data, qint64 maxSize) { qint64 Packet::readData(char* dest, qint64 maxSize) { // we're either reading what is left from the current position or what was asked to be read qint64 numBytesToRead = std::min(bytesAvailable(), maxSize); - + if (numBytesToRead > 0) { int currentPosition = pos(); - + // read out the data memcpy(dest, _payloadStart + currentPosition, numBytesToRead); - + // seek to the end of the read seek(currentPosition + numBytesToRead); } - + return numBytesToRead; } diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index f05feab2ea..c6fd3f7021 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -21,47 +21,47 @@ class Packet : public QIODevice { public: using SequenceNumber = uint16_t; - + static std::unique_ptr create(PacketType::Value type, int64_t size = -1); // Provided for convenience, try to limit use static std::unique_ptr createCopy(const std::unique_ptr& other); - + static qint64 localHeaderSize(PacketType::Value type); static qint64 maxPayloadSize(PacketType::Value type); - + virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers virtual qint64 localHeaderSize() const; // Current level's header size - + // Payload direct access to the payload, use responsibly! char* getPayload() { return _payloadStart; } const char* getPayload() const { return _payloadStart; } - + // Return direct access to the entire packet, use responsibly! char* getData() { return _packet.get(); } const char* getData() const { return _packet.get(); } - + PacketType::Value getPacketType() const { return _type; } void setPacketType(PacketType::Value type); - + qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } // Header readers - PacketType::Value readPacketType() const; - PacketVersion readPacketTypeVersion() const; + PacketType::Value readType() const; + PacketVersion readVersion() const; SequenceNumber readSequenceNumber() const; bool readIsControlPacket() const; - + // QIODevice virtual functions // WARNING: Those methods all refer to the payload ONLY and NOT the entire packet virtual bool isSequential() const { return false; } virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } virtual qint64 size() const { return _capacity; } - + template qint64 read(T* data); template qint64 write(const T& data); - + protected: Packet(PacketType::Value type, int64_t size); Packet(const Packet& other); @@ -72,20 +72,20 @@ protected: // QIODevice virtual functions virtual qint64 writeData(const char* data, qint64 maxSize); virtual qint64 readData(char* data, qint64 maxSize); - + // Header writers void writePacketTypeAndVersion(PacketType::Value type); void writeSequenceNumber(SequenceNumber seqNum); - + PacketType::Value _type; // Packet type - + qint64 _packetSize = 0; // Total size of the allocated memory std::unique_ptr _packet; // Allocated memory - + char* _payloadStart = nullptr; // Start of the payload qint64 _capacity = 0; // Total capacity of the payload - + qint64 _sizeUsed = 0; // How much of the payload is actually used }; -#endif // hifi_Packet_h \ No newline at end of file +#endif // hifi_Packet_h From 948e8f7163665c87b6a0ae73f6e85c6a4a2a9145 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:27:16 -0700 Subject: [PATCH 165/582] actually return packet from initialize packet --- libraries/octree/src/OctreeEditPacketSender.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index fe3f3b10a6..3021661663 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -322,6 +322,8 @@ std::unique_ptr OctreeEditPacketSender::initializePacket(PacketType::V // pack in timestamp quint64 now = usecTimestampNow() + nodeClockSkew; newPacket->write(now); + + return newPacket; } bool OctreeEditPacketSender::process() { From 822dd46228d3b2c0263b579afd72f0648d680a93 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:32:20 -0700 Subject: [PATCH 166/582] use getType instead of readType in OctreeEditPacketSender --- libraries/networking/src/Packet.h | 4 ++-- libraries/octree/src/OctreeEditPacketSender.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index c6fd3f7021..500df901b6 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -40,8 +40,8 @@ public: char* getData() { return _packet.get(); } const char* getData() const { return _packet.get(); } - PacketType::Value getPacketType() const { return _type; } - void setPacketType(PacketType::Value type); + PacketType::Value getType() const { return _type; } + void setType(PacketType::Value type); qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 3021661663..3543477e0f 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -102,7 +102,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu quint64 queuedAt = usecTimestampNow(); quint64 transitTime = queuedAt - createdAt; - qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << packet->readType() + qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << packet->getType() << " - command to node bytes=" << packet->getSizeWithHeader() << " sequence=" << sequence << " transitTimeSoFar=" << transitTime << " usecs"; } @@ -148,7 +148,7 @@ void OctreeEditPacketSender::queuePendingPacketToNodes(std::unique_ptr if (_maxPendingMessages > 0) { _pendingPacketsLock.lock(); - _preServerSingleMessagePackets.push_back(packet); + _preServerSingleMessagePackets.push_back(std::move(packet)); // if we've saved MORE than our max, then clear out the oldest packet... int allPendingMessages = _preServerSingleMessagePackets.size() + _preServerEdits.size(); if (allPendingMessages > _maxPendingMessages) { @@ -254,7 +254,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, QByt bufferedPacket = NLPacket::create(type); } else { // If we're switching type, then we send the last one and start over - if ((type != bufferedPacket->readType() && bufferedPacket->getSizeUsed() > 0) || + if ((type != bufferedPacket->getType() && bufferedPacket->getSizeUsed() > 0) || (editMessage.size() >= bufferedPacket->bytesAvailable())) { // create the new packet and swap it with the packet in _pendingEditPackets @@ -307,7 +307,7 @@ void OctreeEditPacketSender::releaseQueuedMessages() { void OctreeEditPacketSender::releaseQueuedPacket(const QUuid& nodeID, std::unique_ptr packet) { _releaseQueuedPacketMutex.lock(); - if (packet->getSizeUsed() > 0 && packet->readType() != PacketType::Unknown) { + if (packet->getSizeUsed() > 0 && packet->getType() != PacketType::Unknown) { queuePacketToNode(nodeID, std::move(packet)); } _releaseQueuedPacketMutex.unlock(); From 59484fc3cf6851db54446b30e01edf32db2600a3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:33:08 -0700 Subject: [PATCH 167/582] rename setType implementation in Packet --- libraries/networking/src/Packet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 23675dd167..a7e08db1b3 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -102,7 +102,7 @@ Packet& Packet::operator=(Packet&& other) { return *this; } -void Packet::setPacketType(PacketType::Value type) { +void Packet::setType(PacketType::Value type) { auto currentHeaderSize = totalHeadersSize(); _type = type; writePacketTypeAndVersion(_type); From 3e84d4f1ed4d31e3edd8e6ecdcbce97a19d0d1d0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 14:35:56 -0700 Subject: [PATCH 168/582] Quiet an unused variable warning --- libraries/networking/src/Packet.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index a7e08db1b3..8181d8f13c 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -109,6 +109,7 @@ void Packet::setType(PacketType::Value type) { // Setting new packet type with a different header size not currently supported Q_ASSERT(currentHeaderSize == totalHeadersSize()); + Q_UNUSED(currentHeaderSize); } PacketType::Value Packet::readType() const { From 9fb43b71d4dc09699737caa17fdbb404b31bac05 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:52:14 -0700 Subject: [PATCH 169/582] use std::unordered_maps in OctreeEditPacketSender --- libraries/octree/src/OctreeEditPacketSender.cpp | 14 +++++++------- libraries/octree/src/OctreeEditPacketSender.h | 15 +++++++++++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 3543477e0f..2e60d9da67 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -296,10 +296,10 @@ void OctreeEditPacketSender::releaseQueuedMessages() { std::unique_ptr releasedPacket; // swap the null ptr with the packet we want to release - i.value().swap(releasedPacket); + i->second.swap(releasedPacket); // move and release the queued packet - releaseQueuedPacket(i.key(), std::move(releasedPacket)); + releaseQueuedPacket(i->first, std::move(releasedPacket)); } _packetsQueueLock.unlock(); } @@ -342,10 +342,10 @@ void OctreeEditPacketSender::processNackPacket(const QByteArray& packet) { QUuid sendingNodeUUID = uuidFromPacketHeader(packet); // if packet history doesn't exist for the sender node (somehow), bail - if (!_sentPacketHistories.contains(sendingNodeUUID)) { + if (_sentPacketHistories.count(sendingNodeUUID) == 0) { return; } - const SentPacketHistory& sentPacketHistory = _sentPacketHistories.value(sendingNodeUUID); + const SentPacketHistory& sentPacketHistory = _sentPacketHistories[sendingNodeUUID]; // TODO: these NAK packets no longer send the number of sequence numbers - just read out sequence numbers in blocks @@ -373,7 +373,7 @@ void OctreeEditPacketSender::processNackPacket(const QByteArray& packet) { void OctreeEditPacketSender::nodeKilled(SharedNodePointer node) { // TODO: add locks QUuid nodeUUID = node->getUUID(); - _pendingEditPackets.remove(nodeUUID); - _outgoingSequenceNumbers.remove(nodeUUID); - _sentPacketHistories.remove(nodeUUID); + _pendingEditPackets.erase(nodeUUID); + _outgoingSequenceNumbers.erase(nodeUUID); + _sentPacketHistories.erase(nodeUUID); } diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 9a54e76aea..a1ba2f0675 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -12,13 +12,20 @@ #ifndef hifi_OctreeEditPacketSender_h #define hifi_OctreeEditPacketSender_h -#include #include #include #include "JurisdictionMap.h" #include "SentPacketHistory.h" +namespace std { + template <> struct hash { + size_t operator()(const QUuid& uuid) const { + return qHash(uuid); + } + }; +} + /// Utility for processing, packing, queueing and sending of outbound edit messages. class OctreeEditPacketSender : public PacketSender { Q_OBJECT @@ -94,7 +101,7 @@ protected: void processPreServerExistsPackets(); // These are packets which are destined from know servers but haven't been released because they're still too small - QHash> _pendingEditPackets; + std::unordered_map> _pendingEditPackets; // These are packets that are waiting to be processed because we don't yet know if there are servers int _maxPendingMessages; @@ -109,7 +116,7 @@ protected: QMutex _releaseQueuedPacketMutex; // TODO: add locks for this and _pendingEditPackets - QHash _sentPacketHistories; - QHash _outgoingSequenceNumbers; + std::unordered_map _sentPacketHistories; + std::unordered_map _outgoingSequenceNumbers; }; #endif // hifi_OctreeEditPacketSender_h From 3dbe7f782767a0040ffc46637b16025e837728c0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:57:45 -0700 Subject: [PATCH 170/582] fix writes for templated API in OctreeSceneStats --- libraries/octree/src/OctreeSceneStats.cpp | 68 +++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 9141b0a989..baefe64bc6 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -384,59 +384,59 @@ void OctreeSceneStats::childBitsRemoved(bool includesExistsBits, bool includesCo int OctreeSceneStats::packIntoPacket() { _statsPacket->reset(); - _statsPacket->write(&_start, sizeof(_start)); - _statsPacket->write(&_end, sizeof(_end)); - _statsPacket->write(&_elapsed, sizeof(_elapsed)); - _statsPacket->write(&_totalEncodeTime, sizeof(_totalEncodeTime)); - _statsPacket->write(&_isFullScene, sizeof(_isFullScene)); - _statsPacket->write(&_isMoving, sizeof(_isMoving)); - _statsPacket->write(&_packets, sizeof(_packets)); - _statsPacket->write(&_bytes, sizeof(_bytes)); + _statsPacket->write(_start); + _statsPacket->write(_end); + _statsPacket->write(_elapsed); + _statsPacket->write(totalEncodeTime); + _statsPacket->write(_isFullScene); + _statsPacket->write(_isMoving); + _statsPacket->write(_packets); + _statsPacket->write(_bytes); - _statsPacket->write(&_totalInternal, sizeof(_totalInternal)); - _statsPacket->write(&_totalLeaves, sizeof(_totalLeaves)); - _statsPacket->write(&_internal, sizeof(_internal)); - _statsPacket->write(&_leaves, sizeof(_leaves)); - _statsPacket->write(&_internalSkippedDistance, sizeof(_internalSkippedDistance)); - _statsPacket->write(&_leavesSkippedDistance, sizeof(_leavesSkippedDistance)); - _statsPacket->write(&_internalSkippedOutOfView, sizeof(_internalSkippedOutOfView)); - _statsPacket->write(&_leavesSkippedOutOfView, sizeof(_leavesSkippedOutOfView)); - _statsPacket->write(&_internalSkippedWasInView, sizeof(_internalSkippedWasInView)); - _statsPacket->write(&_leavesSkippedWasInView, sizeof(_leavesSkippedWasInView)); - _statsPacket->write(&_internalSkippedNoChange, sizeof(_internalSkippedNoChange)); - _statsPacket->write(&_leavesSkippedNoChange, sizeof(_leavesSkippedNoChange)); - _statsPacket->write(&_internalSkippedOccluded, sizeof(_internalSkippedOccluded)); - _statsPacket->write(&_leavesSkippedOccluded, sizeof(_leavesSkippedOccluded)); - _statsPacket->write(&_internalColorSent, sizeof(_internalColorSent)); - _statsPacket->write(&_leavesColorSent, sizeof(_leavesColorSent)); - _statsPacket->write(&_internalDidntFit, sizeof(_internalDidntFit)); - _statsPacket->write(&_leavesDidntFit, sizeof(_leavesDidntFit)); - _statsPacket->write(&_colorBitsWritten, sizeof(_colorBitsWritten)); - _statsPacket->write(&_existsBitsWritten, sizeof(_existsBitsWritten)); - _statsPacket->write(&_existsInPacketBitsWritten, sizeof(_existsInPacketBitsWritten)); - _statsPacket->write(&_treesRemoved, sizeof(_treesRemoved)); + _statsPacket->write(_totalInternal); + _statsPacket->write(_totalLeaves); + _statsPacket->write(_internal); + _statsPacket->write(_leaves); + _statsPacket->write(_internalSkippedDistance); + _statsPacket->write(_leavesSkippedDistance); + _statsPacket->write(_internalSkippedOutOfView); + _statsPacket->write(_leavesSkippedOutOfView); + _statsPacket->write(_internalSkippedWasInView); + _statsPacket->write(_leavesSkippedWasInView); + _statsPacket->write(_internalSkippedNoChange); + _statsPacket->write(_leavesSkippedNoChange); + _statsPacket->write(_internalSkippedOccluded); + _statsPacket->write(_leavesSkippedOccluded); + _statsPacket->write(_internalColorSent); + _statsPacket->write(_leavesColorSent); + _statsPacket->write(_internalDidntFit); + _statsPacket->write(_leavesDidntFit); + _statsPacket->write(_colorBitsWritten); + _statsPacket->write(_existsBitsWritten); + _statsPacket->write(_existsInPacketBitsWritten); + _statsPacket->write(_treesRemoved); // add the root jurisdiction if (_jurisdictionRoot) { // copy the int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_jurisdictionRoot)); - _statsPacket->write(&bytes, sizeof(bytes)); + _statsPacket->write(bytes); _statsPacket->write(_jurisdictionRoot, bytes); // if and only if there's a root jurisdiction, also include the end elements int endNodeCount = _jurisdictionEndNodes.size(); - _statsPacket->write(&endNodeCount, sizeof(endNodeCount)); + _statsPacket->write(endNodeCount); for (int i=0; i < endNodeCount; i++) { unsigned char* endNodeCode = _jurisdictionEndNodes[i]; int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); - _statsPacket->write(&bytes, sizeof(bytes)); + _statsPacket->write(bytes); _statsPacket->write(endNodeCode, bytes); } } else { int bytes = 0; - _statsPacket->write(&bytes, sizeof(bytes)); + _statsPacket->write(bytes); } return _statsPacket->getSizeUsed(); From 1597491894bf45c3d6da972a7a3bc7d47379e37c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 14:58:27 -0700 Subject: [PATCH 171/582] add back missing underscore --- libraries/octree/src/OctreeSceneStats.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index baefe64bc6..7d5af6437e 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -387,7 +387,7 @@ int OctreeSceneStats::packIntoPacket() { _statsPacket->write(_start); _statsPacket->write(_end); _statsPacket->write(_elapsed); - _statsPacket->write(totalEncodeTime); + _statsPacket->write(_totalEncodeTime); _statsPacket->write(_isFullScene); _statsPacket->write(_isMoving); _statsPacket->write(_packets); From 07c8bb24b4a31fde2a6ccfbec90f0b1579a0ea72 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 15:02:02 -0700 Subject: [PATCH 172/582] fix query packet send in OctreeHeadlessViewer --- libraries/octree/src/OctreeHeadlessViewer.cpp | 58 ++++++++----------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index d7daa6e181..2a9dd1dd33 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -69,21 +69,19 @@ void OctreeHeadlessViewer::queryOctree() { _octreeQuery.setOctreeSizeScale(getVoxelSizeScale()); _octreeQuery.setBoundaryLevelAdjust(getBoundaryLevelAdjust()); - unsigned char queryPacket[MAX_PACKET_SIZE]; - // Iterate all of the nodes, and get a count of how many voxel servers we have... int totalServers = 0; int inViewServers = 0; int unknownJurisdictionServers = 0; - + DependencyManager::get()->eachNode([&](const SharedNodePointer& node){ // only send to the NodeTypes that are serverType if (node->getActiveSocket() && node->getType() == serverType) { totalServers++; - + // get the server bounds for this server QUuid nodeUUID = node->getUUID(); - + // if we haven't heard from this voxel server, go ahead and send it a query, so we // can get the jurisdiction... jurisdictions.lockForRead(); @@ -92,17 +90,17 @@ void OctreeHeadlessViewer::queryOctree() { unknownJurisdictionServers++; } else { const JurisdictionMap& map = (jurisdictions)[nodeUUID]; - + unsigned char* rootCode = map.getRootOctalCode(); - + if (rootCode) { VoxelPositionSize rootDetails; voxelDetailsForCode(rootCode, rootDetails); jurisdictions.unlock(); AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - + ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); - + if (serverFrustumLocation != ViewFrustum::OUTSIDE) { inViewServers++; } @@ -142,13 +140,13 @@ void OctreeHeadlessViewer::queryOctree() { nodeList->eachNode([&](const SharedNodePointer& node){ // only send to the NodeTypes that are serverType if (node->getActiveSocket() && node->getType() == serverType) { - + // get the server bounds for this server QUuid nodeUUID = node->getUUID(); - + bool inView = false; bool unknownView = false; - + // if we haven't heard from this voxel server, go ahead and send it a query, so we // can get the jurisdiction... jurisdictions.lockForRead(); @@ -160,15 +158,15 @@ void OctreeHeadlessViewer::queryOctree() { } } else { const JurisdictionMap& map = (jurisdictions)[nodeUUID]; - + unsigned char* rootCode = map.getRootOctalCode(); - + if (rootCode) { VoxelPositionSize rootDetails; voxelDetailsForCode(rootCode, rootDetails); jurisdictions.unlock(); AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - + ViewFrustum::location serverFrustumLocation = _viewFrustum.cubeInFrustum(serverBounds); if (serverFrustumLocation != ViewFrustum::OUTSIDE) { inView = true; @@ -182,7 +180,7 @@ void OctreeHeadlessViewer::queryOctree() { } } } - + if (inView) { _octreeQuery.setMaxQueryPacketsPerSecond(perServerPPS); if (wantExtraDebugging) { @@ -193,7 +191,7 @@ void OctreeHeadlessViewer::queryOctree() { qCDebug(octree) << "no known jurisdiction for node " << *node << ", give it budget of " << perUnknownServer << " to send us jurisdiction."; } - + // set the query's position/orientation to be degenerate in a manner that will get the scene quickly // If there's only one server, then don't do this, and just let the normal voxel query pass through // as expected... this way, we will actually get a valid scene if there is one to be seen @@ -215,19 +213,13 @@ void OctreeHeadlessViewer::queryOctree() { } else { _octreeQuery.setMaxQueryPacketsPerSecond(0); } - // set up the packet for sending... - unsigned char* endOfQueryPacket = queryPacket; - - // insert packet type/version and node UUID - endOfQueryPacket += nodeList->populatePacketHeader(reinterpret_cast(endOfQueryPacket), packetType); - - // encode the query data... - endOfQueryPacket += _octreeQuery.getBroadcastData(endOfQueryPacket); - - int packetLength = endOfQueryPacket - queryPacket; - - // make sure we still have an active socket - nodeList->writeUnverifiedDatagram(reinterpret_cast(queryPacket), packetLength, node); + + // setup the query packet + auto queryPacket = NLPacket::create(packetType); + _octreeQuery.getBroadcastData(reinterpret_cast(queryPacket->getPayload())); + + // ask the NodeList to send it + nodeList->sendPacket(std::move(queryPacket), node); } }); } @@ -239,11 +231,11 @@ int OctreeHeadlessViewer::parseOctreeStats(const QByteArray& packet, const Share int statsMessageLength = temp.unpackFromMessage(reinterpret_cast(packet.data()), packet.size()); // TODO: actually do something with these stats, like expose them to JS... - + return statsMessageLength; } -void OctreeHeadlessViewer::trackIncomingOctreePacket(const QByteArray& packet, +void OctreeHeadlessViewer::trackIncomingOctreePacket(const QByteArray& packet, const SharedNodePointer& sendingNode, bool wasStatsPacket) { - + } From ecb6309932af5e747c58dbbe0cbe839da7091a10 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 15:02:54 -0700 Subject: [PATCH 173/582] fix HEADER_LENGTH in Octree --- libraries/octree/src/Octree.cpp | 168 ++++++++++++++++---------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 6a884ec062..836c9649c1 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -190,13 +190,13 @@ bool Octree::recurseElementWithOperator(OctreeElement* element, RecurseOctreeOpe if (operatorObject->preRecursion(element)) { for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { OctreeElement* child = element->getChildAtIndex(i); - + // If there is no child at that location, the Operator may want to create a child at that location. // So give the operator a chance to do so.... if (!child) { child = operatorObject->possiblyCreateChildAt(element, i); } - + if (child) { if (!recurseElementWithOperator(child, operatorObject, recursionCount + 1)) { break; // stop recursing if operator returns false... @@ -204,7 +204,7 @@ bool Octree::recurseElementWithOperator(OctreeElement* element, RecurseOctreeOpe } } } - + return operatorObject->postRecursion(element); } @@ -282,20 +282,20 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch // give this destination element the child mask from the packet const unsigned char ALL_CHILDREN_ASSUMED_TO_EXIST = 0xFF; - + if ((size_t)bytesLeftToRead < sizeof(unsigned char)) { qCDebug(octree) << "UNEXPECTED: readElementData() only had " << bytesLeftToRead << " bytes. " "Not enough for meaningful data."; return bytesAvailable; // assume we read the entire buffer... } - + if (destinationElement->getScale() < SCALE_AT_DANGEROUSLY_DEEP_RECURSION) { - qCDebug(octree) << "UNEXPECTED: readElementData() destination element is unreasonably small [" + qCDebug(octree) << "UNEXPECTED: readElementData() destination element is unreasonably small [" << destinationElement->getScale() << " meters] " << " Discarding " << bytesAvailable << " remaining bytes."; return bytesAvailable; // assume we read the entire buffer... } - + unsigned char colorInPacketMask = *nodeData; bytesRead += sizeof(colorInPacketMask); bytesLeftToRead -= sizeof(colorInPacketMask); @@ -303,13 +303,13 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { // check the colors mask to see if we have a child to color in if (oneAtBit(colorInPacketMask, i)) { - // addChildAtIndex() should actually be called getOrAddChildAtIndex(). + // addChildAtIndex() should actually be called getOrAddChildAtIndex(). // When it adds the child it automatically sets the detinationElement dirty. OctreeElement* childElementAt = destinationElement->addChildAtIndex(i); int childElementDataRead = childElementAt->readElementDataFromBuffer(nodeData + bytesRead, bytesLeftToRead, args); childElementAt->setSourceUUID(args.sourceUUID); - + bytesRead += childElementDataRead; bytesLeftToRead -= childElementDataRead; @@ -327,7 +327,7 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch unsigned char childrenInTreeMask = ALL_CHILDREN_ASSUMED_TO_EXIST; unsigned char childInBufferMask = 0; - int bytesForMasks = args.includeExistsBits ? sizeof(childrenInTreeMask) + sizeof(childInBufferMask) + int bytesForMasks = args.includeExistsBits ? sizeof(childrenInTreeMask) + sizeof(childInBufferMask) : sizeof(childInBufferMask); if (bytesLeftToRead < bytesForMasks) { @@ -337,7 +337,7 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch } return bytesAvailable; // assume we read the entire buffer... } - + childrenInTreeMask = args.includeExistsBits ? *(nodeData + bytesRead) : ALL_CHILDREN_ASSUMED_TO_EXIST; childInBufferMask = *(nodeData + bytesRead + (args.includeExistsBits ? sizeof(childrenInTreeMask) : 0)); @@ -378,7 +378,7 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch } } } - + // if this is the root, and there is more data to read, allow it to read it's element data... if (destinationElement == _rootElement && rootElementHasData() && bytesLeftToRead > 0) { // tell the element to read the subsequent data @@ -420,13 +420,13 @@ void Octree::readBitstreamToTree(const unsigned char * bitstream, unsigned long "This buffer is corrupt. Returning."; return; } - + if (numberOfThreeBitSectionsInStream == OVERFLOWED_OCTCODE_BUFFER) { qCDebug(octree) << "UNEXPECTED: parsing of the octal code would overflow the buffer. " "This buffer is corrupt. Returning."; return; } - + int numberOfThreeBitSectionsFromNode = numberOfThreeBitSectionsInCode(bitstreamRootElement->getOctalCode()); // if the octal code returned is not on the same level as the code being searched for, we have OctreeElements to create @@ -583,11 +583,11 @@ void Octree::deleteOctalCodeFromTreeRecursion(OctreeElement* element, void* extr void Octree::eraseAllOctreeElements(bool createNewRoot) { delete _rootElement; // this will recurse and delete all children _rootElement = NULL; - + if (createNewRoot) { _rootElement = createNewElement(); } - + _isDirty = true; } @@ -678,7 +678,7 @@ OctreeElement* Octree::getOctreeElementAt(float x, float y, float z, float s) co OctreeElement* Octree::getOctreeEnclosingElementAt(float x, float y, float z, float s) const { unsigned char* octalCode = pointToOctalCode(x,y,z,s); OctreeElement* element = nodeForOctalCode(_rootElement, octalCode, NULL); - + delete[] octalCode; // cleanup memory #ifdef HAS_AUDIT_CHILDREN if (element) { @@ -713,7 +713,7 @@ public: bool findRayIntersectionOp(OctreeElement* element, void* extraData) { RayArgs* args = static_cast(extraData); bool keepSearching = true; - if (element->findRayIntersection(args->origin, args->direction, keepSearching, + if (element->findRayIntersection(args->origin, args->direction, keepSearching, args->element, args->distance, args->face, args->intersectedObject, args->precisionPicking)) { args->found = true; } @@ -723,7 +723,7 @@ bool findRayIntersectionOp(OctreeElement* element, void* extraData) { bool Octree::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, OctreeElement*& element, float& distance, BoxFace& face, void** intersectedObject, Octree::lockType lockType, bool* accurateResult, bool precisionPicking) { - RayArgs args = { origin, direction, element, distance, face, + RayArgs args = { origin, direction, element, distance, face, intersectedObject, false, precisionPicking}; distance = FLT_MAX; @@ -742,7 +742,7 @@ bool Octree::findRayIntersection(const glm::vec3& origin, const glm::vec3& direc } recurseTreeWithOperation(findRayIntersectionOp, &args); - + if (gotLock) { unlock(); } @@ -772,7 +772,7 @@ bool findSpherePenetrationOp(OctreeElement* element, void* extraData) { if (element->hasContent()) { glm::vec3 elementPenetration; if (element->findSpherePenetration(args->center, args->radius, elementPenetration, &args->penetratedObject)) { - // NOTE: it is possible for this penetration accumulation algorithm to produce a + // NOTE: it is possible for this penetration accumulation algorithm to produce a // final penetration vector with zero length. args->penetration = addPenetrations(args->penetration, elementPenetration); args->found = true; @@ -817,7 +817,7 @@ bool Octree::findSpherePenetration(const glm::vec3& center, float radius, glm::v if (gotLock) { unlock(); } - + if (accurateResult) { *accurateResult = true; // if user asked to accuracy or result, let them know this is accurate } @@ -867,14 +867,14 @@ bool findCapsulePenetrationOp(OctreeElement* element, void* extraData) { } uint qHash(const glm::vec3& point) { - // NOTE: TREE_SCALE = 16384 (15 bits) and multiplier is 1024 (11 bits), + // NOTE: TREE_SCALE = 16384 (15 bits) and multiplier is 1024 (11 bits), // so each component (26 bits) uses more than its alloted 21 bits. // however we don't expect to span huge cubes so it is ok if we wrap // (every 2^21 / 2^10 = 2048 meters). const uint BITS_PER_COMPONENT = 21; const quint64 MAX_SCALED_COMPONENT = 2097152; // 2^21 const float RESOLUTION_PER_METER = 1024.0f; // 2^10 - return qHash((quint64)(point.x * RESOLUTION_PER_METER) % MAX_SCALED_COMPONENT + + return qHash((quint64)(point.x * RESOLUTION_PER_METER) % MAX_SCALED_COMPONENT + (((quint64)(point.y * RESOLUTION_PER_METER)) % MAX_SCALED_COMPONENT << BITS_PER_COMPONENT) + (((quint64)(point.z * RESOLUTION_PER_METER)) % MAX_SCALED_COMPONENT << 2 * BITS_PER_COMPONENT)); } @@ -899,9 +899,9 @@ bool findContentInCubeOp(OctreeElement* element, void* extraData) { return false; } -bool Octree::findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, +bool Octree::findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration, Octree::lockType lockType, bool* accurateResult) { - + CapsuleArgs args = { start, end, radius, penetration, false }; penetration = glm::vec3(0.0f, 0.0f, 0.0f); @@ -920,7 +920,7 @@ bool Octree::findCapsulePenetration(const glm::vec3& start, const glm::vec3& end } recurseTreeWithOperation(findCapsulePenetrationOp, &args); - + if (gotLock) { unlock(); } @@ -967,7 +967,7 @@ OctreeElement* Octree::getElementEnclosingPoint(const glm::vec3& point, Octree:: GetElementEnclosingArgs args; args.point = point; args.element = NULL; - + bool gotLock = false; if (lockType == Octree::Lock) { lockForRead(); @@ -983,7 +983,7 @@ OctreeElement* Octree::getElementEnclosingPoint(const glm::vec3& point, Octree:: } recurseTreeWithOperation(getElementEnclosingOperation, (void*)&args); - + if (gotLock) { unlock(); } @@ -1040,7 +1040,7 @@ int Octree::encodeTreeBitstream(OctreeElement* element, params.stopReason = EncodeBitstreamParams::DIDNT_FIT; return bytesWritten; } - + bytesWritten += codeLength; // keep track of byte count int currentEncodeLevel = 0; @@ -1126,7 +1126,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, return bytesAtThisLevel; } } - + ViewFrustum::location nodeLocationThisView = ViewFrustum::INSIDE; // assume we're inside // caller can pass NULL as viewFrustum if they want everything @@ -1216,7 +1216,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, // If the user also asked for occlusion culling, check if this element is occluded, but only if it's not a leaf. // leaf occlusion is handled down below when we check child nodes if (params.wantOcclusionCulling && !element->isLeaf()) { - OctreeProjectedPolygon* voxelPolygon = + OctreeProjectedPolygon* voxelPolygon = new OctreeProjectedPolygon(params.viewFrustum->getProjectedPolygon(element->getAACube())); // In order to check occlusion culling, the shadow has to be "all in view" otherwise, we will ignore occlusion @@ -1256,13 +1256,13 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, if (params.includeExistsBits) { requiredBytes += sizeof(childrenExistInTreeBits); } - + // If this datatype allows root elements to include data, and this is the root, then ask the tree for the // minimum bytes needed for root data and reserve those also if (element == _rootElement && rootElementHasData()) { requiredBytes += minimumRequiredRootDataBytes(); } - + bool continueThisLevel = packetData->reserveBytes(requiredBytes); // If we can't reserve our minimum bytes then we can discard this level and return as if none of this level fits @@ -1327,10 +1327,10 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, OctreeElement* childElement = sortedChildren[i]; int originalIndex = indexOfChildren[i]; - bool childIsInView = (childElement && + bool childIsInView = (childElement && ( !params.viewFrustum || // no view frustum was given, everything is assumed in view (nodeLocationThisView == ViewFrustum::INSIDE) || // parent was fully in view, we can assume ALL children are - (nodeLocationThisView == ViewFrustum::INTERSECT && + (nodeLocationThisView == ViewFrustum::INTERSECT && childElement->isInView(*params.viewFrustum)) // the parent intersects and the child is in view )); @@ -1450,7 +1450,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, } } - // NOTE: the childrenDataBits indicates that there is an array of child element data included in this packet. + // NOTE: the childrenDataBits indicates that there is an array of child element data included in this packet. // We wil write this bit mask but we may come back later and update the bits that are actually included packetData->releaseReservedBytes(sizeof(childrenDataBits)); continueThisLevel = packetData->appendBitMask(childrenDataBits); @@ -1463,10 +1463,10 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, if (params.stats) { params.stats->colorBitsWritten(); // really data bits not just color bits } - + // NOW might be a good time to give our tree subclass and this element a chance to set up and check any extra encode data element->initializeExtraEncodeData(params); - + // write the child element data... NOTE: includeColor means include element data // NOTE: the format of the bitstream is generally this: // [octalcode] @@ -1486,31 +1486,31 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, // processed and sent the data bits for. Let our tree subclass determine if it really wants to send the // data for this child at this point if (childElement && element->shouldIncludeChildData(i, params)) { - + int bytesBeforeChild = packetData->getUncompressedSize(); - + // a childElement may "partially" write it's data. for example, the model server where the entire // contents of the element may be larger than can fit in a single MTU/packetData. In this case, // we want to allow the appendElementData() to respond that it produced partial data, which should be // written, but that the childElement needs to be reprocessed in an additional pass or passes // to be completed. LevelDetails childDataLevelKey = packetData->startLevel(); - + OctreeElement::AppendState childAppendState = childElement->appendElementData(packetData, params); - + // allow our tree subclass to do any additional bookkeeping it needs to do with encoded data state element->updateEncodedData(i, childAppendState, params); // Continue this level so long as some part of this child element was appended. bool childFit = (childAppendState != OctreeElement::NONE); - + // some datatypes (like Voxels) assume that all child data will fit, if it doesn't fit // the data type wants to bail on this element level completely if (!childFit && mustIncludeAllChildData()) { continueThisLevel = false; - break; + break; } - + // If the child was partially or fully appended, then mark the actualChildrenDataBits as including // this child data if (childFit) { @@ -1527,9 +1527,9 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, elementAppendState = OctreeElement::PARTIAL; params.stopReason = EncodeBitstreamParams::DIDNT_FIT; } - + int bytesAfterChild = packetData->getUncompressedSize(); - + bytesAtThisLevel += (bytesAfterChild - bytesBeforeChild); // keep track of byte count for this child // don't need to check childElement here, because we can't get here with no childElement @@ -1540,7 +1540,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, } } } - + if (!mustIncludeAllChildData() && !continueThisLevel) { qCDebug(octree) << "WARNING UNEXPECTED CASE: reached end of child element data loop with continueThisLevel=FALSE"; qCDebug(octree) << "This is not expected!!!! -- continueThisLevel=FALSE...."; @@ -1753,7 +1753,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, // If we made it this far, then we've written all of our child data... if this element is the root // element, then we also allow the root element to write out it's data... if (continueThisLevel && element == _rootElement && rootElementHasData()) { - + int bytesBeforeChild = packetData->getUncompressedSize(); // release the bytes we reserved... @@ -1772,7 +1772,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, } else { packetData->discardLevel(rootDataLevelKey); } - + if (!allOfRootFit) { elementAppendState = OctreeElement::PARTIAL; params.stopReason = EncodeBitstreamParams::DIDNT_FIT; @@ -1804,7 +1804,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, continueThisLevel = packetData->endLevel(thisLevelKey); } else { packetData->discardLevel(thisLevelKey); - + if (!mustIncludeAllChildData()) { qCDebug(octree) << "WARNING UNEXPECTED CASE: Something failed in attempting to pack this element"; qCDebug(octree) << "This is not expected!!!! -- continueThisLevel=FALSE...."; @@ -1831,7 +1831,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, params.stopReason = EncodeBitstreamParams::DIDNT_FIT; bytesAtThisLevel = 0; // didn't fit } else { - + // assuming we made it here with continueThisLevel == true, we STILL might want // to add our element back to the bag for additional encoding, specifically if // the appendState is PARTIAL, in this case, we re-add our element to the bag @@ -1841,7 +1841,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, bag.insert(element); } } - + // If our element is completed let the element know so it can do any cleanup it of extra wants if (elementAppendState == OctreeElement::COMPLETED) { element->elementEncodeComplete(params, &bag); @@ -1866,13 +1866,13 @@ bool Octree::readFromFile(const char* fileName) { emit importProgress(0); qCDebug(octree) << "Loading file" << qFileName << "..."; - + fileOk = readFromStream(fileLength, fileInputStream); emit importProgress(100); file.close(); } - + return fileOk; } @@ -1881,19 +1881,19 @@ bool Octree::readFromURL(const QString& urlString) { // determine if this is a local file or a network resource QUrl url(urlString); - + if (url.isLocalFile()) { readOk = readFromFile(qPrintable(url.toLocalFile())); } else { QNetworkRequest request; request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); request.setUrl(url); - + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(request); qCDebug(octree) << "Downloading svo at" << qPrintable(urlString); - + QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); @@ -1933,7 +1933,7 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr PacketVersion gotVersion = 0; unsigned long headerLength = 0; // bytes in the header - + bool wantImportProgress = true; PacketType::Value expectedType = expectedDataPacketType(); @@ -1944,10 +1944,10 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr if (getWantSVOfileVersions()) { // read just enough of the file to parse the header... - const unsigned long HEADER_LENGTH = sizeof(PacketType) + sizeof(PacketVersion); + const unsigned long HEADER_LENGTH = sizeof(PacketType::Value) + sizeof(PacketVersion); unsigned char fileHeader[HEADER_LENGTH]; inputStream.readRawData((char*)&fileHeader, HEADER_LENGTH); - + headerLength = HEADER_LENGTH; // we need this later to skip to the data unsigned char* dataAt = (unsigned char*)&fileHeader; @@ -1960,22 +1960,22 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr dataAt += sizeof(expectedType); dataLength -= sizeof(expectedType); gotVersion = *dataAt; - + if (gotType == expectedType) { if (canProcessVersion(gotVersion)) { dataAt += sizeof(gotVersion); dataLength -= sizeof(gotVersion); fileOk = true; - qCDebug(octree, "SVO file version match. Expected: %d Got: %d", + qCDebug(octree, "SVO file version match. Expected: %d Got: %d", versionForPacketType(expectedDataPacketType()), gotVersion); hasBufferBreaks = versionHasSVOfileBreaks(gotVersion); } else { - qCDebug(octree, "SVO file version mismatch. Expected: %d Got: %d", + qCDebug(octree, "SVO file version mismatch. Expected: %d Got: %d", versionForPacketType(expectedDataPacketType()), gotVersion); } } else { - qCDebug(octree) << "SVO file type mismatch. Expected: " << nameForPacketType(expectedType) + qCDebug(octree) << "SVO file type mismatch. Expected: " << nameForPacketType(expectedType) << " Got: " << nameForPacketType(gotType); } @@ -1983,7 +1983,7 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr qCDebug(octree) << " NOTE: this file type does not include type and version information."; fileOk = true; // assume the file is ok } - + if (hasBufferBreaks) { qCDebug(octree) << " this version includes buffer breaks"; } else { @@ -1991,18 +1991,18 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr } if (fileOk) { - + // if this version of the file does not include buffer breaks, then we need to load the entire file at once if (!hasBufferBreaks) { - + // read the entire file into a buffer, WHAT!? Why not. unsigned long dataLength = streamLength - headerLength; unsigned char* entireFileDataSection = new unsigned char[dataLength]; inputStream.readRawData((char*)entireFileDataSection, dataLength); unsigned char* dataAt = entireFileDataSection; - - ReadBitstreamToTreeParams args(WANT_COLOR, NO_EXISTS_BITS, NULL, 0, + + ReadBitstreamToTreeParams args(WANT_COLOR, NO_EXISTS_BITS, NULL, 0, SharedNodePointer(), wantImportProgress, gotVersion); readBitstreamToTree(dataAt, dataLength, args); @@ -2010,38 +2010,38 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr } else { - + unsigned long dataLength = streamLength - headerLength; unsigned long remainingLength = dataLength; const unsigned long MAX_CHUNK_LENGTH = MAX_OCTREE_PACKET_SIZE * 2; unsigned char* fileChunk = new unsigned char[MAX_CHUNK_LENGTH]; - + while (remainingLength > 0) { quint16 chunkLength = 0; inputStream.readRawData((char*)&chunkLength, sizeof(chunkLength)); remainingLength -= sizeof(chunkLength); - + if (chunkLength > remainingLength) { - qCDebug(octree) << "UNEXPECTED chunk size of:" << chunkLength + qCDebug(octree) << "UNEXPECTED chunk size of:" << chunkLength << "greater than remaining length:" << remainingLength; break; } if (chunkLength > MAX_CHUNK_LENGTH) { - qCDebug(octree) << "UNEXPECTED chunk size of:" << chunkLength + qCDebug(octree) << "UNEXPECTED chunk size of:" << chunkLength << "greater than MAX_CHUNK_LENGTH:" << MAX_CHUNK_LENGTH; break; } - + inputStream.readRawData((char*)fileChunk, chunkLength); remainingLength -= chunkLength; - + unsigned char* dataAt = fileChunk; unsigned long dataLength = chunkLength; - - ReadBitstreamToTreeParams args(WANT_COLOR, NO_EXISTS_BITS, NULL, 0, + + ReadBitstreamToTreeParams args(WANT_COLOR, NO_EXISTS_BITS, NULL, 0, SharedNodePointer(), wantImportProgress, gotVersion); readBitstreamToTree(dataAt, dataLength, args); @@ -2051,7 +2051,7 @@ bool Octree::readSVOFromStream(unsigned long streamLength, QDataStream& inputStr } } - + return fileOk; } @@ -2136,7 +2136,7 @@ void Octree::writeToSVOFile(const char* fileName, OctreeElement* element) { } else { qCDebug(octree) << " this version does not include buffer breaks"; } - + OctreeElementBag elementBag; OctreeElementExtraEncodeData extraEncodeData; @@ -2153,7 +2153,7 @@ void Octree::writeToSVOFile(const char* fileName, OctreeElement* element) { while (!elementBag.isEmpty()) { OctreeElement* subTree = elementBag.extract(); - + lockForRead(); // do tree locking down here so that we have shorter slices and less thread contention EncodeBitstreamParams params(INT_MAX, IGNORE_VIEW_FRUSTUM, WANT_COLOR, NO_EXISTS_BITS); params.extraEncodeData = &extraEncodeData; @@ -2188,7 +2188,7 @@ void Octree::writeToSVOFile(const char* fileName, OctreeElement* element) { } file.write((const char*)packetData.getFinalizedData(), packetData.getFinalizedSize()); } - + releaseSceneEncodeData(&extraEncodeData); } file.close(); From 1b5d526444540e6e0f5eb5427d55a2d891f71609 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 8 Jul 2015 15:06:50 -0700 Subject: [PATCH 174/582] Add new packet processing to AvatarManager --- interface/src/avatar/AvatarManager.cpp | 6 -- libraries/avatars/src/AvatarHashMap.cpp | 85 +++++++++++-------------- libraries/avatars/src/AvatarHashMap.h | 9 ++- libraries/networking/src/NLPacket.h | 2 + 4 files changed, 44 insertions(+), 58 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 955394a465..dbd46cbfbd 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -66,12 +66,6 @@ AvatarManager::AvatarManager(QObject* parent) : // register a meta type for the weak pointer we'll use for the owning avatar mixer for each avatar qRegisterMetaType >("NodeWeakPointer"); _myAvatar = std::make_shared(); - - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::BulkAvatarData, this, ...); - packetReceiver.registerPacketListener(PacketType::KillAvatar, this, ...); - packetReceiver.registerPacketListener(PacketType::AvatarIdentity, this, ...); - packetReceiver.registerPacketListener(PacketType::AvatarBillboard, this, ...); } void AvatarManager::init() { diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 60eb5c4499..85f85f68e6 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -18,25 +18,13 @@ AvatarHashMap::AvatarHashMap() { connect(DependencyManager::get().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged); -} -void AvatarHashMap::processAvatarMixerDatagram(const QByteArray& datagram, const QWeakPointer& mixerWeakPointer) { - switch (packetTypeForPacket(datagram)) { - case PacketType::BulkAvatarData: - processAvatarDataPacket(datagram, mixerWeakPointer); - break; - case PacketType::AvatarIdentity: - processAvatarIdentityPacket(datagram, mixerWeakPointer); - break; - case PacketType::AvatarBillboard: - processAvatarBillboardPacket(datagram, mixerWeakPointer); - break; - case PacketType::KillAvatar: - processKillAvatar(datagram); - break; - default: - break; - } + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); + packetReceiver.registerPacketListener(PacketType::KillAvatar, this, "processKillAvatar"); + packetReceiver.registerPacketListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); + packetReceiver.registerPacketListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); } bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) { @@ -65,86 +53,89 @@ AvatarSharedPointer AvatarHashMap::addAvatar(const QUuid& sessionUUID, const QWe return avatar; } -void AvatarHashMap::processAvatarDataPacket(const QByteArray &datagram, const QWeakPointer &mixerWeakPointer) { - int bytesRead = numBytesForPacketHeader(datagram); - +void AvatarHashMap::processAvatarDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size); + int bytesRead = 0; + + SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); // enumerate over all of the avatars in this packet // only add them if mixerWeakPointer points to something (meaning that mixer is still around) - while (bytesRead < datagram.size() && mixerWeakPointer.data()) { - QUuid sessionUUID = QUuid::fromRfc4122(datagram.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); + while (bytesRead < data.size() && avatarMixer.data()) { + QUuid sessionUUID = QUuid::fromRfc4122(data.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); bytesRead += NUM_BYTES_RFC4122_UUID; - + if (sessionUUID != _lastOwnerSessionUUID) { AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - avatar = addAvatar(sessionUUID, mixerWeakPointer); + avatar = addAvatar(sessionUUID, avatarMixer); } - + // have the matching (or new) avatar parse the data from the packet - bytesRead += avatar->parseDataAtOffset(datagram, bytesRead); + bytesRead += avatar->parseDataAtOffset(data, bytesRead); } else { // create a dummy AvatarData class to throw this data on the ground AvatarData dummyData; - bytesRead += dummyData.parseDataAtOffset(datagram, bytesRead); + bytesRead += dummyData.parseDataAtOffset(data, bytesRead); } } } -void AvatarHashMap::processAvatarIdentityPacket(const QByteArray &packet, const QWeakPointer& mixerWeakPointer) { +void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { // setup a data stream to parse the packet - QDataStream identityStream(packet); - identityStream.skipRawData(numBytesForPacketHeader(packet)); - + QDataStream identityStream { packet.get() }; + QUuid sessionUUID; - + while (!identityStream.atEnd()) { - + QUrl faceMeshURL, skeletonURL; QVector attachmentData; QString displayName; identityStream >> sessionUUID >> faceMeshURL >> skeletonURL >> attachmentData >> displayName; - + // mesh URL for a UUID, find avatar in our list AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - avatar = addAvatar(sessionUUID, mixerWeakPointer); + SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + avatar = addAvatar(sessionUUID, avatarMixer); } if (avatar->getFaceModelURL() != faceMeshURL) { avatar->setFaceModelURL(faceMeshURL); } - + if (avatar->getSkeletonModelURL() != skeletonURL) { avatar->setSkeletonModelURL(skeletonURL); } - + if (avatar->getAttachmentData() != attachmentData) { avatar->setAttachmentData(attachmentData); } - + if (avatar->getDisplayName() != displayName) { avatar->setDisplayName(displayName); } } } -void AvatarHashMap::processAvatarBillboardPacket(const QByteArray& packet, const QWeakPointer& mixerWeakPointer) { - int headerSize = numBytesForPacketHeader(packet); - QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(packet.constData() + headerSize, NUM_BYTES_RFC4122_UUID)); - +void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size); + QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(data, NUM_BYTES_RFC4122_UUID)); + AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - avatar = addAvatar(sessionUUID, mixerWeakPointer); + SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + avatar = addAvatar(sessionUUID, avatarMixer); } - QByteArray billboard = packet.mid(headerSize + NUM_BYTES_RFC4122_UUID); + QByteArray billboard = data.mid(NUM_BYTES_RFC4122_UUID); if (avatar->getBillboard() != billboard) { avatar->setBillboard(billboard); } } -void AvatarHashMap::processKillAvatar(const QByteArray& datagram) { +void AvatarHashMap::processKillAvatar(std::unique_ptr packet, HifiSockAddr senderSockAddr) { // read the node id - QUuid sessionUUID = QUuid::fromRfc4122(datagram.mid(numBytesForPacketHeader(datagram), NUM_BYTES_RFC4122_UUID)); + QUuid sessionUUID = QUuid::fromRfc4122(QByteArray(packet->getPayload(), NUM_BYTES_RFC4122_UUID)); removeAvatar(sessionUUID); } diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 45edbf8d5a..537f0ca685 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -38,6 +38,10 @@ public slots: private slots: void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); + void processAvatarDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void processAvatarIdentityPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void processAvatarBillboardPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void processKillAvatar(std::unique_ptr packet, HifiSockAddr senderSockAddr); protected: AvatarHashMap(); @@ -49,11 +53,6 @@ protected: AvatarHash _avatarHash; private: - void processAvatarDataPacket(const QByteArray& packet, const QWeakPointer& mixerWeakPointer); - void processAvatarIdentityPacket(const QByteArray& packet, const QWeakPointer& mixerWeakPointer); - void processAvatarBillboardPacket(const QByteArray& packet, const QWeakPointer& mixerWeakPointer); - void processKillAvatar(const QByteArray& datagram); - QUuid _lastOwnerSessionUUID; }; diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 9105418492..96b3e2a029 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -25,6 +25,8 @@ public: virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers virtual qint64 localHeaderSize() const; // Current level's header size + + QUuid getSourceID() const { return QUuid(); } protected: NLPacket(PacketType::Value type, int64_t size); From 9f4e4f194807f92128cac02c02c35b5bd29ed048 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:36:09 -0700 Subject: [PATCH 175/582] fix templated write/read and various write calls --- libraries/networking/src/LimitedNodeList.cpp | 4 ++-- libraries/networking/src/NodeList.cpp | 2 +- libraries/networking/src/Packet.cpp | 5 +++-- libraries/networking/src/Packet.h | 4 ++-- libraries/octree/src/OctreeSceneStats.cpp | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index d0aa260bd6..029bac7c9c 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -559,7 +559,7 @@ std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUui auto icePingPacket = NLPacket::create(PacketType::ICEPing, packetSize); icePingPacket->write(iceID.toRfc4122()); - icePingPacket->write(pingType); + icePingPacket->writePrimitive(pingType); return icePingPacket; } @@ -575,7 +575,7 @@ std::unique_ptr constructICEPingReplyPacket(const QByteArray& pingPack // pack the ICE ID and then the ping type icePingReplyPacket->write(iceID.toRfc4122()); - icePingReplyPacket->write(pingType); + icePingReplyPacket->writePrimitive(pingType); return icePingReplyPacket; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 948a2a16d7..dd1d4bdc5f 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -402,7 +402,7 @@ void NodeList::sendDSPathQuery(const QString& newPath) { if (numPathBytes + ((qint64) sizeof(numPathBytes)) < pathQueryPacket->bytesAvailable()) { // append the size of the path to the query packet - pathQueryPacket->write(numPathBytes); + pathQueryPacket->writePrimitive(numPathBytes); // append the path itself to the query packet pathQueryPacket->write(pathQueryUTF8); diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 8181d8f13c..d0dbf7d7d7 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -157,11 +157,12 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { &seqNum, sizeof(seqNum)); } -template qint64 Packet::read(T* data) { +template qint64 Packet::readPrimitive(T* data) { return QIODevice::read(reinterpret_cast(data), sizeof(T)); } -template qint64 Packet::write(const T& data) { +template qint64 Packet::writePrimitive(const T& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); return QIODevice::write(reinterpret_cast(&data), sizeof(T)); } diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 500df901b6..0607aa2636 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -59,8 +59,8 @@ public: virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } virtual qint64 size() const { return _capacity; } - template qint64 read(T* data); - template qint64 write(const T& data); + template qint64 readPrimitive(T* data); + template qint64 writePrimitive(const T& data); protected: Packet(PacketType::Value type, int64_t size); diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 7d5af6437e..220fd53b1d 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -421,7 +421,7 @@ int OctreeSceneStats::packIntoPacket() { // copy the int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_jurisdictionRoot)); _statsPacket->write(bytes); - _statsPacket->write(_jurisdictionRoot, bytes); + _statsPacket->write(reinterpret_cast(_jurisdictionRoot), bytes); // if and only if there's a root jurisdiction, also include the end elements int endNodeCount = _jurisdictionEndNodes.size(); @@ -432,7 +432,7 @@ int OctreeSceneStats::packIntoPacket() { unsigned char* endNodeCode = _jurisdictionEndNodes[i]; int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); _statsPacket->write(bytes); - _statsPacket->write(endNodeCode, bytes); + _statsPacket->write(reinterpret_cast(endNodeCode), bytes); } } else { int bytes = 0; From c162d53908a008b2fc7432d8709c5be5d5b6eefb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:38:17 -0700 Subject: [PATCH 176/582] fix writes in JurisdictionMap --- libraries/octree/src/JurisdictionMap.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index dca33287db..d6e4ad8003 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -273,9 +273,9 @@ std::unique_ptr JurisdictionMap::packEmptyJurisdictionIntoMessage(Node auto packet = NLPacket::create(PacketType::Jurisdiction, sizeof(type) + sizeof(bytes)); // Pack the Node Type in first byte - packet->write(type); + packet->writePrimitive(type); // No root or end node details to pack! - packet->write(bytes); + packet->writePrimitive(bytes); return std::move(packet); // includes header! } @@ -285,18 +285,18 @@ std::unique_ptr JurisdictionMap::packIntoMessage() { // Pack the Node Type in first byte NodeType_t type = getNodeType(); - packet->write(type); + packet->writePrimitive(type); // add the root jurisdiction if (_rootOctalCode) { size_t bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_rootOctalCode)); // No root or end node details to pack! - packet->write(bytes); + packet->writePrimitive(bytes); packet->write(reinterpret_cast(_rootOctalCode), bytes); // if and only if there's a root jurisdiction, also include the end nodes int endNodeCount = _endNodes.size(); - packet->write(endNodeCount); + packet->writePrimitive(endNodeCount); for (int i=0; i < endNodeCount; i++) { unsigned char* endNodeCode = _endNodes[i]; @@ -304,12 +304,12 @@ std::unique_ptr JurisdictionMap::packIntoMessage() { if (endNodeCode) { bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); } - packet->write(bytes); + packet->writePrimitive(bytes); packet->write(reinterpret_cast(endNodeCode), bytes); } } else { int bytes = 0; - packet->write(bytes); + packet->writePrimitive(bytes); } return std::move(packet); From f3eb6982e6ef63137d387227fef750d1270aa857 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:39:24 -0700 Subject: [PATCH 177/582] fix writing to packet in AudioInjector --- libraries/audio/src/AudioInjector.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 16a5bfc5e0..6b28f800df 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -216,17 +216,17 @@ void AudioInjector::injectToMixer() { _loudness /= (float)(bytesToCopy / sizeof(int16_t)); audioPacket->seek(positionOptionOffset); - audioPacket->write(_options.position); - audioPacket->write(_options.orientation); + audioPacket->writePrimitive(_options.position); + audioPacket->writePrimitive(_options.orientation); volume = MAX_INJECTOR_VOLUME * _options.volume; audioPacket->seek(volumeOptionOffset); - audioPacket->write(volume); + audioPacket->writePrimitive(volume); audioPacket->seek(audioDataOffset); // pack the sequence number - audioPacket->write(outgoingInjectedAudioSequenceNumber); + audioPacket->writePrimitive(outgoingInjectedAudioSequenceNumber); // copy the next NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL bytes to the packet audioPacket->write(_audioData.data() + _currentSendPosition, bytesToCopy); From 480cb80f4f19c3207c903fd6af71a3169fe55093 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:42:43 -0700 Subject: [PATCH 178/582] fix primitive writing in OctreeEditPacketSender --- libraries/octree/src/OctreeEditPacketSender.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 2e60d9da67..86d25af759 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -86,7 +86,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu // pack sequence number quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++; - packet->write(sequence); + packet->writePrimitive(sequence); // debugging output... if (wantDebug) { @@ -96,8 +96,8 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu packet->seek(0); // read the sequence number and createdAt - packet->read(&sequence); - packet->read(&createdAt); + packet->readPrimitive(&sequence); + packet->readPrimitive(&createdAt); quint64 queuedAt = usecTimestampNow(); quint64 transitTime = queuedAt - createdAt; @@ -321,7 +321,7 @@ std::unique_ptr OctreeEditPacketSender::initializePacket(PacketType::V // pack in timestamp quint64 now = usecTimestampNow() + nodeClockSkew; - newPacket->write(now); + newPacket->writePrimitive(now); return newPacket; } From dec11ef4ead5b9ae0712994f88c7fd60085e630d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:43:42 -0700 Subject: [PATCH 179/582] fix for primitive writing in AudioIOStats --- libraries/audio-client/src/AudioIOStats.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index db72adb0c5..8f7ab2ecaa 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -114,13 +114,13 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { auto statsPacket = NLPacket::create(PacketType::AudioStreamStats, statsPacketSize); // pack append flag - statsPacket->write(&appendFlag, sizeof(appendFlag)); + statsPacket->writePrimitive(appendFlag); // pack number of stats packed - statsPacket->write(&numStreamStatsToPack, sizeof(numStreamStatsToPack)); + statsPacket->writePrimitive(numStreamStatsToPack); // pack downstream audio stream stats - statsPacket->write(&stats, sizeof(stats)); + statsPacket->writePrimitive(stats); // send packet SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); From f37d3c9bd6f16560afb0e82b5d1da05646c6b239 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:44:45 -0700 Subject: [PATCH 180/582] fix primitive type writing in OctreeSceneStats --- libraries/octree/src/OctreeSceneStats.cpp | 68 +++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 220fd53b1d..c4367b43d8 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -384,59 +384,59 @@ void OctreeSceneStats::childBitsRemoved(bool includesExistsBits, bool includesCo int OctreeSceneStats::packIntoPacket() { _statsPacket->reset(); - _statsPacket->write(_start); - _statsPacket->write(_end); - _statsPacket->write(_elapsed); - _statsPacket->write(_totalEncodeTime); - _statsPacket->write(_isFullScene); - _statsPacket->write(_isMoving); - _statsPacket->write(_packets); - _statsPacket->write(_bytes); + _statsPacket->writePrimitive(_start); + _statsPacket->writePrimitive(_end); + _statsPacket->writePrimitive(_elapsed); + _statsPacket->writePrimitive(_totalEncodeTime); + _statsPacket->writePrimitive(_isFullScene); + _statsPacket->writePrimitive(_isMoving); + _statsPacket->writePrimitive(_packets); + _statsPacket->writePrimitive(_bytes); - _statsPacket->write(_totalInternal); - _statsPacket->write(_totalLeaves); - _statsPacket->write(_internal); - _statsPacket->write(_leaves); - _statsPacket->write(_internalSkippedDistance); - _statsPacket->write(_leavesSkippedDistance); - _statsPacket->write(_internalSkippedOutOfView); - _statsPacket->write(_leavesSkippedOutOfView); - _statsPacket->write(_internalSkippedWasInView); - _statsPacket->write(_leavesSkippedWasInView); - _statsPacket->write(_internalSkippedNoChange); - _statsPacket->write(_leavesSkippedNoChange); - _statsPacket->write(_internalSkippedOccluded); - _statsPacket->write(_leavesSkippedOccluded); - _statsPacket->write(_internalColorSent); - _statsPacket->write(_leavesColorSent); - _statsPacket->write(_internalDidntFit); - _statsPacket->write(_leavesDidntFit); - _statsPacket->write(_colorBitsWritten); - _statsPacket->write(_existsBitsWritten); - _statsPacket->write(_existsInPacketBitsWritten); - _statsPacket->write(_treesRemoved); + _statsPacket->writePrimitive(_totalInternal); + _statsPacket->writePrimitive(_totalLeaves); + _statsPacket->writePrimitive(_internal); + _statsPacket->writePrimitive(_leaves); + _statsPacket->writePrimitive(_internalSkippedDistance); + _statsPacket->writePrimitive(_leavesSkippedDistance); + _statsPacket->writePrimitive(_internalSkippedOutOfView); + _statsPacket->writePrimitive(_leavesSkippedOutOfView); + _statsPacket->writePrimitive(_internalSkippedWasInView); + _statsPacket->writePrimitive(_leavesSkippedWasInView); + _statsPacket->writePrimitive(_internalSkippedNoChange); + _statsPacket->writePrimitive(_leavesSkippedNoChange); + _statsPacket->writePrimitive(_internalSkippedOccluded); + _statsPacket->writePrimitive(_leavesSkippedOccluded); + _statsPacket->writePrimitive(_internalColorSent); + _statsPacket->writePrimitive(_leavesColorSent); + _statsPacket->writePrimitive(_internalDidntFit); + _statsPacket->writePrimitive(_leavesDidntFit); + _statsPacket->writePrimitive(_colorBitsWritten); + _statsPacket->writePrimitive(_existsBitsWritten); + _statsPacket->writePrimitive(_existsInPacketBitsWritten); + _statsPacket->writePrimitive(_treesRemoved); // add the root jurisdiction if (_jurisdictionRoot) { // copy the int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_jurisdictionRoot)); - _statsPacket->write(bytes); + _statsPacket->writePrimitive(bytes); _statsPacket->write(reinterpret_cast(_jurisdictionRoot), bytes); // if and only if there's a root jurisdiction, also include the end elements int endNodeCount = _jurisdictionEndNodes.size(); - _statsPacket->write(endNodeCount); + _statsPacket->writePrimitive(endNodeCount); for (int i=0; i < endNodeCount; i++) { unsigned char* endNodeCode = _jurisdictionEndNodes[i]; int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); - _statsPacket->write(bytes); + _statsPacket->writePrimitive(bytes); _statsPacket->write(reinterpret_cast(endNodeCode), bytes); } } else { int bytes = 0; - _statsPacket->write(bytes); + _statsPacket->writePrimitive(bytes); } return _statsPacket->getSizeUsed(); From 546268be553d72e00a31bbe6267800cb5110ce00 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:46:08 -0700 Subject: [PATCH 181/582] fix primitive type writing in AudioClient --- libraries/audio-client/src/AudioClient.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 8a743ebc00..bf58f981cd 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -843,12 +843,12 @@ void AudioClient::handleAudioInput() { quint8 isStereo = _isStereoInput ? 1 : 0; if (_lastInputLoudness == 0) { - _audioPacket->setPacketType(PacketType::SilentAudioFrame); + _audioPacket->setType(PacketType::SilentAudioFrame); } else { if (_shouldEchoToServer) { - _audioPacket->setPacketType(PacketType::MicrophoneAudioWithEcho); + _audioPacket->setType(PacketType::MicrophoneAudioWithEcho); } else { - _audioPacket->setPacketType(PacketType::MicrophoneAudioNoEcho); + _audioPacket->setType(PacketType::MicrophoneAudioNoEcho); } } @@ -861,17 +861,17 @@ void AudioClient::handleAudioInput() { if (_audioPacket->getPacketType() == PacketType::SilentAudioFrame) { // pack num silent samples quint16 numSilentSamples = numNetworkSamples; - _audioPacket->write(numSilentSamples); + _audioPacket->writePrimitive(numSilentSamples); } else { // set the mono/stereo byte - _audioPacket->write(isStereo); + _audioPacket->writePrimitive(isStereo); } // pack the three float positions - _audioPacket->write(headPosition); + _audioPacket->writePrimitive(headPosition); // pack the orientation - _audioPacket->write(headOrientation); + _audioPacket->writePrimitive(headOrientation); if (_audioPacket->getPacketType() != PacketType::SilentAudioFrame) { // audio samples have already been packed (written to networkAudioSamples) From 4d3659b627530250e256d944d7f7494d0c58f983 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:50:35 -0700 Subject: [PATCH 182/582] update packet creation in AvatarData to new API --- libraries/avatars/src/AvatarData.cpp | 176 ++++++++++++++------------- 1 file changed, 90 insertions(+), 86 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index efc8e5c157..dfac2f9b46 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -87,7 +87,7 @@ glm::quat AvatarData::getOrientation() const { if (_referential) { _referential->update(); } - + return glm::quat(glm::radians(glm::vec3(_bodyPitch, _bodyYaw, _bodyRoll))); } @@ -104,7 +104,7 @@ float AvatarData::getTargetScale() const { if (_referential) { _referential->update(); } - + return _targetScale; } @@ -115,9 +115,9 @@ void AvatarData::setTargetScale(float targetScale, bool overideReferential) { } void AvatarData::setClampedTargetScale(float targetScale, bool overideReferential) { - + targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE); - + setTargetScale(targetScale, overideReferential); qCDebug(avatars) << "Changed scale to " << _targetScale; } @@ -135,7 +135,7 @@ QByteArray AvatarData::toByteArray() { // TODO: DRY this up to a shared method // that can pack any type given the number of bytes // and return the number of bytes to push the pointer - + // lazily allocate memory for HeadData in case we're not an Avatar instance if (!_headData) { _headData = new HeadData(this); @@ -143,21 +143,21 @@ QByteArray AvatarData::toByteArray() { if (_forceFaceTrackerConnected) { _headData->_isFaceTrackerConnected = true; } - + QByteArray avatarDataByteArray; avatarDataByteArray.resize(MAX_PACKET_SIZE); - + unsigned char* destinationBuffer = reinterpret_cast(avatarDataByteArray.data()); unsigned char* startPosition = destinationBuffer; - + memcpy(destinationBuffer, &_position, sizeof(_position)); destinationBuffer += sizeof(_position); - + // Body rotation (NOTE: This needs to become a quaternion to save two bytes) destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyYaw); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyPitch); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _bodyRoll); - + // Body scale destinationBuffer += packFloatRatioToTwoByte(destinationBuffer, _targetScale); @@ -178,11 +178,11 @@ QByteArray AvatarData::toByteArray() { // Lookat Position memcpy(destinationBuffer, &_headData->_lookAtPosition, sizeof(_headData->_lookAtPosition)); destinationBuffer += sizeof(_headData->_lookAtPosition); - + // Instantaneous audio loudness (used to drive facial animation) memcpy(destinationBuffer, &_headData->_audioLoudness, sizeof(float)); destinationBuffer += sizeof(float); - + // bitMask of less than byte wide items unsigned char bitItems = 0; @@ -202,7 +202,7 @@ QByteArray AvatarData::toByteArray() { setAtBit(bitItems, HAS_REFERENTIAL); } *destinationBuffer++ = bitItems; - + // Add referential if (_referential != NULL && _referential->isValid()) { destinationBuffer += _referential->packReferential(destinationBuffer); @@ -221,13 +221,13 @@ QByteArray AvatarData::toByteArray() { memcpy(destinationBuffer, &_headData->_browAudioLift, sizeof(float)); destinationBuffer += sizeof(float); - + *destinationBuffer++ = _headData->_blendshapeCoefficients.size(); memcpy(destinationBuffer, _headData->_blendshapeCoefficients.data(), _headData->_blendshapeCoefficients.size() * sizeof(float)); destinationBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float); } - + // pupil dilation destinationBuffer += packFloatToByte(destinationBuffer, _headData->_pupilDilation, 1.0f); @@ -252,7 +252,7 @@ QByteArray AvatarData::toByteArray() { destinationBuffer += packOrientationQuatToBytes(destinationBuffer, data.rotation); } } - + return avatarDataByteArray.left(destinationBuffer - startPosition); } @@ -266,17 +266,17 @@ bool AvatarData::shouldLogError(const quint64& now) { // read data in packet starting at byte offset and return number of bytes parsed int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { - + // lazily allocate memory for HeadData in case we're not an Avatar instance if (!_headData) { _headData = new HeadData(this); } - + // lazily allocate memory for HandData in case we're not an Avatar instance if (!_handData) { _handData = new HandData(this); } - + const unsigned char* startPosition = reinterpret_cast(packet.data()) + offset; const unsigned char* sourceBuffer = startPosition; quint64 now = usecTimestampNow(); @@ -298,13 +298,13 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { // + 1 byte for numJoints (0) // = 45 bytes int minPossibleSize = 45; - + int maxAvailableSize = packet.size() - offset; if (minPossibleSize > maxAvailableSize) { if (shouldLogError(now)) { qCDebug(avatars) << "Malformed AvatarData packet at the start; " << " displayName = '" << _displayName << "'" - << " minPossibleSize = " << minPossibleSize + << " minPossibleSize = " << minPossibleSize << " maxAvailableSize = " << maxAvailableSize; } // this packet is malformed so we report all bytes as consumed @@ -316,7 +316,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { glm::vec3 position; memcpy(&position, sourceBuffer, sizeof(position)); sourceBuffer += sizeof(position); - + if (glm::isnan(position.x) || glm::isnan(position.y) || glm::isnan(position.z)) { if (shouldLogError(now)) { qCDebug(avatars) << "Discard nan AvatarData::position; displayName = '" << _displayName << "'"; @@ -324,7 +324,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { return maxAvailableSize; } setPosition(position); - + // rotation (NOTE: This needs to become a quaternion to save two bytes) float yaw, pitch, roll; sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*) sourceBuffer, &yaw); @@ -342,7 +342,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { _bodyPitch = pitch; _bodyRoll = roll; } - + // scale float scale; sourceBuffer += unpackFloatRatioFromTwoByte(sourceBuffer, scale); @@ -354,8 +354,8 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { } _targetScale = scale; } // 20 bytes - - { // Head rotation + + { // Head rotation //(NOTE: This needs to become a quaternion to save two bytes) float headYaw, headPitch, headRoll; sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*) sourceBuffer, &headPitch); @@ -371,7 +371,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { _headData->setBaseYaw(headYaw); _headData->setBaseRoll(headRoll); } // 6 bytes - + { // Lookat Position glm::vec3 lookAt; memcpy(&lookAt, sourceBuffer, sizeof(lookAt)); @@ -384,7 +384,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { } _headData->_lookAtPosition = lookAt; } // 12 bytes - + { // AudioLoudness // Instantaneous audio loudness (used to drive facial animation) float audioLoudness; @@ -398,26 +398,26 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { } _headData->_audioLoudness = audioLoudness; } // 4 bytes - + { // bitFlags and face data unsigned char bitItems = *sourceBuffer++; - + // key state, stored as a semi-nibble in the bitItems _keyState = (KeyState)getSemiNibbleAt(bitItems,KEY_STATE_START_BIT); // hand state, stored as a semi-nibble plus a bit in the bitItems - // we store the hand state as well as other items in a shared bitset. The hand state is an octal, but is split + // we store the hand state as well as other items in a shared bitset. The hand state is an octal, but is split // into two sections to maintain backward compatibility. The bits are ordered as such (0-7 left to right). // +---+-----+-----+--+ // |x,x|H0,H1|x,x,x|H2| // +---+-----+-----+--+ // Hand state - H0,H1,H2 is found in the 3rd, 4th, and 8th bits - _handState = getSemiNibbleAt(bitItems, HAND_STATE_START_BIT) + _handState = getSemiNibbleAt(bitItems, HAND_STATE_START_BIT) + (oneAtBit(bitItems, HAND_STATE_FINGER_POINTING_BIT) ? IS_FINGER_POINTING_FLAG : 0); - + _headData->_isFaceTrackerConnected = oneAtBit(bitItems, IS_FACESHIFT_CONNECTED); bool hasReferential = oneAtBit(bitItems, HAS_REFERENTIAL); - + // Referential if (hasReferential) { Referential* ref = new Referential(sourceBuffer, this); @@ -431,8 +431,8 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { } else if (_referential != NULL) { changeReferential(NULL); } - - + + if (_headData->_isFaceTrackerConnected) { float leftEyeBlink, rightEyeBlink, averageLoudness, browAudioLift; minPossibleSize += sizeof(leftEyeBlink) + sizeof(rightEyeBlink) + sizeof(averageLoudness) + sizeof(browAudioLift); @@ -441,7 +441,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { if (shouldLogError(now)) { qCDebug(avatars) << "Malformed AvatarData packet after BitItems;" << " displayName = '" << _displayName << "'" - << " minPossibleSize = " << minPossibleSize + << " minPossibleSize = " << minPossibleSize << " maxAvailableSize = " << maxAvailableSize; } return maxAvailableSize; @@ -449,17 +449,17 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { // unpack face data memcpy(&leftEyeBlink, sourceBuffer, sizeof(float)); sourceBuffer += sizeof(float); - + memcpy(&rightEyeBlink, sourceBuffer, sizeof(float)); sourceBuffer += sizeof(float); - + memcpy(&averageLoudness, sourceBuffer, sizeof(float)); sourceBuffer += sizeof(float); - + memcpy(&browAudioLift, sourceBuffer, sizeof(float)); sourceBuffer += sizeof(float); - - if (glm::isnan(leftEyeBlink) || glm::isnan(rightEyeBlink) + + if (glm::isnan(leftEyeBlink) || glm::isnan(rightEyeBlink) || glm::isnan(averageLoudness) || glm::isnan(browAudioLift)) { if (shouldLogError(now)) { qCDebug(avatars) << "Discard nan AvatarData::faceData; displayName = '" << _displayName << "'"; @@ -470,7 +470,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { _headData->_rightEyeBlink = rightEyeBlink; _headData->_averageLoudness = averageLoudness; _headData->_browAudioLift = browAudioLift; - + int numCoefficients = (int)(*sourceBuffer++); int blendDataSize = numCoefficients * sizeof(float); minPossibleSize += blendDataSize; @@ -478,7 +478,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { if (shouldLogError(now)) { qCDebug(avatars) << "Malformed AvatarData packet after Blendshapes;" << " displayName = '" << _displayName << "'" - << " minPossibleSize = " << minPossibleSize + << " minPossibleSize = " << minPossibleSize << " maxAvailableSize = " << maxAvailableSize; } return maxAvailableSize; @@ -487,15 +487,15 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { _headData->_blendshapeCoefficients.resize(numCoefficients); memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer, blendDataSize); sourceBuffer += numCoefficients * sizeof(float); - + //bitItemsDataSize = 4 * sizeof(float) + 1 + blendDataSize; } } // 1 + bitItemsDataSize bytes - + { // pupil dilation sourceBuffer += unpackFloatFromByte(sourceBuffer, _headData->_pupilDilation, 1.0f); } // 1 byte - + // joint data int numJoints = *sourceBuffer++; int bytesOfValidity = (int)ceil((float)numJoints / (float)BITS_IN_BYTE); @@ -504,7 +504,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { if (shouldLogError(now)) { qCDebug(avatars) << "Malformed AvatarData packet after JointValidityBits;" << " displayName = '" << _displayName << "'" - << " minPossibleSize = " << minPossibleSize + << " minPossibleSize = " << minPossibleSize << " maxAvailableSize = " << maxAvailableSize; } return maxAvailableSize; @@ -523,7 +523,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { ++numValidJoints; } _jointData[i].valid = valid; - validityBit = (validityBit + 1) % BITS_IN_BYTE; + validityBit = (validityBit + 1) % BITS_IN_BYTE; } } // 1 + bytesOfValidity bytes @@ -535,7 +535,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { if (shouldLogError(now)) { qCDebug(avatars) << "Malformed AvatarData packet after JointData;" << " displayName = '" << _displayName << "'" - << " minPossibleSize = " << minPossibleSize + << " minPossibleSize = " << minPossibleSize << " maxAvailableSize = " << maxAvailableSize; } return maxAvailableSize; @@ -550,18 +550,18 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { } } } // numJoints * 8 bytes - + int numBytesRead = sourceBuffer - startPosition; - _averageBytesReceived.updateAverage(numBytesRead); + _averageBytesReceived.updateAverage(numBytesRead); return numBytesRead; } int AvatarData::getAverageBytesReceivedPerSecond() const { - return lrint(_averageBytesReceived.getAverageSampleValuePerSecond()); + return lrint(_averageBytesReceived.getAverageSampleValuePerSecond()); } int AvatarData::getReceiveRate() const { - return lrint(1.0f / _averageBytesReceived.getEventDeltaAverage()); + return lrint(1.0f / _averageBytesReceived.getEventDeltaAverage()); } bool AvatarData::hasReferential() { @@ -619,7 +619,7 @@ void AvatarData::loadRecording(QString filename) { if (!_player) { _player = PlayerPointer(new Player(this)); } - + _player->loadFromFile(filename); } @@ -700,7 +700,7 @@ void AvatarData::play() { QMetaObject::invokeMethod(this, "play", Qt::BlockingQueuedConnection); return; } - + _player->play(); } } @@ -870,20 +870,20 @@ void AvatarData::clearJointsData() { bool AvatarData::hasIdentityChangedAfterParsing(const QByteArray &packet) { QDataStream packetStream(packet); packetStream.skipRawData(numBytesForPacketHeader(packet)); - + QUuid avatarUUID; QUrl faceModelURL, skeletonModelURL; QVector attachmentData; QString displayName; packetStream >> avatarUUID >> faceModelURL >> skeletonModelURL >> attachmentData >> displayName; - + bool hasIdentityChanged = false; - + if (faceModelURL != _faceModelURL) { setFaceModelURL(faceModelURL); hasIdentityChanged = true; } - + if (skeletonModelURL != _skeletonModelURL) { setSkeletonModelURL(skeletonModelURL); hasIdentityChanged = true; @@ -893,12 +893,12 @@ bool AvatarData::hasIdentityChangedAfterParsing(const QByteArray &packet) { setDisplayName(displayName); hasIdentityChanged = true; } - + if (attachmentData != _attachmentData) { setAttachmentData(attachmentData); hasIdentityChanged = true; } - + return hasIdentityChanged; } @@ -907,7 +907,7 @@ QByteArray AvatarData::identityByteArray() { QDataStream identityStream(&identityData, QIODevice::Append); identityStream << QUuid() << _faceModelURL << _skeletonModelURL << _attachmentData << _displayName; - + return identityData; } @@ -922,15 +922,15 @@ bool AvatarData::hasBillboardChangedAfterParsing(const QByteArray& packet) { void AvatarData::setFaceModelURL(const QUrl& faceModelURL) { _faceModelURL = faceModelURL; - + qCDebug(avatars) << "Changing face model for avatar to" << _faceModelURL.toString(); } void AvatarData::setSkeletonModelURL(const QUrl& skeletonModelURL) { _skeletonModelURL = skeletonModelURL.isEmpty() ? DEFAULT_BODY_MODEL_URL : skeletonModelURL; - + qCDebug(avatars) << "Changing skeleton model for avatar to" << _skeletonModelURL.toString(); - + updateJointMappings(); } @@ -1017,20 +1017,20 @@ void AvatarData::detachAll(const QString& modelURL, const QString& jointName) { void AvatarData::setBillboard(const QByteArray& billboard) { _billboard = billboard; - + qCDebug(avatars) << "Changing billboard for avatar."; } void AvatarData::setBillboardFromURL(const QString &billboardURL) { _billboardURL = billboardURL; - - + + qCDebug(avatars) << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); - + QNetworkRequest billboardRequest; billboardRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); billboardRequest.setUrl(QUrl(billboardURL)); - + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* networkReply = networkAccessManager.get(billboardRequest); connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply())); @@ -1044,7 +1044,7 @@ void AvatarData::setBillboardFromNetworkReply() { void AvatarData::setJointMappingsFromNetworkReply() { QNetworkReply* networkReply = static_cast(sender()); - + QByteArray line; while (!(line = networkReply->readLine()).isEmpty()) { if (!(line = line.trimmed()).startsWith("jointIndex")) { @@ -1071,43 +1071,47 @@ void AvatarData::setJointMappingsFromNetworkReply() { for (int i = 0; i < _jointNames.size(); i++) { _jointIndices.insert(_jointNames.at(i), i + 1); } - + networkReply->deleteLater(); } void AvatarData::sendAvatarDataPacket() { auto nodeList = DependencyManager::get(); - QByteArray dataPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarData); - dataPacket.append(toByteArray()); - - nodeList->broadcastToNodes(dataPacket, NodeSet() << NodeType::AvatarMixer); + QByteArray avatarByteArray = toByteArray(); + + auto avatarPacket = NLPacket::create(PacketType::AvatarData, avatarByteArray.size()); + avatarPacket->write(avatarByteArray); + + nodeList->broadcastToNodes(std::move(avatarPacket), NodeSet() << NodeType::AvatarMixer); } void AvatarData::sendIdentityPacket() { auto nodeList = DependencyManager::get(); - QByteArray identityPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarIdentity); - identityPacket.append(identityByteArray()); - - nodeList->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer); + QByteArray identityByteArray = identityByteArray(); + + auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, identityByteArray.size()); + identityPacket->write(identityByteArray); + + nodeList->broadcastToNodes(std::move(identityPacket), NodeSet() << NodeType::AvatarMixer); } void AvatarData::sendBillboardPacket() { if (!_billboard.isEmpty()) { auto nodeList = DependencyManager::get(); - QByteArray billboardPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarBillboard); - billboardPacket.append(_billboard); - - nodeList->broadcastToNodes(billboardPacket, NodeSet() << NodeType::AvatarMixer); + auto billboardPacket = NLPacket::create(PacketType::AvatarBillboard, _billboard.size()); + billboardPacket->write(_billboard); + + nodeList->broadcastToNodes(std::move(billboardPacket), NodeSet() << NodeType::AvatarMixer); } } void AvatarData::updateJointMappings() { _jointIndices.clear(); _jointNames.clear(); - + if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest = QNetworkRequest(_skeletonModelURL); From 2ac833c904d25d3cc3c8a9ca6a0f16bdd7a917c0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:50:49 -0700 Subject: [PATCH 183/582] fix another primitive write in AudioClient --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index bf58f981cd..b9a6db472f 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -856,7 +856,7 @@ void AudioClient::handleAudioInput() { _audioPacket->reset(); // write sequence number - _audioPacket->write(_outgoingAvatarAudioSequenceNumber); + _audioPacket->writePrimitive(_outgoingAvatarAudioSequenceNumber); if (_audioPacket->getPacketType() == PacketType::SilentAudioFrame) { // pack num silent samples From 964041d8d38c716a54150da83db5c04dde05bbcb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:53:04 -0700 Subject: [PATCH 184/582] missed API fixes in AudioClient and AvatarData --- libraries/audio-client/src/AudioClient.cpp | 4 ++-- libraries/avatars/src/AvatarData.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index b9a6db472f..ab668653d1 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -858,7 +858,7 @@ void AudioClient::handleAudioInput() { // write sequence number _audioPacket->writePrimitive(_outgoingAvatarAudioSequenceNumber); - if (_audioPacket->getPacketType() == PacketType::SilentAudioFrame) { + if (_audioPacket->getType() == PacketType::SilentAudioFrame) { // pack num silent samples quint16 numSilentSamples = numNetworkSamples; _audioPacket->writePrimitive(numSilentSamples); @@ -873,7 +873,7 @@ void AudioClient::handleAudioInput() { // pack the orientation _audioPacket->writePrimitive(headOrientation); - if (_audioPacket->getPacketType() != PacketType::SilentAudioFrame) { + if (_audioPacket->getType() != PacketType::SilentAudioFrame) { // audio samples have already been packed (written to networkAudioSamples) _audioPacket->setSizeUsed(_audioPacket->getSizeUsed() + numNetworkBytes); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index dfac2f9b46..5ea3b4c669 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1089,10 +1089,10 @@ void AvatarData::sendAvatarDataPacket() { void AvatarData::sendIdentityPacket() { auto nodeList = DependencyManager::get(); - QByteArray identityByteArray = identityByteArray(); + QByteArray identityData = identityByteArray(); - auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, identityByteArray.size()); - identityPacket->write(identityByteArray); + auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, identityData.size()); + identityPacket->write(identityData); nodeList->broadcastToNodes(std::move(identityPacket), NodeSet() << NodeType::AvatarMixer); } From 72b713e32f81f24912e915e70a01736693823e6a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:53:57 -0700 Subject: [PATCH 185/582] fix for more primitive writes in AudioClient --- libraries/audio-client/src/AudioClient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index ab668653d1..858be03296 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -916,8 +916,8 @@ void AudioClient::sendMuteEnvironmentPacket() { glm::vec3 currentSourcePosition = _positionGetter(); - mutePacket->write(currentSourcePosition); - mutePacket->write(MUTE_RADIUS); + mutePacket->writePrimitive(currentSourcePosition); + mutePacket->writePrimitive(MUTE_RADIUS); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); From ac40790841235dda6772894352776f0aa5f72d66 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 16:54:56 -0700 Subject: [PATCH 186/582] remove a bad replacement from PacketType in EntityTree --- libraries/entities/src/EntityTree.cpp | 52 +++++++++++++-------------- libraries/entities/src/EntityTree.h | 8 ++--- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index cf665193c9..840dd41b54 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -29,8 +29,8 @@ const quint64 SIMULATOR_CHANGE_LOCKOUT_PERIOD = (quint64)(0.2f * USECS_PER_SECOND); -EntityTree::EntityTree(bool shouldReaverage) : - Octree(shouldReaverage), +EntityTree::EntityTree(bool shouldReaverage) : + Octree(shouldReaverage), _fbxService(NULL), _simulation(NULL) { @@ -63,7 +63,7 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) { Octree::eraseAllOctreeElements(createNewRoot); } -bool EntityTree::handlesEditPacketType::(PacketType::Value packetType) const { +bool EntityTree::handlesEditPacketType(PacketType::Value packetType) const { // we handle these types of "edit" packets switch (packetType) { case PacketType::EntityAdd: @@ -108,14 +108,14 @@ bool EntityTree::updateEntity(const EntityItemID& entityID, const EntityItemProp bool EntityTree::updateEntity(EntityItemPointer entity, const EntityItemProperties& properties, const SharedNodePointer& senderNode) { EntityTreeElement* containingElement = getContainingElement(entity->getEntityItemID()); if (!containingElement) { - qCDebug(entities) << "UNEXPECTED!!!! EntityTree::updateEntity() entity-->element lookup failed!!! entityID=" + qCDebug(entities) << "UNEXPECTED!!!! EntityTree::updateEntity() entity-->element lookup failed!!! entityID=" << entity->getEntityItemID(); return false; } return updateEntityWithElement(entity, properties, containingElement, senderNode); } -bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityItemProperties& origProperties, +bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityItemProperties& origProperties, EntityTreeElement* containingElement, const SharedNodePointer& senderNode) { EntityItemProperties properties = origProperties; @@ -177,7 +177,7 @@ bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityI // (2) equal priority wins if ownership filter has expired except... uint8_t oldPriority = entity->getSimulationPriority(); uint8_t newPriority = properties.getSimulationOwner().getPriority(); - if (newPriority > oldPriority || + if (newPriority > oldPriority || (newPriority == oldPriority && properties.getSimulationOwner().hasExpired())) { simulationBlocked = false; } @@ -222,7 +222,7 @@ bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityI entity->clearDirtyFlags(); } } - + QString entityScriptAfter = entity->getScript(); quint64 entityScriptTimestampAfter = entity->getScriptTimestamp(); bool reload = entityScriptTimestampBefore != entityScriptTimestampAfter; @@ -231,15 +231,15 @@ bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityI } maybeNotifyNewCollisionSoundURL(collisionSoundURLBefore, entity->getCollisionSoundURL()); } - + // TODO: this final containingElement check should eventually be removed (or wrapped in an #ifdef DEBUG). containingElement = getContainingElement(entity->getEntityItemID()); if (!containingElement) { - qCDebug(entities) << "UNEXPECTED!!!! after updateEntity() we no longer have a containing element??? entityID=" + qCDebug(entities) << "UNEXPECTED!!!! after updateEntity() we no longer have a containing element??? entityID=" << entity->getEntityItemID(); return false; } - + return true; } @@ -264,7 +264,7 @@ EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const Enti // You should not call this on existing entities that are already part of the tree! Call updateEntity() EntityTreeElement* containingElement = getContainingElement(entityID); if (containingElement) { - qCDebug(entities) << "UNEXPECTED!!! ----- don't call addEntity() on existing entity items. entityID=" << entityID + qCDebug(entities) << "UNEXPECTED!!! ----- don't call addEntity() on existing entity items. entityID=" << entityID << "containingElement=" << containingElement; return result; } @@ -272,7 +272,7 @@ EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const Enti // construct the instance of the entity EntityTypes::EntityType type = properties.getType(); result = EntityTypes::constructEntityItem(type, entityID, properties); - + if (result) { if (recordCreationTime) { result->recordCreationTime(); @@ -502,7 +502,7 @@ void EntityTree::findEntities(const glm::vec3& center, float radius, QVector _foundEntities; }; @@ -588,7 +588,7 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign processedBytes = processEraseMessageDetails(dataByteArray, senderNode); break; } - + case PacketType::EntityAdd: case PacketType::EntityEdit: { quint64 startDecode = 0, endDecode = 0; @@ -641,7 +641,7 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign startLogging = usecTimestampNow(); if (wantEditLogging()) { - qCDebug(entities) << "User [" << senderNode->getUUID() << "] added entity. ID:" + qCDebug(entities) << "User [" << senderNode->getUUID() << "] added entity. ID:" << newEntity->getEntityItemID(); qCDebug(entities) << " properties:" << properties; } @@ -658,14 +658,14 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign qCDebug(entities) << "Add or Edit failed." << packetType << existingEntity.get(); } } - + _totalDecodeTime += endDecode - startDecode; _totalLookupTime += endLookup - startLookup; _totalUpdateTime += endUpdate - startUpdate; _totalCreateTime += endCreate - startCreate; _totalLoggingTime += endLogging - startLogging; - + break; } @@ -731,11 +731,11 @@ void EntityTree::update() { if (pendingDeletes.size() > 0) { // translate into list of ID's QSet idsToDelete; - + for (auto entity : pendingDeletes) { idsToDelete.insert(entity->getEntityItemID()); } - + // delete these things the roundabout way deleteEntities(idsToDelete, true); } @@ -765,7 +765,7 @@ bool EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumbe bool hasMoreToSend = true; unsigned char* copyAt = outputBuffer; - size_t numBytesPacketHeader = DependencyManager::get()->populatePacketHeader(reinterpret_cast(outputBuffer), + size_t numBytesPacketHeader = DependencyManager::get()->populatePacketHeader(reinterpret_cast(outputBuffer), PacketType::EntityErase); copyAt += numBytesPacketHeader; outputLength = numBytesPacketHeader; @@ -795,7 +795,7 @@ bool EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumbe memcpy(copyAt, &numberOfIds, sizeof(numberOfIds)); copyAt += sizeof(numberOfIds); outputLength += sizeof(numberOfIds); - + // we keep a multi map of entity IDs to timestamps, we only want to include the entity IDs that have been // deleted since we last sent to this node _recentlyDeletedEntitiesLock.lockForRead(); @@ -839,7 +839,7 @@ bool EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumbe // replace the correct count for ids included memcpy(numberOfIDsAt, &numberOfIds, sizeof(numberOfIds)); - + return hasMoreToSend; } @@ -863,7 +863,7 @@ void EntityTree::forgetEntitiesDeletedBefore(quint64 sinceTime) { foreach (quint64 value, keysToRemove) { _recentlyDeletedEntityItemIDs.remove(value); } - + _recentlyDeletedEntitiesLock.unlock(); } @@ -907,7 +907,7 @@ int EntityTree::processEraseMessage(const QByteArray& dataByteArray, const Share QUuid entityID = QUuid::fromRfc4122(encodedID); dataAt += encodedID.size(); processedBytes += encodedID.size(); - + EntityItemID entityItemID(entityID); entityItemIDsToDelete << entityItemID; @@ -951,7 +951,7 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons QUuid entityID = QUuid::fromRfc4122(encodedID); dataAt += encodedID.size(); processedBytes += encodedID.size(); - + EntityItemID entityItemID(entityID); entityItemIDsToDelete << entityItemID; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 7ca0244f8f..179c80eb77 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -65,7 +65,7 @@ public: virtual PacketType::Value expectedDataPacketType() const { return PacketType::EntityData; } virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion >= VERSION_ENTITIES_USE_METERS_AND_RADIANS; } - virtual bool handlesEditPacketType::(PacketType::Value packetType) const; + virtual bool handlesEditPacketType(PacketType::Value packetType) const; virtual int processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode); @@ -168,7 +168,7 @@ public: float getContentsLargestDimension(); - virtual void resetEditStats() { + virtual void resetEditStats() { _totalEditMessages = 0; _totalUpdates = 0; _totalCreates = 0; @@ -219,8 +219,8 @@ private: bool _wantEditLogging = false; void maybeNotifyNewCollisionSoundURL(const QString& oldCollisionSoundURL, const QString& newCollisionSoundURL); - - + + // some performance tracking properties - only used in server trees int _totalEditMessages = 0; int _totalUpdates = 0; From 5dc09692b45a6afbd50a29d98ccf064d135a8782 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:13:06 -0700 Subject: [PATCH 187/582] more packet creation fixes for entitites --- .../src/entities/EntityServer.cpp | 33 +++++---- assignment-client/src/entities/EntityServer.h | 4 +- .../src/octree/OctreeQueryNode.cpp | 2 +- .../src/octree/OctreeQueryNode.h | 2 +- assignment-client/src/octree/OctreeServer.h | 18 ++--- .../entities/src/EntityItemProperties.cpp | 4 +- libraries/entities/src/EntityTree.cpp | 74 +++++++------------ libraries/entities/src/EntityTree.h | 4 +- libraries/networking/src/PacketList.cpp | 9 +++ libraries/networking/src/PacketList.h | 8 ++ 10 files changed, 77 insertions(+), 81 deletions(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index b94b4a0c60..59a7df1075 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -21,7 +21,7 @@ const char* MODEL_SERVER_NAME = "Entity"; const char* MODEL_SERVER_LOGGING_TARGET_NAME = "entity-server"; const char* LOCAL_MODELS_PERSIST_FILE = "resources/models.svo"; -EntityServer::EntityServer(const QByteArray& packet) +EntityServer::EntityServer(const QByteArray& packet) : OctreeServer(packet), _entitySimulation(NULL) { // nothing special to do here... } @@ -64,7 +64,7 @@ void EntityServer::entityCreated(const EntityItem& newEntity, const SharedNodePo // EntityServer will use the "special packets" to send list of recently deleted entities -bool EntityServer::hasSpecialPacketToSend(const SharedNodePointer& node) { +bool EntityServer::hasSpecialPacketsToSend(const SharedNodePointer& node) { bool shouldSendDeletedEntities = false; // check to see if any new entities have been added since we last sent to this node... @@ -79,9 +79,8 @@ bool EntityServer::hasSpecialPacketToSend(const SharedNodePointer& node) { return shouldSendDeletedEntities; } -int EntityServer::sendSpecialPacket(const SharedNodePointer& node, OctreeQueryNode* queryNode, int& packetsSent) { - unsigned char outputBuffer[MAX_PACKET_SIZE]; - size_t packetLength = 0; +int EntityServer::sendSpecialPackets(const SharedNodePointer& node, OctreeQueryNode* queryNode, int& packetsSent) { + int totalBytes = 0; EntityNodeData* nodeData = static_cast(node->getLinkedData()); if (nodeData) { @@ -91,23 +90,25 @@ int EntityServer::sendSpecialPacket(const SharedNodePointer& node, OctreeQueryNo EntityTree* tree = static_cast(_tree); bool hasMoreToSend = true; - // TODO: is it possible to send too many of these packets? what if you deleted 1,000,000 entities? packetsSent = 0; - while (hasMoreToSend) { - hasMoreToSend = tree->encodeEntitiesDeletedSince(queryNode->getSequenceNumber(), deletedEntitiesSentAt, - outputBuffer, MAX_PACKET_SIZE, packetLength); - DependencyManager::get()->writeDatagram((char*) outputBuffer, packetLength, - SharedNodePointer(node)); - queryNode->packetSent(outputBuffer, packetLength); + while (hasMoreToSend) { + auto specialPacket = tree->encodeEntitiesDeletedSince(queryNode->getSequenceNumber(), deletedEntitiesSentAt, + hasMoreToSend); + + queryNode->packetSent(specialPacket); + + totalBytes += specialPacket->getSizeWithHeader(); packetsSent++; + + DependencyManager::get()->sendPacket(std::move(specialPacket), SharedNodePointer(node)); } nodeData->setLastDeletedEntitiesSentAt(deletePacketSentAt); } // TODO: caller is expecting a packetLength, what if we send more than one packet?? - return packetLength; + return totalBytes; } void EntityServer::pruneDeletedEntities() { @@ -115,7 +116,7 @@ void EntityServer::pruneDeletedEntities() { if (tree->hasAnyDeletedEntities()) { quint64 earliestLastDeletedEntitiesSent = usecTimestampNow() + 1; // in the future - + DependencyManager::get()->eachNode([&earliestLastDeletedEntitiesSent](const SharedNodePointer& node) { if (node->getLinkedData()) { EntityNodeData* nodeData = static_cast(node->getLinkedData()); @@ -125,12 +126,12 @@ void EntityServer::pruneDeletedEntities() { } } }); - + tree->forgetEntitiesDeletedBefore(earliestLastDeletedEntitiesSent); } } -void EntityServer::readAdditionalConfiguration(const QJsonObject& settingsSectionObject) { +void EntityServer::readAdditionalConfiguration(const QJsonObject& settingsSectionObject) { bool wantEditLogging = false; readOptionBool(QString("wantEditLogging"), settingsSectionObject, wantEditLogging); qDebug("wantEditLogging=%s", debug::valueOf(wantEditLogging)); diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index ba80c91b71..b73ace6048 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -37,8 +37,8 @@ public: // subclass may implement these method virtual void beforeRun(); - virtual bool hasSpecialPacketToSend(const SharedNodePointer& node); - virtual int sendSpecialPacket(const SharedNodePointer& node, OctreeQueryNode* queryNode, int& packetsSent); + virtual bool hasSpecialPacketsToSend(const SharedNodePointer& node); + virtual int sendSpecialPackets(const SharedNodePointer& node, OctreeQueryNode* queryNode, int& packetsSent); virtual void entityCreated(const EntityItem& newEntity, const SharedNodePointer& senderNode); virtual void readAdditionalConfiguration(const QJsonObject& settingsSectionObject); diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 173c1dd840..43d6ea9ba6 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -356,7 +356,7 @@ void OctreeQueryNode::dumpOutOfView() { } } -void OctreeQueryNode::packetSent(const NLPacket& packet) { +void OctreeQueryNode::packetSent(const std::unique_ptr& packet) { _sentPacketHistory.packetSent(_sequenceNumber, packet); _sequenceNumber++; } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 045600fd98..3dfe2ad931 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -105,7 +105,7 @@ public: bool isShuttingDown() const { return _isShuttingDown; } void octreePacketSent() { packetSent(_octreePacket); } - void packetSent(const NLPacket& packet); + void packetSent(const std::unique_ptr& packet); OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index c84da23008..ec5c85c3f5 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -45,13 +45,13 @@ public: Octree* getOctree() { return _tree; } JurisdictionMap* getJurisdiction() { return _jurisdiction; } - int getPacketsPerClientPerInterval() const { return std::min(_packetsPerClientPerInterval, + int getPacketsPerClientPerInterval() const { return std::min(_packetsPerClientPerInterval, std::max(1, getPacketsTotalPerInterval() / std::max(1, getCurrentClientCount()))); } int getPacketsPerClientPerSecond() const { return getPacketsPerClientPerInterval() * INTERVALS_PER_SECOND; } int getPacketsTotalPerInterval() const { return _packetsTotalPerInterval; } int getPacketsTotalPerSecond() const { return getPacketsTotalPerInterval() * INTERVALS_PER_SECOND; } - + static int getCurrentClientCount() { return _clientCount; } static void clientConnected() { _clientCount++; } static void clientDisconnected() { _clientCount--; } @@ -72,8 +72,8 @@ public: // subclass may implement these method virtual void beforeRun() { } - virtual bool hasSpecialPacketToSend(const SharedNodePointer& node) { return false; } - virtual int sendSpecialPacket(const SharedNodePointer& node, OctreeQueryNode* queryNode, int& packetsSent) { return 0; } + virtual bool hasSpecialPacketsToSend(const SharedNodePointer& node) { return false; } + virtual int sendSpecialPackets(const SharedNodePointer& node, OctreeQueryNode* queryNode, int& packetsSent) { return 0; } static float SKIP_TIME; // use this for trackXXXTime() calls for non-times @@ -100,7 +100,7 @@ public: static void trackProcessWaitTime(float time); static float getAverageProcessWaitTime() { return _averageProcessWaitTime.getAverage(); } - + // these methods allow us to track which threads got to various states static void didProcess(OctreeSendThread* thread); static void didPacketDistributor(OctreeSendThread* thread); @@ -117,14 +117,14 @@ public: virtual void aboutToFinish(); void forceNodeShutdown(SharedNodePointer node); - + public slots: /// runs the octree server assignment void run(); void nodeAdded(SharedNodePointer node); void nodeKilled(SharedNodePointer node); void sendStatsPacket(); - + void readPendingDatagrams() { }; // this will not be called since our datagram processing thread will handle void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); @@ -170,7 +170,7 @@ protected: JurisdictionSender* _jurisdictionSender; OctreeInboundPacketProcessor* _octreeInboundPacketProcessor; OctreePersistThread* _persistThread; - + int _persistInterval; bool _wantBackup; QString _backupExtensionFormat; @@ -182,7 +182,7 @@ protected: time_t _started; quint64 _startedUSecs; QString _safeServerName; - + static int _clientCount; static SimpleMovingAverage _averageLoopTime; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index c864ed1bca..91f3e9402c 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -863,7 +863,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent if (success) { packetData->endSubTree(); - const unsigned char* finalizedData = packetData->getFinalizedData(); + const char* finalizedData = reinterpret_cast(packetData->getFinalizedData()); int finalizedSize = packetData->getFinalizedSize(); if (finalizedSize <= buffer.size()) { @@ -1084,7 +1084,7 @@ bool EntityItemProperties::encodeEraseEntityMessage(const EntityItemID& entityIt int outputLength = 0; - if (buffer.size() < sizeof(numberOfIds) + NUM_BYTES_RFC4122_UUID) { + if (buffer.size() < (int) (sizeof(numberOfIds) + NUM_BYTES_RFC4122_UUID)) { qCDebug(entities) << "ERROR - encodeEraseEntityMessage() called with buffer that is too small!"; return false; } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 840dd41b54..04a2b321ea 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -760,87 +760,65 @@ bool EntityTree::hasEntitiesDeletedSince(quint64 sinceTime) { } // sinceTime is an in/out parameter - it will be side effected with the last time sent out -bool EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, unsigned char* outputBuffer, - size_t maxLength, size_t& outputLength) { - bool hasMoreToSend = true; +std::unique_ptr EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, + bool& hasMore) { - unsigned char* copyAt = outputBuffer; - size_t numBytesPacketHeader = DependencyManager::get()->populatePacketHeader(reinterpret_cast(outputBuffer), - PacketType::EntityErase); - copyAt += numBytesPacketHeader; - outputLength = numBytesPacketHeader; + auto deletesPacket = NLPacket::create(PacketType::EntityErase); // pack in flags OCTREE_PACKET_FLAGS flags = 0; - OCTREE_PACKET_FLAGS* flagsAt = (OCTREE_PACKET_FLAGS*)copyAt; - *flagsAt = flags; - copyAt += sizeof(OCTREE_PACKET_FLAGS); - outputLength += sizeof(OCTREE_PACKET_FLAGS); + deletesPacket->writePrimitive(flags); // pack in sequence number - OCTREE_PACKET_SEQUENCE* sequenceAt = (OCTREE_PACKET_SEQUENCE*)copyAt; - *sequenceAt = sequenceNumber; - copyAt += sizeof(OCTREE_PACKET_SEQUENCE); - outputLength += sizeof(OCTREE_PACKET_SEQUENCE); + deletesPacket->writePrimitive(sequenceNumber); // pack in timestamp OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); - OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)copyAt; - *timeAt = now; - copyAt += sizeof(OCTREE_PACKET_SENT_TIME); - outputLength += sizeof(OCTREE_PACKET_SENT_TIME); - - uint16_t numberOfIds = 0; // placeholder for now - unsigned char* numberOfIDsAt = copyAt; - memcpy(copyAt, &numberOfIds, sizeof(numberOfIds)); - copyAt += sizeof(numberOfIds); - outputLength += sizeof(numberOfIds); + deletesPacket->writePrimitive(now); // we keep a multi map of entity IDs to timestamps, we only want to include the entity IDs that have been // deleted since we last sent to this node _recentlyDeletedEntitiesLock.lockForRead(); - QMultiMap::const_iterator iterator = _recentlyDeletedEntityItemIDs.constBegin(); - while (iterator != _recentlyDeletedEntityItemIDs.constEnd()) { - QList values = _recentlyDeletedEntityItemIDs.values(iterator.key()); + bool hasFilledPacket = false; + + auto it = _recentlyDeletedEntityItemIDs.constBegin(); + while (it != _recentlyDeletedEntityItemIDs.constEnd()) { + QList values = _recentlyDeletedEntityItemIDs.values(it.key()); for (int valueItem = 0; valueItem < values.size(); ++valueItem) { // if the timestamp is more recent then out last sent time, include it - if (iterator.key() > sinceTime) { + if (it.key() > sinceTime) { QUuid entityID = values.at(valueItem); - QByteArray encodedEntityID = entityID.toRfc4122(); - memcpy(copyAt, encodedEntityID.constData(), NUM_BYTES_RFC4122_UUID); - copyAt += NUM_BYTES_RFC4122_UUID; - outputLength += NUM_BYTES_RFC4122_UUID; - numberOfIds++; + deletesPacket->write(entityID.toRfc4122()); - // check to make sure we have room for one more id... - if (outputLength + NUM_BYTES_RFC4122_UUID > maxLength) { + // check to make sure we have room for one more ID + if (NUM_BYTES_RFC4122_UUID > deletesPacket->bytesAvailable()) { + hasFilledPacket = true; break; } } } - // check to make sure we have room for one more id... - if (outputLength + NUM_BYTES_RFC4122_UUID > maxLength) { - + // check to see if we're about to return + if (hasFilledPacket) { // let our caller know how far we got - sinceTime = iterator.key(); + sinceTime = it.key(); + break; } - ++iterator; + + ++it; } // if we got to the end, then we're done sending - if (iterator == _recentlyDeletedEntityItemIDs.constEnd()) { - hasMoreToSend = false; + if (it == _recentlyDeletedEntityItemIDs.constEnd()) { + hasMore = false; } + _recentlyDeletedEntitiesLock.unlock(); - // replace the correct count for ids included - memcpy(numberOfIDsAt, &numberOfIds, sizeof(numberOfIds)); - - return hasMoreToSend; + return std::move(deletesPacket); } diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 179c80eb77..1f0ccd6fa0 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -129,8 +129,8 @@ public: bool hasAnyDeletedEntities() const { return _recentlyDeletedEntityItemIDs.size() > 0; } bool hasEntitiesDeletedSince(quint64 sinceTime); - bool encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, - unsigned char* packetData, size_t maxLength, size_t& outputLength); + std::unique_ptr encodeEntitiesDeletedSince(OCTREE_PACKET_SEQUENCE sequenceNumber, quint64& sinceTime, + bool& hasMore); void forgetEntitiesDeletedBefore(quint64 sinceTime); int processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index b5b5284dde..d4209258d2 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -32,6 +32,15 @@ template std::unique_ptr PacketList::createPacketWithExte } } +template qint64 Packet::readPrimitive(T* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(T)); +} + +template qint64 Packet::writePrimitive(const T& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(T)); +} + template qint64 PacketList::writeData(const char* data, qint64 maxSize) { if (!_currentPacket) { // we don't have a current packet, time to set one up diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 64d8871dda..851949ac07 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -29,13 +29,21 @@ public: int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); } + void getCurrentPacketCapacity() const { return _currentPacket->bytesAvailable(); } + void closeCurrentPacket(); void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } + + template qint64 readPrimitive(U* data); + template qint64 writePrimitive(const U& data); protected: qint64 writeData(const char* data, qint64 maxSize); qint64 readData(char* data, qint64 maxSize) { return 0; } private: + PacketList(const PacketList& other) = delete; + PacketList& operator=(const PacketList& other) = delete; + std::unique_ptr createPacketWithExtendedHeader(); PacketType::Value _packetType; From 9c18277e9c4a8213a56cd0edb4318371811991f6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:24:42 -0700 Subject: [PATCH 188/582] packet fixes in script-engine and Application --- interface/src/Application.cpp | 21 ++-- libraries/script-engine/src/ScriptEngine.cpp | 102 +++++++++---------- 2 files changed, 63 insertions(+), 60 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dfa082719a..ff44675dc1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2660,15 +2660,17 @@ int Application::sendNackPackets() { return 0; } - NLPacketList nackPacketList(PacketType::OctreeDataNack); - // iterates thru all nodes in NodeList auto nodeList = DependencyManager::get(); + int packetsSent = 0; + nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getActiveSocket() && node->getType() == NodeType::EntityServer) { + NLPacketList nackPacketList(PacketType::OctreeDataNack); + QUuid nodeUUID = node->getUUID(); // if there are octree packets from this node that are waiting to be processed, @@ -2698,18 +2700,19 @@ int Application::sendNackPackets() { auto it = missingSequenceNumbers.constBegin(); while (it != missingSequenceNumbers.constEnd()) { OCTREE_PACKET_SEQUENCE missingNumber = *it; - nackPacketList->write(&missingNumber, sizeof(OCTREE_PACKET_SEQUENCE)); + nackPacketList->writePrimitive(missingNumber); ++it; } + + if (nackPacketList.getNumPackets()) { + packetsSent += nackPacketList.getNumPackets(); + + // send the packet list + nodeList->sendPacketList(nackPacketList, node); + } } }); - int packetsSent = nackPacketList.getNumPackets(); - - if (packetsSent) { - // send the packet list - nodeList->sendPacketList(nackPacketList, node); - } return packetsSent; } diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 61f0ed8d37..e265fd3c8d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -121,7 +121,7 @@ bool ScriptEngine::_doneRunningThisScript = false; void ScriptEngine::stopAllScripts(QObject* application) { _allScriptsMutex.lock(); _stoppingAllScripts = true; - + QMutableSetIterator i(_allKnownScriptEngines); while (i.hasNext()) { ScriptEngine* scriptEngine = i.next(); @@ -130,14 +130,14 @@ void ScriptEngine::stopAllScripts(QObject* application) { // NOTE: typically all script engines are running. But there's at least one known exception to this, the // "entities sandbox" which is only used to evaluate entities scripts to test their validity before using - // them. We don't need to stop scripts that aren't running. + // them. We don't need to stop scripts that aren't running. if (scriptEngine->isRunning()) { - + // If the script is running, but still evaluating then we need to wait for its evaluation step to // complete. After that we can handle the stop process appropriately if (scriptEngine->evaluatePending()) { while (scriptEngine->evaluatePending()) { - + // This event loop allows any started, but not yet finished evaluate() calls to complete // we need to let these complete so that we can be guaranteed that the script engine isn't // in a partially setup state, which can confuse our shutdown unwinding. @@ -147,11 +147,11 @@ void ScriptEngine::stopAllScripts(QObject* application) { } } - // We disconnect any script engine signals from the application because we don't want to do any + // We disconnect any script engine signals from the application because we don't want to do any // extra stopScript/loadScript processing that the Application normally does when scripts start // and stop. We can safely short circuit this because we know we're in the "quitting" process scriptEngine->disconnect(application); - + // Calling stop on the script engine will set it's internal _isFinished state to true, and result // in the ScriptEngine gracefully ending it's run() method. scriptEngine->stop(); @@ -160,7 +160,7 @@ void ScriptEngine::stopAllScripts(QObject* application) { // want any of the scripts final "scriptEnding()" or pending "update()" methods from accessing // any application state after we leave this stopAllScripts() method scriptEngine->waitTillDoneRunning(); - + // If the script is stopped, we can remove it from our set i.remove(); } @@ -177,26 +177,26 @@ void ScriptEngine::waitTillDoneRunning() { if (_isRunning) { _doneRunningThisScript = false; // NOTE: this is static, we serialize our waiting for scripts to finish - + // NOTE: waitTillDoneRunning() will be called on the main Application thread, inside of stopAllScripts() - // we want the application thread to continue to process events, because the scripts will likely need to + // we want the application thread to continue to process events, because the scripts will likely need to // marshall messages across to the main thread. For example if they access Settings or Meny in any of their // shutdown code. while (!_doneRunningThisScript) { - + // process events for the main application thread, allowing invokeMethod calls to pass between threads QCoreApplication::processEvents(); } } } -QString ScriptEngine::getFilename() const { +QString ScriptEngine::getFilename() const { QStringList fileNameParts = _fileNameString.split("/"); QString lastPart; if (!fileNameParts.isEmpty()) { lastPart = fileNameParts.last(); } - return lastPart; + return lastPart; } @@ -259,15 +259,15 @@ void ScriptEngine::loadURL(const QUrl& scriptURL, bool reload) { _fileNameString = scriptURL.toString(); _isReloading = reload; - + QUrl url(scriptURL); - + // if the scheme length is one or lower, maybe they typed in a file, let's try const int WINDOWS_DRIVE_LETTER_SIZE = 1; if (url.scheme().size() <= WINDOWS_DRIVE_LETTER_SIZE) { url = QUrl::fromLocalFile(_fileNameString); } - + // ok, let's see if it's valid... and if so, load it if (url.isValid()) { if (url.scheme() == "file") { @@ -304,7 +304,7 @@ void ScriptEngine::init() { if (_isInitialized) { return; // only initialize once } - + _isInitialized = true; auto entityScriptingInterface = DependencyManager::get(); @@ -318,7 +318,7 @@ void ScriptEngine::init() { registerAnimationTypes(this); registerAvatarTypes(this); registerAudioMetaTypes(this); - + if (_controllerScriptingInterface) { _controllerScriptingInterface->registerControllerTypes(this); } @@ -341,7 +341,7 @@ void ScriptEngine::init() { QScriptValue audioEffectOptionsConstructorValue = newFunction(AudioEffectOptions::constructor); globalObject().setProperty("AudioEffectOptions", audioEffectOptionsConstructorValue); - + qScriptRegisterMetaType(this, injectorToScriptValue, injectorFromScriptValue); qScriptRegisterMetaType(this, inputControllerToScriptValue, inputControllerFromScriptValue); qScriptRegisterMetaType(this, avatarDataToScriptValue, avatarDataFromScriptValue); @@ -436,7 +436,7 @@ void ScriptEngine::addEventHandler(const EntityItemID& entityID, const QString& [=](const EntityItemID& entityID) { _registeredHandlers.remove(entityID); }); - + // Two common cases of event handler, differing only in argument signature. auto makeSingleEntityHandler = [=](const QString& eventName) -> std::function { return [=](const EntityItemID& entityItemID) -> void { @@ -454,19 +454,19 @@ void ScriptEngine::addEventHandler(const EntityItemID& entityID, const QString& }; connect(entities.data(), &EntityScriptingInterface::enterEntity, this, makeSingleEntityHandler("enterEntity")); connect(entities.data(), &EntityScriptingInterface::leaveEntity, this, makeSingleEntityHandler("leaveEntity")); - + connect(entities.data(), &EntityScriptingInterface::mousePressOnEntity, this, makeMouseHandler("mousePressOnEntity")); connect(entities.data(), &EntityScriptingInterface::mouseMoveOnEntity, this, makeMouseHandler("mouseMoveOnEntity")); connect(entities.data(), &EntityScriptingInterface::mouseReleaseOnEntity, this, makeMouseHandler("mouseReleaseOnEntity")); - + connect(entities.data(), &EntityScriptingInterface::clickDownOnEntity, this, makeMouseHandler("clickDownOnEntity")); connect(entities.data(), &EntityScriptingInterface::holdingClickOnEntity, this, makeMouseHandler("holdingClickOnEntity")); connect(entities.data(), &EntityScriptingInterface::clickReleaseOnEntity, this, makeMouseHandler("clickReleaseOnEntity")); - + connect(entities.data(), &EntityScriptingInterface::hoverEnterEntity, this, makeMouseHandler("hoverEnterEntity")); connect(entities.data(), &EntityScriptingInterface::hoverOverEntity, this, makeMouseHandler("hoverOverEntity")); connect(entities.data(), &EntityScriptingInterface::hoverLeaveEntity, this, makeMouseHandler("hoverLeaveEntity")); - + connect(entities.data(), &EntityScriptingInterface::collisionWithEntity, this, [=](const EntityItemID& idA, const EntityItemID& idB, const Collision& collision) { generalHandler(idA, "collisionWithEntity", [=]() { @@ -587,10 +587,12 @@ void ScriptEngine::run() { / (1000 * 1000)) + 0.5); const int SCRIPT_AUDIO_BUFFER_BYTES = SCRIPT_AUDIO_BUFFER_SAMPLES * sizeof(int16_t); - QByteArray avatarPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::AvatarData); - avatarPacket.append(_avatarData->toByteArray()); + QByteArray avatarByteArray = _avatarData->toByteArray(); + auto avatarPacket = NLPacket::create(PacketType::AvatarData); - nodeList->broadcastToNodes(avatarPacket, NodeSet() << NodeType::AvatarMixer); + avatarPacket->write(avatarByteArray); + + nodeList->broadcastToNodes(std::move(avatarPacket), NodeSet() << NodeType::AvatarMixer); if (_isListeningToAudioStream || _avatarSound) { // if we have an avatar audio stream then send it out to our audio-mixer @@ -627,16 +629,13 @@ void ScriptEngine::run() { _numAvatarSoundSentBytes = 0; } } - - QByteArray audioPacket = nodeList->byteArrayWithPopulatedHeader(silentFrame - ? PacketType::SilentAudioFrame - : PacketType::MicrophoneAudioNoEcho); - QDataStream packetStream(&audioPacket, QIODevice::Append); + auto audioPacket = NLPacket::create(silentFrame + ? PacketType::SilentAudioFrame + : PacketType::MicrophoneAudioNoEcho); - // pack a placeholder value for sequence number for now, will be packed when destination node is known - int numPreSequenceNumberBytes = audioPacket.size(); - packetStream << (quint16) 0; + // seek past the sequence number, will be packed when destination node is known + audioPacket->seek(sizeof(quint16)); if (silentFrame) { if (!_isListeningToAudioStream) { @@ -645,37 +644,38 @@ void ScriptEngine::run() { } // write the number of silent samples so the audio-mixer can uphold timing - packetStream.writeRawData(reinterpret_cast(&SCRIPT_AUDIO_BUFFER_SAMPLES), sizeof(int16_t)); + audioPacket->writePrimitive(SCRIPT_AUDIO_BUFFER_SAMPLES); // use the orientation and position of this avatar for the source of this audio - packetStream.writeRawData(reinterpret_cast(&_avatarData->getPosition()), sizeof(glm::vec3)); + audioPacket->writePrimitive(_avatarData->getPosition()); glm::quat headOrientation = _avatarData->getHeadOrientation(); - packetStream.writeRawData(reinterpret_cast(&headOrientation), sizeof(glm::quat)); + audioPacket->writePrimitive(headOrientation); } else if (nextSoundOutput) { // assume scripted avatar audio is mono and set channel flag to zero - packetStream << (quint8)0; + audioPacket->writePrimitive((quint8) 0); // use the orientation and position of this avatar for the source of this audio - packetStream.writeRawData(reinterpret_cast(&_avatarData->getPosition()), sizeof(glm::vec3)); + audioPacket->writePrimitive(_avatarData->getPosition()); glm::quat headOrientation = _avatarData->getHeadOrientation(); - packetStream.writeRawData(reinterpret_cast(&headOrientation), sizeof(glm::quat)); + audioPacket->writePrimitive(headOrientation); // write the raw audio data - packetStream.writeRawData(reinterpret_cast(nextSoundOutput), numAvailableSamples * sizeof(int16_t)); + audioPacket->write(reinterpret_cast(nextSoundOutput), numAvailableSamples * sizeof(int16_t)); } - + // write audio packet to AudioMixer nodes auto nodeList = DependencyManager::get(); - nodeList->eachNode([this, &nodeList, &audioPacket, &numPreSequenceNumberBytes](const SharedNodePointer& node){ + nodeList->eachNode([this, &nodeList, &audioPacket](const SharedNodePointer& node){ // only send to nodes of type AudioMixer if (node->getType() == NodeType::AudioMixer) { // pack sequence number quint16 sequence = _outgoingScriptAudioSequenceNumbers[node->getUUID()]++; - memcpy(audioPacket.data() + numPreSequenceNumberBytes, &sequence, sizeof(quint16)); - + audioPacket->seek(0); + audioPacket->writePrimitive(sequence); + // send audio packet - nodeList->writeDatagram(audioPacket, node); + nodeList->sendPacket(std::move(audioPacket), node); } }); } @@ -695,7 +695,7 @@ void ScriptEngine::run() { emit update(deltaTime); } lastUpdate = now; - + } stopAllTimers(); // make sure all our timers are stopped if the script is ending @@ -750,13 +750,13 @@ void ScriptEngine::stop() { void ScriptEngine::timerFired() { QTimer* callingTimer = reinterpret_cast(sender()); QScriptValue timerFunction = _timerFunctionMap.value(callingTimer); - + if (!callingTimer->isActive()) { // this timer is done, we can kill it _timerFunctionMap.remove(callingTimer); delete callingTimer; } - + // call the associated JS function, if it exists if (timerFunction.isValid()) { timerFunction.call(); @@ -850,7 +850,7 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac } BatchLoader* loader = new BatchLoader(urls); - + auto evaluateScripts = [=](const QMap& data) { for (QUrl url : urls) { QString contents = data[url]; @@ -884,7 +884,7 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac void ScriptEngine::include(const QString& includeFile, QScriptValue callback) { if (_stoppingAllScripts) { - qCDebug(scriptengine) << "Script.include() while shutting down is ignored... " + qCDebug(scriptengine) << "Script.include() while shutting down is ignored... " << "includeFile:" << includeFile << "parent script:" << getFilename(); return; // bail early } From 791c7e2de1626ddb8b2cbe310c7bd4ccbd5359a7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:25:56 -0700 Subject: [PATCH 189/582] re-expose readDatagram to get back to build for writes --- libraries/networking/src/LimitedNodeList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 1eb687fe82..3aadb8373d 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -129,7 +129,7 @@ public: // int populatePacketHeader(char* packet, PacketType::Value packetType) // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } -// qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); + qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); // // qint64 writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, // const HifiSockAddr& overridenSockAddr = HifiSockAddr()); From dc7c268467810cd2bd05a3f90edc3afdc2f4b223 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:27:10 -0700 Subject: [PATCH 190/582] fixes for changed API in Application --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ff44675dc1..65cb3d642d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2700,7 +2700,7 @@ int Application::sendNackPackets() { auto it = missingSequenceNumbers.constBegin(); while (it != missingSequenceNumbers.constEnd()) { OCTREE_PACKET_SEQUENCE missingNumber = *it; - nackPacketList->writePrimitive(missingNumber); + nackPacketList.writePrimitive(missingNumber); ++it; } @@ -2885,7 +2885,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp } // encode the query data - int packetSize = _octreeQuery.getBroadcastData(queryPacket.payload()); + int packetSize = _octreeQuery.getBroadcastData(queryPacket->getPayload()); queryPacket->setSizeUsed(packetSize); // make sure we still have an active socket From dfa5be1a0cbee6229f6a4c067781e1622141eeb8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:35:04 -0700 Subject: [PATCH 191/582] fix for killPacket in MyAvatar and DatagramProcessor header check --- interface/src/DatagramProcessor.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index cb95e1d104..6be6291671 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -113,7 +113,7 @@ void DatagramProcessor::processDatagrams() { break; } case PacketType::DomainConnectionDenied: { - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeDomainConnectionDenied); + int headerSize = 0; QDataStream packetStream(QByteArray(incomingPacket.constData() + headerSize, incomingPacket.size() - headerSize)); QString reason; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index e6eba84c23..3333b82f16 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -865,9 +865,8 @@ int MyAvatar::parseDataAtOffset(const QByteArray& packet, int offset) { } void MyAvatar::sendKillAvatar() { - auto nodeList = DependencyManager::get(); - QByteArray killPacket = nodeList->byteArrayWithPopulatedHeader(PacketType::KillAvatar); - nodeList->broadcastToNodes(killPacket, NodeSet() << NodeType::AvatarMixer); + auto killPacket = NLPacket::create(PacketType::KillAvatar, 0); + DependencyManager::get()->broadcastToNodes(killPacket, NodeSet() << NodeType::AvatarMixer); } void MyAvatar::updateLookAtTargetAvatar() { @@ -1402,7 +1401,7 @@ glm::vec3 MyAvatar::applyKeyboardMotor(float deltaTime, const glm::vec3& localVe } } } - + float boomChange = _driveKeys[BOOM_OUT] - _driveKeys[BOOM_IN]; _boomLength += 2.0f * _boomLength * boomChange + boomChange * boomChange; _boomLength = glm::clamp(_boomLength, ZOOM_MIN, ZOOM_MAX); From c5840d085cf1931f1ba4c0d076ddf7e256f3c6ea Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:35:56 -0700 Subject: [PATCH 192/582] replace packet header size check with 0 --- interface/src/DatagramProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 6be6291671..c397e9222d 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -135,7 +135,7 @@ void DatagramProcessor::processDatagrams() { glm::vec3 position; float radius; - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketTypeMuteEnvironment); + int headerSize = 0; memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), From cf15cbc62f484e7e4c9dd87197d493ce5faa2fa4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:37:25 -0700 Subject: [PATCH 193/582] fix a cast, move a packet --- interface/src/Application.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- interface/src/octree/OctreePacketProcessor.cpp | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 65cb3d642d..b952fa9d5e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2885,7 +2885,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp } // encode the query data - int packetSize = _octreeQuery.getBroadcastData(queryPacket->getPayload()); + int packetSize = _octreeQuery.getBroadcastData(reinterpret_cast(queryPacket->getPayload())); queryPacket->setSizeUsed(packetSize); // make sure we still have an active socket diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 3333b82f16..34a2b3decb 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -866,7 +866,7 @@ int MyAvatar::parseDataAtOffset(const QByteArray& packet, int offset) { void MyAvatar::sendKillAvatar() { auto killPacket = NLPacket::create(PacketType::KillAvatar, 0); - DependencyManager::get()->broadcastToNodes(killPacket, NodeSet() << NodeType::AvatarMixer); + DependencyManager::get()->broadcastToNodes(std::move(killPacket), NodeSet() << NodeType::AvatarMixer); } void MyAvatar::updateLookAtTargetAvatar() { diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index c5b4d2a4a7..82d7264131 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -19,7 +19,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "OctreePacketProcessor::processPacket()"); - + QByteArray mutablePacket = packet; const int WAY_BEHIND = 300; @@ -34,7 +34,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, PacketType::Value voxelPacketType = packetTypeForPacket(mutablePacket); - + // note: PacketType_OCTREE_STATS can have PacketType_VOXEL_DATA // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first // then process any remaining bytes as if it was another packet @@ -43,7 +43,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, wasStatsPacket = true; if (messageLength > statsMessageLength) { mutablePacket = mutablePacket.mid(statsMessageLength); - + // TODO: this does not look correct, the goal is to test the packet version for the piggyback, but // this is testing the version and hash of the original packet if (!DependencyManager::get()->packetVersionAndHashMatch(packet)) { @@ -54,28 +54,28 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, return; // bail since no piggyback data } } // fall through to piggyback message - + voxelPacketType = packetTypeForPacket(mutablePacket); PacketVersion packetVersion = mutablePacket[1]; PacketVersion expectedVersion = versionForPacketType(voxelPacketType); - + // check version of piggyback packet against expected version if (packetVersion != expectedVersion) { - static QMultiMap versionDebugSuppressMap; - + static QMultiMap versionDebugSuppressMap; + QUuid senderUUID = uuidFromPacketHeader(packet); if (!versionDebugSuppressMap.contains(senderUUID, voxelPacketType)) { qDebug() << "Packet version mismatch on" << voxelPacketType << "- Sender" << senderUUID << "sent" << (int)packetVersion << "but" << (int)expectedVersion << "expected."; - + emit packetVersionMismatch(); versionDebugSuppressMap.insert(senderUUID, voxelPacketType); } return; // bail since piggyback version doesn't match } - + app->trackIncomingOctreePacket(mutablePacket, sendingNode, wasStatsPacket); if (sendingNode) { From b0b8dd2e7d69fee4c46eb3963e4b4ff775a12b25 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:46:06 -0700 Subject: [PATCH 194/582] add back readDatagram to get to build --- libraries/networking/src/LimitedNodeList.cpp | 24 +++++++++----------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 029bac7c9c..c85fb730ee 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -219,20 +219,18 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { return false; } -// qint64 LimitedNodeList::readDatagram(char* data, qint64 maxSize, QHostAddress* address = 0, quint16 * port = 0) { +qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* address = 0, quint16* port = 0) { + qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); -//qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* address = 0, quint16* port = 0) { -// qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); -// -// SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); -// if (sendingNode) { -// emit dataReceived(sendingNode->getType(), incomingPacket.size()); -// } else { -// emit dataReceived(NodeType::Unassigned, incomingPacket.size()); -// } -// -// return result; -//} + SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); + if (sendingNode) { + emit dataReceived(sendingNode->getType(), incomingPacket.size()); + } else { + emit dataReceived(NodeType::Unassigned, incomingPacket.size()); + } + + return result; +} qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { // XXX can BandwidthRecorder be used for this? From 86a218ad20b64e40bd93f600104a99cfa446f75f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:52:15 -0700 Subject: [PATCH 195/582] fix for templated read/write in PacketList --- libraries/networking/src/LimitedNodeList.cpp | 4 ++-- libraries/networking/src/PacketList.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index c85fb730ee..901788b1f3 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -551,7 +551,7 @@ std::unique_ptr LimitedNodeList::constructPingReplyPacket(const QByteA return replyPacket; } -std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { +std::unique_ptr LimitedNodeList::constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); auto icePingPacket = NLPacket::create(PacketType::ICEPing, packetSize); @@ -562,7 +562,7 @@ std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUui return icePingPacket; } -std::unique_ptr constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { +std::unique_ptr LimitedNodeList::constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { // pull out the ping type so we can reply back with that PingType_t pingType; diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index d4209258d2..db0b4fc90c 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -32,13 +32,13 @@ template std::unique_ptr PacketList::createPacketWithExte } } -template qint64 Packet::readPrimitive(T* data) { - return QIODevice::read(reinterpret_cast(data), sizeof(T)); +template template qint64 PacketList::readPrimitive(U* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(U)); } -template qint64 Packet::writePrimitive(const T& data) { - static_assert(!std::is_pointer::value, "T must not be a pointer"); - return QIODevice::write(reinterpret_cast(&data), sizeof(T)); +template template qint64 PacketList::writePrimitive(const U& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(U)); } template qint64 PacketList::writeData(const char* data, qint64 maxSize) { From 658ad6bd029c6f275aeac3713aac5faf0c64b287 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:55:26 -0700 Subject: [PATCH 196/582] fix eachNode lambda in Application --- interface/src/Application.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 524a46a5b5..0d729711d8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2664,7 +2664,7 @@ int Application::sendNackPackets() { return 0; } - // iterates thru all nodes in NodeList + // iterates through all nodes in NodeList auto nodeList = DependencyManager::get(); int packetsSent = 0; @@ -2680,7 +2680,7 @@ int Application::sendNackPackets() { // if there are octree packets from this node that are waiting to be processed, // don't send a NACK since the missing packets may be among those waiting packets. if (_octreeProcessor.hasPacketsToProcessFrom(nodeUUID)) { - return 0; + packetsSent = 0; } _octreeSceneStatsLock.lockForRead(); @@ -2688,7 +2688,7 @@ int Application::sendNackPackets() { // retreive octree scene stats of this node if (_octreeServerSceneStats.find(nodeUUID) == _octreeServerSceneStats.end()) { _octreeSceneStatsLock.unlock(); - return 0; + packetsSent = 0; } // get sequence number stats of node, prune its missing set, and make a copy of the missing set From 8f900d22ca1119f55b8bc95393fa4879c157988d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 18:58:35 -0700 Subject: [PATCH 197/582] prefer typename to class for templates --- libraries/networking/src/PacketList.cpp | 12 ++++++------ libraries/networking/src/PacketList.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index db0b4fc90c..8a89058144 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -15,13 +15,13 @@ #include "NLPacket.h" -template PacketList::PacketList(PacketType::Value packetType) : +template PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType) { } -template std::unique_ptr PacketList::createPacketWithExtendedHeader() { +template std::unique_ptr PacketList::createPacketWithExtendedHeader() { // use the static create method to create a new packet auto packet = T::create(_packetType); @@ -32,16 +32,16 @@ template std::unique_ptr PacketList::createPacketWithExte } } -template template qint64 PacketList::readPrimitive(U* data) { +template template qint64 PacketList::readPrimitive(U* data) { return QIODevice::read(reinterpret_cast(data), sizeof(U)); } -template template qint64 PacketList::writePrimitive(const U& data) { +template template qint64 PacketList::writePrimitive(const U& data) { static_assert(!std::is_pointer::value, "T must not be a pointer"); return QIODevice::write(reinterpret_cast(&data), sizeof(U)); } -template qint64 PacketList::writeData(const char* data, qint64 maxSize) { +template qint64 PacketList::writeData(const char* data, qint64 maxSize) { if (!_currentPacket) { // we don't have a current packet, time to set one up _currentPacket = createPacketWithExtendedHeader(); @@ -112,7 +112,7 @@ template qint64 PacketList::writeData(const char* data, qint64 maxS } } -template void PacketList::closeCurrentPacket() { +template void PacketList::closeCurrentPacket() { // move the current packet to our list of packets _packets.insert(std::move(_currentPacket)); } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 851949ac07..8fd901d28a 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -18,7 +18,7 @@ class NLPacket; -template class PacketList : public QIODevice { +template class PacketList : public QIODevice { public: PacketList(PacketType::Value packetType); From c2ae73650cfc14ba0987027e9097d8f0e554fdb0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 19:03:42 -0700 Subject: [PATCH 198/582] go back to writing the number of deleted IDs --- libraries/entities/src/EntityTree.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index faa47870f9..49b5990d8c 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -772,6 +772,11 @@ std::unique_ptr EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_S OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); deletesPacket->writePrimitive(now); + // figure out where we are now and pack a temporary number of IDs + uint16_t numberOfIDs = 0; + qint64 numberOfIDsPos = deletesPacket->pos(); + deletesPacket->writePrimitive(numberOfIDs); + // we keep a multi map of entity IDs to timestamps, we only want to include the entity IDs that have been // deleted since we last sent to this node _recentlyDeletedEntitiesLock.lockForRead(); @@ -788,6 +793,8 @@ std::unique_ptr EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_S QUuid entityID = values.at(valueItem); deletesPacket->write(entityID.toRfc4122()); + ++numberOfIDs; + // check to make sure we have room for one more ID if (NUM_BYTES_RFC4122_UUID > deletesPacket->bytesAvailable()) { hasFilledPacket = true; @@ -814,6 +821,10 @@ std::unique_ptr EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_S _recentlyDeletedEntitiesLock.unlock(); + // replace the count for the number of included IDs + deletesPacket->seek(numberOfIDsPos); + deletesPacket->writePrimitive(numberOfIDs); + return std::move(deletesPacket); } From cf7ae5fbf513807e6bea797568a34f72b66d58af Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 19:06:42 -0700 Subject: [PATCH 199/582] fix templated write/read in PacketList --- libraries/networking/src/PacketList.cpp | 9 --------- libraries/networking/src/PacketList.h | 10 ++++++++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 8a89058144..30bcb5a89f 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -32,15 +32,6 @@ template std::unique_ptr PacketList::createPacketWithE } } -template template qint64 PacketList::readPrimitive(U* data) { - return QIODevice::read(reinterpret_cast(data), sizeof(U)); -} - -template template qint64 PacketList::writePrimitive(const U& data) { - static_assert(!std::is_pointer::value, "T must not be a pointer"); - return QIODevice::write(reinterpret_cast(&data), sizeof(U)); -} - template qint64 PacketList::writeData(const char* data, qint64 maxSize) { if (!_currentPacket) { // we don't have a current packet, time to set one up diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 8fd901d28a..8a8d589f30 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -35,8 +35,14 @@ public: void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } - template qint64 readPrimitive(U* data); - template qint64 writePrimitive(const U& data); + template qint64 readPrimitive(U* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(U)); + } + + template qint64 writePrimitive(const U& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(U)); + } protected: qint64 writeData(const char* data, qint64 maxSize); qint64 readData(char* data, qint64 maxSize) { return 0; } From f6fbc14f5aece34d8f3694c66b34cc63f1f7de81 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 19:07:45 -0700 Subject: [PATCH 200/582] put Packet templates in header --- libraries/networking/src/Packet.cpp | 9 --------- libraries/networking/src/Packet.h | 10 ++++++++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index d0dbf7d7d7..aa0b407398 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -157,15 +157,6 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { &seqNum, sizeof(seqNum)); } -template qint64 Packet::readPrimitive(T* data) { - return QIODevice::read(reinterpret_cast(data), sizeof(T)); -} - -template qint64 Packet::writePrimitive(const T& data) { - static_assert(!std::is_pointer::value, "T must not be a pointer"); - return QIODevice::write(reinterpret_cast(&data), sizeof(T)); -} - static const qint64 PACKET_WRITE_ERROR = -1; qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 0607aa2636..fea9c91db1 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -59,8 +59,14 @@ public: virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } virtual qint64 size() const { return _capacity; } - template qint64 readPrimitive(T* data); - template qint64 writePrimitive(const T& data); + template qint64 readPrimitive(T* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(T)); + } + + template qint64 writePrimitive(const T& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(T)); + } protected: Packet(PacketType::Value type, int64_t size); From 04e7b8cd02e862a4590afda4f000cd1ac7ee891b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 19:10:13 -0700 Subject: [PATCH 201/582] fix static assert error message --- libraries/networking/src/PacketList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 8a8d589f30..ac0504836d 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -40,7 +40,7 @@ public: } template qint64 writePrimitive(const U& data) { - static_assert(!std::is_pointer::value, "T must not be a pointer"); + static_assert(!std::is_pointer::value, "U must not be a pointer"); return QIODevice::write(reinterpret_cast(&data), sizeof(U)); } protected: From 8c188d64781a4c34fad44bcf27bdb53750da81bb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 19:12:56 -0700 Subject: [PATCH 202/582] move templates below class in PacketList --- libraries/networking/src/PacketList.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index ac0504836d..4cf694f6b8 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -35,14 +35,8 @@ public: void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } - template qint64 readPrimitive(U* data) { - return QIODevice::read(reinterpret_cast(data), sizeof(U)); - } - - template qint64 writePrimitive(const U& data) { - static_assert(!std::is_pointer::value, "U must not be a pointer"); - return QIODevice::write(reinterpret_cast(&data), sizeof(U)); - } + template qint64 readPrimitive(U* data); + template qint64 writePrimitive(const U& data); protected: qint64 writeData(const char* data, qint64 maxSize); qint64 readData(char* data, qint64 maxSize) { return 0; } @@ -63,4 +57,14 @@ private: QByteArray _extendedHeader; }; +template template readPrimitive(U* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(U)); +} + +template template writePrimitive(const U& data) { + static_assert(!std::is_pointer::value, "U must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(U)); +} + + #endif // hifi_PacketList_h From 263e73713782d0b1ba5c70b78e28f8a7c07a1b28 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 19:13:01 -0700 Subject: [PATCH 203/582] Move template func body outside of class --- libraries/networking/src/Packet.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index fea9c91db1..6a50690878 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -59,14 +59,8 @@ public: virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } virtual qint64 size() const { return _capacity; } - template qint64 readPrimitive(T* data) { - return QIODevice::read(reinterpret_cast(data), sizeof(T)); - } - - template qint64 writePrimitive(const T& data) { - static_assert(!std::is_pointer::value, "T must not be a pointer"); - return QIODevice::write(reinterpret_cast(&data), sizeof(T)); - } + template qint64 readPrimitive(T* data); + template qint64 writePrimitive(const T& data); protected: Packet(PacketType::Value type, int64_t size); @@ -94,4 +88,14 @@ protected: qint64 _sizeUsed = 0; // How much of the payload is actually used }; + +template qint64 readPrimitive(T* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(T)); +} + +template qint64 writePrimitive(const T& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(T)); +} + #endif // hifi_Packet_h From 0d1c4a4177fc8ee41717c8724c963bc26820bfc1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 19:14:32 -0700 Subject: [PATCH 204/582] add classes to templated methods --- libraries/networking/src/Packet.h | 4 ++-- libraries/networking/src/PacketList.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 6a50690878..373c12356a 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -89,11 +89,11 @@ protected: }; -template qint64 readPrimitive(T* data) { +template qint64 Packet::readPrimitive(T* data) { return QIODevice::read(reinterpret_cast(data), sizeof(T)); } -template qint64 writePrimitive(const T& data) { +template qint64 Packet::writePrimitive(const T& data) { static_assert(!std::is_pointer::value, "T must not be a pointer"); return QIODevice::write(reinterpret_cast(&data), sizeof(T)); } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 4cf694f6b8..95a4f5d583 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -57,11 +57,11 @@ private: QByteArray _extendedHeader; }; -template template readPrimitive(U* data) { +template template PacketList::readPrimitive(U* data) { return QIODevice::read(reinterpret_cast(data), sizeof(U)); } -template template writePrimitive(const U& data) { +template template PacketList::writePrimitive(const U& data) { static_assert(!std::is_pointer::value, "U must not be a pointer"); return QIODevice::write(reinterpret_cast(&data), sizeof(U)); } From 46e6f9cf4f5a52ed20f137e6b8ef191a7983a7bc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 19:15:40 -0700 Subject: [PATCH 205/582] add a type for templated return --- libraries/networking/src/PacketList.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 95a4f5d583..1ae22eb08e 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -57,11 +57,11 @@ private: QByteArray _extendedHeader; }; -template template PacketList::readPrimitive(U* data) { +template template qint64 PacketList::readPrimitive(U* data) { return QIODevice::read(reinterpret_cast(data), sizeof(U)); } -template template PacketList::writePrimitive(const U& data) { +template template qint64 PacketList::writePrimitive(const U& data) { static_assert(!std::is_pointer::value, "U must not be a pointer"); return QIODevice::write(reinterpret_cast(&data), sizeof(U)); } From cb49d89369bcb85b445cd223be8e5b9d6d877b52 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 8 Jul 2015 19:56:07 -0700 Subject: [PATCH 206/582] Fix link errors --- libraries/networking/src/NLPacket.cpp | 4 ++-- libraries/networking/src/PacketList.h | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 4f12b761d1..f61b47b4b2 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -21,11 +21,11 @@ int64_t NLPacket::maxPayloadSize(PacketType::Value type) { return Packet::maxPayloadSize(type) - localHeaderSize(type); } -qint64 Packet::totalHeadersSize() const { +qint64 NLPacket::totalHeadersSize() const { return localHeaderSize() + Packet::localHeaderSize(); } -qint64 Packet::localHeaderSize() const { +qint64 NLPacket::localHeaderSize() const { return localHeaderSize(_type); } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 1ae22eb08e..9c8f67fc6a 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -38,8 +38,9 @@ public: template qint64 readPrimitive(U* data); template qint64 writePrimitive(const U& data); protected: - qint64 writeData(const char* data, qint64 maxSize); - qint64 readData(char* data, qint64 maxSize) { return 0; } + virtual qint64 writeData(const char* data, qint64 maxSize); + virtual qint64 readData(char* data, qint64 maxSize) { return 0; } + private: PacketList(const PacketList& other) = delete; PacketList& operator=(const PacketList& other) = delete; From d3e48e12936c3bf1d379e04882b2baebb5f6e6e2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 20:08:25 -0700 Subject: [PATCH 207/582] fix a missing templated type in PacketList --- libraries/networking/src/PacketList.cpp | 2 +- libraries/networking/src/PacketList.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 30bcb5a89f..af1125310a 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -21,7 +21,7 @@ template PacketList::PacketList(PacketType::Value packetType) : } -template std::unique_ptr PacketList::createPacketWithExtendedHeader() { +template std::unique_ptr PacketList::createPacketWithExtendedHeader() { // use the static create method to create a new packet auto packet = T::create(_packetType); diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index 9c8f67fc6a..ada136b7f1 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -40,12 +40,12 @@ public: protected: virtual qint64 writeData(const char* data, qint64 maxSize); virtual qint64 readData(char* data, qint64 maxSize) { return 0; } - + private: PacketList(const PacketList& other) = delete; PacketList& operator=(const PacketList& other) = delete; - std::unique_ptr createPacketWithExtendedHeader(); + std::unique_ptr createPacketWithExtendedHeader(); PacketType::Value _packetType; bool _isOrdered = false; From 8935baf3aa5c6e2fe870aabc0bf2c458282c3f87 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 20:11:08 -0700 Subject: [PATCH 208/582] add missing return of new packet --- libraries/networking/src/PacketList.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index af1125310a..2e452db133 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -30,6 +30,8 @@ template std::unique_ptr PacketList::createPacketWithExtended qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" << "- make sure that _extendedHeader is not larger than the payload capacity."; } + + return packet; } template qint64 PacketList::writeData(const char* data, qint64 maxSize) { From 302e502d841db7a5dd6ea792a2ca00df54ce44c1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 20:17:21 -0700 Subject: [PATCH 209/582] remove NLPacket forward declare --- libraries/networking/src/PacketList.cpp | 2 -- libraries/networking/src/PacketList.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/PacketList.cpp index 2e452db133..7eccc45200 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/PacketList.cpp @@ -13,8 +13,6 @@ #include -#include "NLPacket.h" - template PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType) { diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/PacketList.h index ada136b7f1..11dd3cb225 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/PacketList.h @@ -16,8 +16,6 @@ #include "PacketHeaders.h" -class NLPacket; - template class PacketList : public QIODevice { public: PacketList(PacketType::Value packetType); From f2a198dfddfbba06be2c7c74d60f2a99a0350671 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 22:46:43 -0700 Subject: [PATCH 210/582] add O_OBJECT macros to appropriate classes, fix PacketList errors --- libraries/networking/src/LimitedNodeList.h | 3 +- libraries/networking/src/NLPacket.h | 11 ++--- .../src/{PacketList.cpp => NLPacketList.cpp} | 40 ++++++++--------- .../src/{PacketList.h => NLPacketList.h} | 43 ++++++++++--------- libraries/networking/src/Packet.h | 1 + 5 files changed, 50 insertions(+), 48 deletions(-) rename libraries/networking/src/{PacketList.cpp => NLPacketList.cpp} (71%) rename libraries/networking/src/{PacketList.h => NLPacketList.h} (55%) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 3aadb8373d..3d674516d6 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -39,7 +39,7 @@ #include "Node.h" #include "NLPacket.h" #include "PacketHeaders.h" -#include "PacketList.h" +#include "NLPacketList.h" #include "UUIDHasher.h" const int MAX_PACKET_SIZE = 1450; @@ -69,7 +69,6 @@ Q_DECLARE_METATYPE(SharedNodePointer) using namespace tbb; typedef std::pair UUIDNodePair; typedef concurrent_unordered_map NodeHash; -using NLPacketList = PacketList; typedef quint8 PingType_t; namespace PingType { diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 9105418492..744056c103 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -15,23 +15,24 @@ #include "Packet.h" class NLPacket : public Packet { + Q_OBJECT public: static std::unique_ptr create(PacketType::Value type, int64_t size = -1); // Provided for convenience, try to limit use static std::unique_ptr createCopy(const std::unique_ptr& other); - + static int64_t localHeaderSize(PacketType::Value type); static int64_t maxPayloadSize(PacketType::Value type); - + virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers virtual qint64 localHeaderSize() const; // Current level's header size - + protected: NLPacket(PacketType::Value type, int64_t size); NLPacket(NLPacket& other); - + void setSourceUuid(QUuid sourceUuid); void setConnectionUuid(QUuid connectionUuid); }; -#endif // hifi_NLPacket_h \ No newline at end of file +#endif // hifi_NLPacket_h diff --git a/libraries/networking/src/PacketList.cpp b/libraries/networking/src/NLPacketList.cpp similarity index 71% rename from libraries/networking/src/PacketList.cpp rename to libraries/networking/src/NLPacketList.cpp index 7eccc45200..785e3c3f9f 100644 --- a/libraries/networking/src/PacketList.cpp +++ b/libraries/networking/src/NLPacketList.cpp @@ -1,5 +1,5 @@ // -// PacketList.cpp +// NLPacketList.cpp // libraries/networking/src // // Created by Stephen Birarda on 07/06/15. @@ -9,19 +9,19 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "PacketList.h" +#include "NLPacketList.h" #include -template PacketList::PacketList(PacketType::Value packetType) : +NLPacketList::NLPacketList(PacketType::Value packetType) : _packetType(packetType) { } -template std::unique_ptr PacketList::createPacketWithExtendedHeader() { +std::unique_ptr NLPacketList::createPacketWithExtendedHeader() { // use the static create method to create a new packet - auto packet = T::create(_packetType); + auto packet = NLPacket::create(_packetType); // add the extended header to the front of the packet if (packet->write(_extendedHeader) == -1) { @@ -32,16 +32,16 @@ template std::unique_ptr PacketList::createPacketWithExtended return packet; } -template qint64 PacketList::writeData(const char* data, qint64 maxSize) { +qint64 NLPacketList::writeData(const char* data, qint64 maxSize) { if (!_currentPacket) { // we don't have a current packet, time to set one up _currentPacket = createPacketWithExtendedHeader(); } // check if this block of data can fit into the currentPacket - if (maxSize <= _currentPacket.size()) { + if (maxSize <= _currentPacket->bytesAvailable()) { // it fits, just write it to the current packet - _currentPacket.write(data, maxSize); + _currentPacket->write(data, maxSize); // return the number of bytes written return maxSize; @@ -56,9 +56,9 @@ template qint64 PacketList::writeData(const char* data, qint64 m // We need to try and pull the first part of the segment out to our new packet // check now to see if this is an unsupported write - int numBytesToEnd = _currentPacket.size() - _segmentStartIndex; + int numBytesToEnd = _currentPacket->bytesAvailable(); - if ((newPacket.size() - numBytesToEnd) < maxSize) { + if ((newPacket->size() - numBytesToEnd) < maxSize) { // this is an unsupported case - the segment is bigger than the size of an individual packet // but the PacketList is not going to be sent ordered qDebug() << "Error in PacketList::writeData - attempted to write a segment to an unordered packet that is" @@ -67,23 +67,23 @@ template qint64 PacketList::writeData(const char* data, qint64 m } // copy from currentPacket where the segment started to the beginning of the newPacket - newPacket.write(_currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); + newPacket->write(_currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); // the current segment now starts at the beginning of the new packet _segmentStartIndex = 0; // shrink the current payload to the actual size of the packet - _currentPacket.setSizeUsed(_segmentStartIndex); + _currentPacket->setSizeUsed(_segmentStartIndex); } // move the current packet to our list of packets - _packets.insert(std::move(_currentPacket)); + _packets.push_back(std::move(_currentPacket)); // write the data to the newPacket - newPacket.write(data, maxSize); + newPacket->write(data, maxSize); - // set our current packet to the new packet - _currentPacket = newPacket; + // swap our current packet with the new packet + _currentPacket.swap(newPacket); // return the number of bytes written to the new packet return maxSize; @@ -91,11 +91,11 @@ template qint64 PacketList::writeData(const char* data, qint64 m // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover // into a new packet - int numBytesToEnd = _currentPacket.size() - _currentPacket.sizeUsed(); + int numBytesToEnd = _currentPacket->bytesAvailable(); _currentPacket->write(data, numBytesToEnd); // move the current packet to our list of packets - _packets.insert(std::move(_currentPacket)); + _packets.push_back(std::move(_currentPacket)); // recursively call our writeData method for the remaining data to write to a new packet return numBytesToEnd + writeData(data + numBytesToEnd, maxSize - numBytesToEnd); @@ -103,8 +103,8 @@ template qint64 PacketList::writeData(const char* data, qint64 m } } -template void PacketList::closeCurrentPacket() { +void NLPacketList::closeCurrentPacket() { // move the current packet to our list of packets - _packets.insert(std::move(_currentPacket)); + _packets.push_back(std::move(_currentPacket)); } diff --git a/libraries/networking/src/PacketList.h b/libraries/networking/src/NLPacketList.h similarity index 55% rename from libraries/networking/src/PacketList.h rename to libraries/networking/src/NLPacketList.h index 11dd3cb225..a0a6cdd5eb 100644 --- a/libraries/networking/src/PacketList.h +++ b/libraries/networking/src/NLPacketList.h @@ -1,5 +1,5 @@ // -// PacketList.h +// NLPacketList.h // libraries/networking/src // // Created by Stephen Birarda on 07/06/15. @@ -9,60 +9,61 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_PacketList_h -#define hifi_PacketList_h +#ifndef hifi_NLPacketList_h +#define hifi_NLPacketList_h -#include +#include #include "PacketHeaders.h" -template class PacketList : public QIODevice { +#include "NLPacket.h" + +class NLPacketList : public QIODevice { + Q_OBJECT public: - PacketList(PacketType::Value packetType); + NLPacketList(PacketType::Value packetType); virtual bool isSequential() const { return true; } - void startSegment() { _segmentStartIndex = _currentPacket->payload().pos(); } + void startSegment() { _segmentStartIndex = _currentPacket->pos(); } void endSegment() { _segmentStartIndex = -1; } int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); } - void getCurrentPacketCapacity() const { return _currentPacket->bytesAvailable(); } - void closeCurrentPacket(); void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } - template qint64 readPrimitive(U* data); - template qint64 writePrimitive(const U& data); + template qint64 readPrimitive(T* data); + template qint64 writePrimitive(const T& data); protected: virtual qint64 writeData(const char* data, qint64 maxSize); virtual qint64 readData(char* data, qint64 maxSize) { return 0; } private: - PacketList(const PacketList& other) = delete; - PacketList& operator=(const PacketList& other) = delete; + NLPacketList(const NLPacketList& other) = delete; + NLPacketList& operator=(const NLPacketList& other) = delete; - std::unique_ptr createPacketWithExtendedHeader(); + std::unique_ptr createPacketWithExtendedHeader(); PacketType::Value _packetType; bool _isOrdered = false; - std::unique_ptr _currentPacket; - std::list> _packets; + std::unique_ptr _currentPacket; + std::list> _packets; int _segmentStartIndex = -1; QByteArray _extendedHeader; }; -template template qint64 PacketList::readPrimitive(U* data) { - return QIODevice::read(reinterpret_cast(data), sizeof(U)); +template qint64 NLPacketList::readPrimitive(T* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(T)); } -template template qint64 PacketList::writePrimitive(const U& data) { - static_assert(!std::is_pointer::value, "U must not be a pointer"); - return QIODevice::write(reinterpret_cast(&data), sizeof(U)); +template qint64 NLPacketList::writePrimitive(const T& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(T)); } diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 373c12356a..7bd8d81194 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -19,6 +19,7 @@ #include "PacketHeaders.h" class Packet : public QIODevice { + Q_OBJECT public: using SequenceNumber = uint16_t; From 8c2cf2cf258e32f19245478ac7581b94f6693f09 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jul 2015 22:48:44 -0700 Subject: [PATCH 211/582] fix an unused variable warning --- interface/src/Application.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0d729711d8..d6a90b36f8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2699,8 +2699,6 @@ int Application::sendNackPackets() { _octreeSceneStatsLock.unlock(); // construct nack packet(s) for this node - int numSequenceNumbersAvailable = missingSequenceNumbers.size(); - auto it = missingSequenceNumbers.constBegin(); while (it != missingSequenceNumbers.constEnd()) { OCTREE_PACKET_SEQUENCE missingNumber = *it; From 3b7ad982a419a4d059de9a6bce5912f0f7a9dc5c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 09:23:50 -0700 Subject: [PATCH 212/582] Update OctreePacketProcessor to use packet callbacks --- .../src/octree/OctreePacketProcessor.cpp | 54 ++++++++++++++++--- interface/src/octree/OctreePacketProcessor.h | 10 +++- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index c5b4d2a4a7..4e01b9dc37 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -16,10 +16,48 @@ #include "OctreePacketProcessor.h" #include "SceneScriptingInterface.h" +OctreePacketProcessor::OctreePacketProcessor() { + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::OctreeStats, this, "handleEntityDataPacket"); + packetReceiver.registerPacketListener(PacketType::EntityData, this, "handleEntityDataPacket"); + packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleEntityErasePacket"); + packetReceiver.registerPacketListener(PacketType::OctreeStats, this, "handleOctreeStatsPacket"); + packetReceiver.registerPacketListener(PacketType::EnvironmentData, this, "handleEnvironmentDataPacket"); +} + +// TODO implement packet processing in PacketType-specific methods +void OctreePacketProcessor::handleEntityDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (sendingNode) { + processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + } +} + +void OctreePacketProcessor::handleEntityErasePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (sendingNode) { + processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + } +} + +void OctreePacketProcessor::handleOctreeStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (sendingNode) { + processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + } +} + +void OctreePacketProcessor::handleEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (sendingNode) { + processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + } +} + void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "OctreePacketProcessor::processPacket()"); - + QByteArray mutablePacket = packet; const int WAY_BEHIND = 300; @@ -34,7 +72,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, PacketType::Value voxelPacketType = packetTypeForPacket(mutablePacket); - + // note: PacketType_OCTREE_STATS can have PacketType_VOXEL_DATA // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first // then process any remaining bytes as if it was another packet @@ -43,7 +81,7 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, wasStatsPacket = true; if (messageLength > statsMessageLength) { mutablePacket = mutablePacket.mid(statsMessageLength); - + // TODO: this does not look correct, the goal is to test the packet version for the piggyback, but // this is testing the version and hash of the original packet if (!DependencyManager::get()->packetVersionAndHashMatch(packet)) { @@ -54,28 +92,28 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, return; // bail since no piggyback data } } // fall through to piggyback message - + voxelPacketType = packetTypeForPacket(mutablePacket); PacketVersion packetVersion = mutablePacket[1]; PacketVersion expectedVersion = versionForPacketType(voxelPacketType); - + // check version of piggyback packet against expected version if (packetVersion != expectedVersion) { static QMultiMap versionDebugSuppressMap; - + QUuid senderUUID = uuidFromPacketHeader(packet); if (!versionDebugSuppressMap.contains(senderUUID, voxelPacketType)) { qDebug() << "Packet version mismatch on" << voxelPacketType << "- Sender" << senderUUID << "sent" << (int)packetVersion << "but" << (int)expectedVersion << "expected."; - + emit packetVersionMismatch(); versionDebugSuppressMap.insert(senderUUID, voxelPacketType); } return; // bail since piggyback version doesn't match } - + app->trackIncomingOctreePacket(mutablePacket, sendingNode, wasStatsPacket); if (sendingNode) { diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 5c52dec002..a0f2ed3e7b 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -16,13 +16,21 @@ /// 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 { +class OctreePacketProcessor : public GenericThread { Q_OBJECT +public: + OctreePacketProcessor(); signals: void packetVersionMismatch(); protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); + +private slots: + void handleEntityDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleEntityErasePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleOctreeStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); }; #endif // hifi_OctreePacketProcessor_h From bb132e354bc24d9665524ab882b1674d589f766d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 09:24:07 -0700 Subject: [PATCH 213/582] Update AudioClient to use packet callbacks --- libraries/audio-client/src/AudioClient.cpp | 95 ++++++++++++++++++++++ libraries/audio-client/src/AudioClient.h | 12 ++- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a75b9124db..3856e32fca 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -140,6 +140,14 @@ AudioClient::AudioClient() : // create GVerb filter _gverb = createGverbFilter(); configureGverbFilter(_gverb); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::AudioEnvironment, this, "handleAudioStreamStatsPacket"); + packetReceiver.registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioEnvironmentDataPacket"); + packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioDataPacket"); + packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFrame"); + packetReceiver.registerPacketListener(PacketType::NoisyMute, this, "handleNoisyMutePacket"); + packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } AudioClient::~AudioClient() { @@ -527,6 +535,93 @@ void AudioClient::stop() { } } +void AudioClient::handleAudioStreamStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + _stats.parseAudioStreamStatsPacket(packet->getData()); + + updateLastHeardFromAudioMixer(packet); +} + +void AudioClient::handleAudioEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + const char* dataAt = packet->getPayload(); + + char bitset; + memcpy(&bitset, dataAt, sizeof(char)); + dataAt += sizeof(char); + + bool hasReverb = oneAtBit(bitset, HAS_REVERB_BIT);; + if (hasReverb) { + float reverbTime, wetLevel; + memcpy(&reverbTime, dataAt, sizeof(float)); + dataAt += sizeof(float); + memcpy(&wetLevel, dataAt, sizeof(float)); + dataAt += sizeof(float); + _receivedAudioStream.setReverb(reverbTime, wetLevel); + } else { + _receivedAudioStream.clearReverb(); + } + + updateLastHeardFromAudioMixer(packet); +} + +void AudioClient::handleAudioDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + auto nodeList = DependencyManager::get(); + nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveFirstAudioPacket); + + if (_audioOutput) { + + if (!_hasReceivedFirstPacket) { + _hasReceivedFirstPacket = true; + + // have the audio scripting interface emit a signal to say we just connected to mixer + emit receivedFirstPacket(); + } + + // Audio output must exist and be correctly set up if we're going to process received audio + _receivedAudioStream.parseData(packet->getData()); + } + + updateLastHeardFromAudioMixer(packet); +} + +void AudioClient::handleSilentAudioFrame(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + updateLastHeardFromAudioMixer(packet); +} + +void AudioClient::handleNoisyMutePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + if (!_muted) { + toggleMute(); + // TODO reimplement on interface side + //AudioScriptingInterface::getInstance().mutedByMixer(); + } +} + +void AudioClient::handleMuteEnvironmentPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + glm::vec3 position; + float radius; + + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::MuteEnvironment); + memcpy(&position, packet->getPayload(), sizeof(glm::vec3)); + memcpy(&radius, packet->getPayload() + sizeof(glm::vec3), sizeof(float)); + float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), + position); + bool shouldMute = !_muted && (distance < radius); + + if (shouldMute) { + toggleMute(); + // TODO reimplement on interface side + //AudioScriptingInterface::getInstance().environmentMuted(); + } +} + +void AudioClient::updateLastHeardFromAudioMixer(std::unique_ptr& packet) { + // update having heard from the audio-mixer and record the bytes received + SharedNodePointer audioMixer = nodeList->nodeWithUUID(packet->getSourceID()); + if (audioMixer) { + audioMixer->setLastHeardMicrostamp(usecTimestampNow()); + } + +} + QString AudioClient::getDefaultDeviceName(QAudio::Mode mode) { QAudioDeviceInfo deviceInfo = defaultAudioDeviceForMode(mode); return deviceInfo.deviceName(); diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 484e3a14e8..59b7fc48a9 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -133,10 +133,15 @@ public: public slots: void start(); void stop(); - void addReceivedAudioToStream(const QByteArray& audioByteArray); - void parseAudioEnvironmentData(const QByteArray& packet); + + void handleAudioStreamStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleAudioEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleAudioDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleSilentAudioFrame(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleNoisyMutePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleMuteEnvironmentPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); } - void parseAudioStreamStatsPacket(const QByteArray& packet) { _stats.parseAudioStreamStatsPacket(packet); } void handleAudioInput(); void reset(); void audioMixerKilled(); @@ -202,6 +207,7 @@ private slots: void audioStateChanged(QAudio::State state); private: + void updateLastHeardFromAudioMixer(std::unique_ptr& packet); void outputFormatChanged(); QByteArray firstInputFrame; From 32b232c87a6c005cf227d288f6870b99e776e401 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 09:24:28 -0700 Subject: [PATCH 214/582] Update AvatarHashMap to use packet callbacks --- libraries/avatars/src/AvatarHashMap.cpp | 22 +++++++++++++++++++--- libraries/avatars/src/AvatarHashMap.h | 12 ++++++------ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 85f85f68e6..fb20f91431 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -19,7 +19,6 @@ AvatarHashMap::AvatarHashMap() { connect(DependencyManager::get().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged); - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); packetReceiver.registerPacketListener(PacketType::KillAvatar, this, "processKillAvatar"); @@ -58,6 +57,10 @@ void AvatarHashMap::processAvatarDataPacket(std::unique_ptr packet, Hi int bytesRead = 0; SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (avatarMixer) { + avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); + } + // enumerate over all of the avatars in this packet // only add them if mixerWeakPointer points to something (meaning that mixer is still around) while (bytesRead < data.size() && avatarMixer.data()) { @@ -86,6 +89,11 @@ void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr packet QUuid sessionUUID; + SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (avatarMixer) { + avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); + } + while (!identityStream.atEnd()) { QUrl faceMeshURL, skeletonURL; @@ -96,7 +104,6 @@ void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr packet // mesh URL for a UUID, find avatar in our list AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); avatar = addAvatar(sessionUUID, avatarMixer); } if (avatar->getFaceModelURL() != faceMeshURL) { @@ -121,9 +128,13 @@ void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr packe const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size); QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(data, NUM_BYTES_RFC4122_UUID)); + SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (avatarMixer) { + avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); + } + AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); avatar = addAvatar(sessionUUID, avatarMixer); } @@ -134,6 +145,11 @@ void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr packe } void AvatarHashMap::processKillAvatar(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); + if (avatarMixer) { + avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); + } + // read the node id QUuid sessionUUID = QUuid::fromRfc4122(QByteArray(packet->getPayload(), NUM_BYTES_RFC4122_UUID)); removeAvatar(sessionUUID); diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 537f0ca685..dbfd2dc88e 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -27,29 +27,29 @@ class AvatarHashMap : public QObject, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY - + public: const AvatarHash& getAvatarHash() { return _avatarHash; } int size() { return _avatarHash.size(); } - + public slots: void processAvatarMixerDatagram(const QByteArray& datagram, const QWeakPointer& mixerWeakPointer); bool isAvatarInRange(const glm::vec3 & position, const float range); - + private slots: void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); void processAvatarDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); void processAvatarIdentityPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); void processAvatarBillboardPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); void processKillAvatar(std::unique_ptr packet, HifiSockAddr senderSockAddr); - + protected: AvatarHashMap(); - + virtual AvatarSharedPointer newSharedAvatar(); virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer); virtual void removeAvatar(const QUuid& sessionUUID); - + AvatarHash _avatarHash; private: From 0180bdc4fb1d5a6c8cc37be4ae8b5e1fa29eefb0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 09:24:50 -0700 Subject: [PATCH 215/582] Update EntityEditPacketSender to use packet callbacks --- .../entities/src/EntityEditPacketSender.cpp | 16 +++++++++++++--- libraries/entities/src/EntityEditPacketSender.h | 4 ++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index f228467316..9ed1fa5904 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -17,16 +17,26 @@ #include "EntitiesLogging.h" #include "EntityItem.h" +EntityEditPacketSender::EntityEditPacketSender() { + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); +} -void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, +void EntityEditPacketSender::processEntityEditNackPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { + if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { + processNackPacket(QByteArray::fromRawData(packet->getData())); + } +} + +void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew) { - + if (type == PacketType::EntityAdd || type == PacketType::EntityEdit) { EntityItem::adjustEditPacketForClockSkew(editBuffer, length, clockSkew); } } -void EntityEditPacketSender::queueEditEntityMessage(PacketType::Value type, EntityItemID modelID, +void EntityEditPacketSender::queueEditEntityMessage(PacketType::Value type, EntityItemID modelID, const EntityItemProperties& properties) { if (!_shouldSend) { return; // bail early diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index ce88f41b04..30076b1832 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -20,6 +20,8 @@ class EntityEditPacketSender : public OctreeEditPacketSender { Q_OBJECT public: + EntityEditPacketSender(); + /// Queues an array of several voxel edit messages. Will potentially send a pending multi-command packet. Determines /// which voxel-server node or nodes the packet should be sent to. Can be called even before voxel servers are known, in /// which case up to MaxPendingMessages will be buffered and processed when voxel servers are known. @@ -28,6 +30,8 @@ public: void queueEraseEntityMessage(const EntityItemID& entityItemID); + void processEntityEditNackPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } virtual void adjustEditPacketForClockSkew(PacketType::Value type, unsigned char* editBuffer, size_t length, int clockSkew); From 7f771122ee1d43015c8c46aa85b4ff0dc57365dc Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 09:25:12 -0700 Subject: [PATCH 216/582] Remove old packet handling from PacketReceiver --- libraries/networking/src/PacketReceiver.cpp | 131 +++----------------- libraries/networking/src/PacketReceiver.h | 2 +- 2 files changed, 19 insertions(+), 114 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index b3b839014b..b94242f85e 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -1,6 +1,6 @@ // // PacketReceiver.cpp -// interface/src +// libraries/networking/src // // Created by Stephen Birarda on 1/23/2014. // Update by Ryan Huffman on 7/8/2015. @@ -48,136 +48,41 @@ void PacketReceiver::processDatagrams() { return; // bail early... we're shutting down. } - HifiSockAddr senderSockAddr; - static QByteArray incomingPacket; - Application* application = Application::getInstance(); auto nodeList = DependencyManager::get(); while (DependencyManager::get()->getNodeSocket().hasPendingDatagrams()) { incomingPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); + HifiSockAddr senderSockAddr; nodeList->readDatagram(incomingPacket, senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); _inPacketCount++; _inByteCount += incomingPacket.size(); if (nodeList->packetVersionAndHashMatch(incomingPacket)) { - PacketType::Value incomingType = packetTypeForPacket(incomingPacket); - // only process this packet if we have a match on the packet version - switch (incomingType) { - case PacketType::AudioEnvironment: - case PacketType::AudioStreamStats: - case PacketType::MixedAudio: - case PacketType::SilentAudioFrame: { - if (incomingType == PacketType::AudioStreamStats) { - QMetaObject::invokeMethod(DependencyManager::get().data(), "parseAudioStreamStatsPacket", - Qt::QueuedConnection, - Q_ARG(QByteArray, incomingPacket)); - } else if (incomingType == PacketType::AudioEnvironment) { - QMetaObject::invokeMethod(DependencyManager::get().data(), "parseAudioEnvironmentData", - Qt::QueuedConnection, - Q_ARG(QByteArray, incomingPacket)); - } else { - QMetaObject::invokeMethod(DependencyManager::get().data(), "addReceivedAudioToStream", - Qt::QueuedConnection, - Q_ARG(QByteArray, incomingPacket)); - } - // update having heard from the audio-mixer and record the bytes received - SharedNodePointer audioMixer = nodeList->sendingNodeForPacket(incomingPacket); + // TODO What do we do about this? + //nodeList->processNodeData(senderSockAddr, incomingPacket); - if (audioMixer) { - audioMixer->setLastHeardMicrostamp(usecTimestampNow()); - } + packetListenerLock.lock(); + auto& listener = packetListenerMap[incomingType]; + packetListenerLock.unlock(); - break; + if (packetListenerMap.contains(incomingType)) { + auto& listener = packetListenerMap[incomingType]; + NLPacket packet; + bool success = QMetaObject::invokeMethod(listener.first, listener.second, + Q_ARG(std::unique_ptr, packet), + Q_ARG(HifiSockAddr, senderSockAddr)); + if (!success) { + qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first.name() << "::" << listener.second; } - case PacketType::EntityData: - case PacketType::EntityErase: - case PacketType::OctreeStats: - case PacketType::EnvironmentData: { - PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), - "Application::networkReceive()... _octreeProcessor.queueReceivedPacket()"); - SharedNodePointer matchedNode = DependencyManager::get()->sendingNodeForPacket(incomingPacket); - - if (matchedNode) { - // add this packet to our list of octree packets and process them on the octree data processing - application->_octreeProcessor.queueReceivedPacket(matchedNode, incomingPacket); - } - break; - } - case PacketType::BulkAvatarData: - case PacketType::KillAvatar: - case PacketType::AvatarIdentity: - case PacketType::AvatarBillboard: { - // update having heard from the avatar-mixer and record the bytes received - SharedNodePointer avatarMixer = nodeList->sendingNodeForPacket(incomingPacket); - - if (avatarMixer) { - avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); - - QMetaObject::invokeMethod(DependencyManager::get().data(), "processAvatarMixerDatagram", - Q_ARG(const QByteArray&, incomingPacket), - Q_ARG(const QWeakPointer&, avatarMixer)); - } - break; - } - case PacketType::NoisyMute: - case PacketType::MuteEnvironment: { - bool mute = !DependencyManager::get()->isMuted(); - - if (incomingType == PacketType::MuteEnvironment) { - glm::vec3 position; - float radius; - - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::MuteEnvironment); - memcpy(&position, incomingPacket.constData() + headerSize, sizeof(glm::vec3)); - memcpy(&radius, incomingPacket.constData() + headerSize + sizeof(glm::vec3), sizeof(float)); - float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), - position); - - mute = mute && (distance < radius); - } - - if (mute) { - DependencyManager::get()->toggleMute(); - if (incomingType == PacketType::MuteEnvironment) { - AudioScriptingInterface::getInstance().environmentMuted(); - } else { - AudioScriptingInterface::getInstance().mutedByMixer(); - } - } - break; - } - case PacketType::EntityEditNack: - if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { - application->_entityEditSender.processNackPacket(incomingPacket); - } - break; - default: - //nodeList->processNodeData(senderSockAddr, incomingPacket); - - packetListenerLock.lock(); - auto& listener = packetListenerMap[incomingType]; - packetListenerLock.unlock(); - - if (packetListenerMap.contains(incomingType)) { - auto& listener = packetListenerMap[incomingType]; - NLPacket packet; - bool success = QMetaObject::invokeMethod(listener.first, listener.second, - Q_ARG(std::unique_ptr, packet), - Q_ARG(HifiSockAddr, senderSockAddr)); - if (!success) { - qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first.name() << "::" << listener.second; - } - } else { - QDebug() << "No listener found for packet type: " << incomingType; - } - - break; + } else { + QDebug() << "No listener found for packet type: " << incomingType; } + } } } diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index cc61bdb3cb..fd814c85ea 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -1,6 +1,6 @@ // // PacketReceiver.h -// interface/src +// libraries/networking/src // // Created by Stephen Birarda on 1/23/2014. // Update by Ryan Huffman on 7/8/2015. From 6cf0018914c9aea9cb7e4008f4549e9cde37aaea Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:07:13 -0700 Subject: [PATCH 217/582] repairs required for domain-server build --- domain-server/src/DomainServer.cpp | 79 ++++++++++++++++-------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index a967392696..fffd67876f 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -626,7 +626,7 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock connectionDeniedPacket->write(utfString); // tell client it has been refused. - limitedNodeList->sendPacket(std::move(connectionDeniedPacket, senderSockAddr); + limitedNodeList->sendPacket(std::move(connectionDeniedPacket), senderSockAddr); return; } @@ -957,7 +957,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif limitedNodeList->eachNode([&](const SharedNodePointer& otherNode){ if (otherNode->getUUID() != node->getUUID() && nodeInterestSet.contains(otherNode->getType())) { // since we're about to add a node to the packet we start a segment - domainListStream.startSegment(); + domainListPackets.startSegment(); // don't send avatar nodes to other avatars, that will come from avatar mixer domainListStream << *otherNode.data(); @@ -966,7 +966,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif domainListStream << connectionSecretForNodes(node, otherNode); // we've added the node we wanted so end the segment now - domainListStream.endSegment(); + domainListPackets.endSegment(); } }); } @@ -1001,13 +1001,14 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) { auto limitedNodeList = DependencyManager::get(); + auto addNodePacket = NLPacket::create(PacketType::DomainServerAddedNode); + // setup the add packet for this new node - QByteArray addNodePacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketType::DomainServerAddedNode); - QDataStream addNodeStream(&addNodePacket, QIODevice::Append); + QDataStream addNodeStream(addNodePacket.get()); addNodeStream << *addedNode.data(); - int connectionSecretIndex = addNodePacket.size(); + int connectionSecretIndex = addNodePacket->pos(); limitedNodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { @@ -1020,13 +1021,15 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) { } }, [&](const SharedNodePointer& node) { + addNodePacket->seek(connectionSecretIndex); + QByteArray rfcConnectionSecret = connectionSecretForNodes(node, addedNode).toRfc4122(); // replace the bytes at the end of the packet for the connection secret between these nodes - addNodePacket.replace(connectionSecretIndex, NUM_BYTES_RFC4122_UUID, rfcConnectionSecret); + addNodePacket->write(rfcConnectionSecret); // send off this packet to the node - limitedNodeList->writeUnverifiedDatagram(addNodePacket, node); + limitedNodeList->sendUnreliablePacket(addNodePacket, node); } ); } @@ -1037,9 +1040,6 @@ void DomainServer::readAvailableDatagrams() { HifiSockAddr senderSockAddr; QByteArray receivedPacket; - static QByteArray assignmentPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketType::CreateAssignment); - static int numAssignmentPacketHeaderBytes = assignmentPacket.size(); - while (limitedNodeList->getNodeSocket().hasPendingDatagrams()) { receivedPacket.resize(limitedNodeList->getNodeSocket().pendingDatagramSize()); limitedNodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), @@ -1076,18 +1076,24 @@ void DomainServer::readAvailableDatagrams() { qDebug() << "Deploying assignment -" << *assignmentToDeploy.data() << "- to" << senderSockAddr; // give this assignment out, either the type matches or the requestor said they will take any - assignmentPacket.resize(numAssignmentPacketHeaderBytes); + static std::unique_ptr assignmentPacket; + + if (!assignmentPacket) { + assignmentPacket = NLPacket::create(PacketType::CreateAssignment); + } // setup a copy of this assignment that will have a unique UUID, for packaging purposes Assignment uniqueAssignment(*assignmentToDeploy.data()); uniqueAssignment.setUUID(QUuid::createUuid()); - QDataStream assignmentStream(&assignmentPacket, QIODevice::Append); + // reset the assignmentPacket + assignmentPacket->reset(); + + QDataStream assignmentStream(assignmentPacket.get()); assignmentStream << uniqueAssignment; - limitedNodeList->getNodeSocket().writeDatagram(assignmentPacket, - senderSockAddr.getAddress(), senderSockAddr.getPort()); + limitedNodeList->sendUnreliablePacket(assignmentPacket, senderSockAddr); // add the information for that deployed assignment to the hash of pending assigned nodes PendingAssignedNodeData* pendingNodeData = new PendingAssignedNodeData(assignmentToDeploy->getUUID(), @@ -1108,16 +1114,17 @@ void DomainServer::readAvailableDatagrams() { processDatagram(receivedPacket, senderSockAddr); } else { // we're using DTLS, so tell the sender to get back to us using DTLS - static QByteArray dtlsRequiredPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketType::DomainServerRequireDTLS); - static int numBytesDTLSHeader = numBytesForPacketHeaderGivenPacketType::(PacketTypeDomainServerRequireDTLS); + static std::unique_ptr dtlsRequiredPacket; + + if (!dtlsRequiredPacket) { + dtlsRequiredPacket = NLPacket::create(PacketType::DomainServerRequireDTLS); - if (dtlsRequiredPacket.size() == numBytesDTLSHeader) { // pack the port that we accept DTLS traffic on unsigned short dtlsPort = limitedNodeList->getDTLSSocket().localPort(); - dtlsRequiredPacket.replace(numBytesDTLSHeader, sizeof(dtlsPort), reinterpret_cast(&dtlsPort)); + dtlsRequiredPacket->writePrimitive(dtlsPort); } - limitedNodeList->writeUnverifiedDatagram(dtlsRequiredPacket, senderSockAddr); + limitedNodeList->sendUnreliablePacket(dtlsRequiredPacket, senderSockAddr); } } } @@ -1323,10 +1330,10 @@ void DomainServer::pingPunchForConnectingPeer(const SharedNetworkPeer& peer) { auto limitedNodeList = DependencyManager::get(); // send the ping packet to the local and public sockets for this node - auto localPingPacket = nodeList->constructICEPingPacket(PingType::Local, limitedNodeList->getSessionUUID()); + auto localPingPacket = limitedNodeList->constructICEPingPacket(PingType::Local, limitedNodeList->getSessionUUID()); limitedNodeList->sendPacket(std::move(localPingPacket), peer->getLocalSocket()); - auto publicPingPacket = nodeList->constructICEPingPacket(PingType::Public, limitedNodeList->getSessionUUID()); + auto publicPingPacket = limitedNodeList->constructICEPingPacket(PingType::Public, limitedNodeList->getSessionUUID()); limitedNodeList->sendPacket(std::move(publicPingPacket), peer->getPublicSocket()); peer->incrementConnectionAttempts(); @@ -1438,13 +1445,13 @@ void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiS case PacketType::StunResponse: nodeList->processSTUNResponse(receivedPacket); break; - case PacketType::UnverifiedPing: { - QByteArray pingReplyPacket = nodeList->constructPingReplyPacket(receivedPacket); - nodeList->writeUnverifiedDatagram(pingReplyPacket, senderSockAddr); + case PacketType::ICEPing: { + auto pingReplyPacket = nodeList->constructPingReplyPacket(receivedPacket); + nodeList->sendPacket(std::move(pingReplyPacket), senderSockAddr); break; } - case PacketType::UnverifiedPingReply: { + case PacketType::ICEPingReply: { processICEPingReply(receivedPacket, senderSockAddr); break; } @@ -2225,7 +2232,7 @@ void DomainServer::respondToPathQuery(const QByteArray& receivedPacket, const Hi // this is a query for the viewpoint resulting from a path // first pull the query path from the packet - int numHeaderBytes = numBytesForPacketHeaderGivenPacketType::(PacketTypeDomainServerPathQuery); + int numHeaderBytes = 0; const char* packetDataStart = receivedPacket.data() + numHeaderBytes; // figure out how many bytes the sender said this path is @@ -2257,31 +2264,31 @@ void DomainServer::respondToPathQuery(const QByteArray& receivedPacket, const Hi QByteArray viewpointUTF8 = responseViewpoint.toUtf8(); // prepare a packet for the response - QByteArray pathResponsePacket = nodeList->byteArrayWithPopulatedHeader(PacketType::DomainServerPathResponse); + auto pathResponsePacket = NLPacket::create(PacketType::DomainServerPathResponse); // check the number of bytes the viewpoint is - quint16 numViewpointBytes = responseViewpoint.toUtf8().size(); + quint16 numViewpointBytes = viewpointUTF8.size(); // are we going to be able to fit this response viewpoint in a packet? - if (numPathBytes + numViewpointBytes + pathResponsePacket.size() + sizeof(numViewpointBytes) - < MAX_PACKET_SIZE) { + if (numPathBytes + numViewpointBytes + sizeof(numViewpointBytes) + sizeof(numPathBytes) + < (unsigned long) pathResponsePacket->bytesAvailable()) { // append the number of bytes this path is - pathResponsePacket.append(reinterpret_cast(&numPathBytes), sizeof(numPathBytes)); + pathResponsePacket->writePrimitive(numPathBytes); // append the path itself - pathResponsePacket.append(pathQuery.toUtf8()); + pathResponsePacket->write(pathQuery.toUtf8()); // append the number of bytes the resulting viewpoint is - pathResponsePacket.append(reinterpret_cast(&numViewpointBytes), sizeof(numViewpointBytes)); + pathResponsePacket->writePrimitive(numViewpointBytes); // append the viewpoint itself - pathResponsePacket.append(viewpointUTF8); + pathResponsePacket->write(viewpointUTF8); qDebug() << "Sending a viewpoint response for path query" << pathQuery << "-" << viewpointUTF8; // send off the packet - see if we can associate this outbound data to a particular node // TODO: does this senderSockAddr always work for a punched DS client? - nodeList->writeUnverifiedDatagram(pathResponsePacket, senderSockAddr); + nodeList->sendPacket(std::move(pathResponsePacket), senderSockAddr); } } From 885068bd6b6ccfc64e65837552b4ded304b3e4e2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:15:45 -0700 Subject: [PATCH 218/582] create billboard and identity packets of the right size --- assignment-client/src/avatars/AvatarMixer.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index c2b93bc48b..b952eeab8c 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -305,9 +305,12 @@ void AvatarMixer::broadcastAvatarData() { || otherNodeData->getBillboardChangeTimestamp() > _lastFrameTimestamp || randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) { - auto billboardPacket = NLPacket::create(PacketType::AvatarBillboard); - billboardPacket->write(otherNode->getUUID().toRfc4122()); - billboardPacket->write(otherNodeData->getAvatar().getBillboard()); + QByteArray rfcUUID = otherNode->getUUID().toRfc4122(); + QByteArray billboard = otherNodeData->getAvatar().getBillboard(); + + auto billboardPacket = NLPacket::create(PacketType::AvatarBillboard, rfcUUID.size() + billboard.size()); + billboardPacket->write(rfcUUID); + billboardPacket->write(billboard); nodeList->sendPacket(std::move(billboardPacket), node); @@ -319,9 +322,10 @@ void AvatarMixer::broadcastAvatarData() { || otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp || randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) { - auto identityPacket = NLPacket::create(PacketType::AvatarIdentity); - QByteArray individualData = otherNodeData->getAvatar().identityByteArray(); + + auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, individualData.size()); + individualData.replace(0, NUM_BYTES_RFC4122_UUID, otherNode->getUUID().toRfc4122()); identityPacket->write(individualData); From 605b004514a48e18d68285232017dc6877a03b95 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 11:19:36 -0700 Subject: [PATCH 219/582] Assigment client compile fixes --- .../src/AssignmentClientMonitor.cpp | 4 +- assignment-client/src/audio/AudioMixer.cpp | 24 ++++---- .../src/audio/AudioMixerClientData.cpp | 10 ++-- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- .../src/octree/OctreeQueryNode.cpp | 14 ++--- .../src/octree/OctreeQueryNode.h | 3 +- .../src/octree/OctreeSendThread.cpp | 58 +++++++++---------- 7 files changed, 58 insertions(+), 57 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 7dabde54d6..6796c122dc 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -230,8 +230,8 @@ void AssignmentClientMonitor::readPendingDatagrams() { // tell unknown assignment-client child to exit. qDebug() << "asking unknown child to exit."; - auto diePacket = NL::create(PacketType::StopNode, 0); - nodeList->sendPacket(std::move(diePacket), childNode); + auto diePacket = NLPacket::create(PacketType::StopNode, 0); + nodeList->sendPacket(std::move(diePacket), senderSockAddr); } } } diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index bc69374b57..bb58bb0f78 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -524,11 +524,11 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { setAtBit(bitset, HAS_REVERB_BIT); } - envPacket.write(&bitset, sizeof(bitset)); + envPacket->writePrimitive(bitset); if (hasReverb) { - envPacket.write(&reverbTime, sizeof(reverb)); - envPacket.write(&wetLevel, sizeof(wetLevel)); + envPacket->writePrimitive(reverbTime); + envPacket->writePrimitive(wetLevel); } nodeList->sendPacket(std::move(envPacket), node); } @@ -550,13 +550,14 @@ void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const Hif } else if (mixerPacketType == PacketType::MuteEnvironment) { SharedNodePointer sendingNode = nodeList->sendingNodeForPacket(receivedPacket); if (sendingNode->getCanAdjustLocks()) { - QByteArray packet = receivedPacket; - nodeList->populatePacketHeader(packet, PacketType::MuteEnvironment); + auto packet = NLPacket::create(PacketType::MuteEnvironment); + // Copy payload + packet->write(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getType() == NodeType::Agent && node->getActiveSocket() && node->getLinkedData() && node != sendingNode) { - nodeList->writeDatagram(packet, packet.size(), node); + nodeList->sendPacket(std::move(packet), node); } }); } @@ -805,26 +806,27 @@ void AudioMixer::run() { std::unique_ptr mixPacket; if (streamsMixed > 0) { - int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO; + int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO * sizeof(int16_t); mixPacket = NLPacket::create(PacketType::MixedAudio, mixPacketBytes); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - mixPacket.write(&sequence, sizeof(quint16)); + mixPacket->writePrimitive(sequence); // pack mixed audio samples - mixPacket.write(mixSamples, AudioConstants::NETWORK_FRAME_BYTES_STEREO); + mixPacket->write(reinterpret_cast(_mixSamples), + AudioConstants::NETWORK_FRAME_BYTES_STEREO * sizeof(int16_t)); } else { int silentPacketBytes = sizeof(quint16) + sizeof(quint16); mixPacket = NLPacket::create(PacketType::SilentAudioFrame, silentPacketBytes); // pack sequence number quint16 sequence = nodeData->getOutgoingSequenceNumber(); - mixPacket.write(&sequence, sizeof(quint16)); + mixPacket->writePrimitive(sequence); // pack number of silent audio samples quint16 numSilentSamples = AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; - mixPacket.write(&numSilentSamples, sizeof(quint16)); + mixPacket->writePrimitive(numSilentSamples); } // Send audio environment diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index c394305998..13cfe4d1a0 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -159,21 +159,21 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& int numStreamStatsRemaining = _audioStreams.size(); QHash::ConstIterator audioStreamsIterator = _audioStreams.constBegin(); - PacketList statsPacketList(PacketType::AudioStreamStats); + NLPacketList statsPacketList(PacketType::AudioStreamStats); while (numStreamStatsRemaining > 0) { auto statsPacket = NLPacket::create(PacketType::AudioStreamStats); // pack the append flag in this packet - statsPacket->write(&appendFlag, sizeof(quint8)); + statsPacket->writePrimitive(appendFlag); appendFlag = 1; - int numStreamStatsRoomFor = (statsPacket.size() - sizeof(quint8) - sizeof(quint16)) / sizeof(AudioStreamStats); + int numStreamStatsRoomFor = (statsPacket->size() - sizeof(quint8) - sizeof(quint16)) / sizeof(AudioStreamStats); // calculate and pack the number of stream stats to follow quint16 numStreamStatsToPack = std::min(numStreamStatsRemaining, numStreamStatsRoomFor); - statsPacket->write(&numStreamStatsToPack, sizeof(quint16)); + statsPacket->writePrimitive(numStreamStatsToPack); // pack the calculated number of stream stats for (int i = 0; i < numStreamStatsToPack; i++) { @@ -182,7 +182,7 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& stream->perSecondCallbackForUpdatingStats(); AudioStreamStats streamStats = stream->getAudioStreamStats(); - statsPacket->write(&streamStats, sizeof(AudioStreamStats)); + statsPacket->writePrimitive(streamStats); audioStreamsIterator++; } diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index c2b93bc48b..32dc3e996f 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -364,7 +364,7 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { auto killPacket = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID); killPacket->write(killedNode->getUUID().toRfc4122()); - nodeList->broadcastToNodes(killPacket, NodeSet() << NodeType::Agent); + nodeList->broadcastToNodes(std::move(killPacket), NodeSet() << NodeType::Agent); // we also want to remove sequence number data for this avatar on our other avatars // so invoke the appropriate method on the AvatarMixerClientData for other avatars diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 43d6ea9ba6..a368416285 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -42,7 +42,7 @@ OctreeQueryNode::OctreeQueryNode() : _lodInitialized(false), _sequenceNumber(0), _lastRootTimestamp(0), - _myPacketType(PacketTypeUnknown), + _myPacketType(PacketType::Unknown), _isShuttingDown(false), _sentPacketHistory() { @@ -194,14 +194,14 @@ void OctreeQueryNode::resetOctreePacket() { _octreePacket->reset(); // pack in flags - _octreePacket->write(&flags, sizeof(flags)); + _octreePacket->writePrimitive(flags); // pack in sequence number - _octreePacket->write(&_sequenceNumber, sizeof(_sequenceNumber)); + _octreePacket->writePrimitive(_sequenceNumber); // pack in timestamp OCTREE_PACKET_SENT_TIME now = usecTimestampNow(); - _octreePacket->write(&now, sizeof(now)); + _octreePacket->writePrimitive(now); _octreePacketWaiting = false; } @@ -216,10 +216,10 @@ void OctreeQueryNode::writeToPacket(const unsigned char* buffer, unsigned int by // multiple compressed portions together if (_currentPacketIsCompressed) { OCTREE_PACKET_INTERNAL_SECTION_SIZE sectionSize = bytes; - _octreePacket->write(§ionSize, sizeof(sectionSize)); + _octreePacket->writePrimitive(sectionSize); } if (bytes <= _octreePacket->bytesAvailable()) { - _octreePacket->write(buffer, bytes); + _octreePacket->write(reinterpret_cast(buffer), bytes); _octreePacketWaiting = true; } } @@ -368,7 +368,7 @@ bool OctreeQueryNode::hasNextNackedPacket() const { const NLPacket* OctreeQueryNode::getNextNackedPacket() { if (!_nackedSequenceNumbers.isEmpty()) { // could return null if packet is not in the history - return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()); + return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()).get(); } return nullptr; diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 3dfe2ad931..4597378401 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -41,13 +41,12 @@ public: void writeToPacket(const unsigned char* buffer, unsigned int bytes); // writes to end of packet - NLPacket& getPacket() const { return _octreePacket; } + NLPacket& getPacket() const { return *_octreePacket; } bool isPacketWaiting() const { return _octreePacketWaiting; } bool packetIsDuplicate() const; bool shouldSuppressDuplicatePacket(); - unsigned int getAvailable() const { return _octreePacketAvailableBytes; } int getMaxSearchLevel() const { return _maxSearchLevel; } void resetMaxSearchLevel() { _maxSearchLevel = 1; } void incrementMaxSearchLevel() { _maxSearchLevel++; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 633d197980..d2c395dec9 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -147,33 +147,33 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes NLPacket& statsPacket = nodeData->stats.getStatsMessage(); // If the size of the stats message and the octree message will fit in a packet, then piggyback them - if (nodeData->getPacket()->getSizeWithHeader() <= statsPacket->bytesAvailable()) { + if (nodeData->getPacket().getSizeWithHeader() <= statsPacket.bytesAvailable()) { // copy octree message to back of stats message - statsPacket->write(nodeData->getPacket()->getData(), nodeData->getPacket()->getSizeWithHeader()); + statsPacket.write(nodeData->getPacket().getData(), nodeData->getPacket().getSizeWithHeader()); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. int thisWastedBytes = 0; _totalWastedBytes += thisWastedBytes; - _totalBytes += statsPacket->getSizeWithHeader(); + _totalBytes += statsPacket.getSizeWithHeader(); _totalPackets++; if (debug) { NLPacket& sentPacket = nodeData->getPacket(); - sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + sentPacket.seek(sizeof(OCTREE_PACKET_FLAGS)); OCTREE_PACKET_SEQUENCE sequence; - sentPacket->read(&sequence, sizeof(sequence)); + sentPacket.readPrimitive(&sequence); OCTREE_PACKET_SENT_TIME timestamp; - sentPacket->read(×tamp, sizeof(timestamp)); + sentPacket.readPrimitive(×tamp); qDebug() << "Adding stats to packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " statsMessageLength: " << statsPacket->getSizeWithHeader() << - " original size: " << nodeData->getPacket()->getSizeWithHeader() << " [" << _totalBytes << + " statsMessageLength: " << statsPacket.getSizeWithHeader() << + " original size: " << nodeData->getPacket().getSizeWithHeader() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } @@ -184,33 +184,33 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes } else { // not enough room in the packet, send two packets OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()-sendUnreliablePacket(statsPacket, _node); + DependencyManager::get()->sendUnreliablePacket(statsPacket, _node); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. int thisWastedBytes = 0; _totalWastedBytes += thisWastedBytes; - _totalBytes += statsPacket->getSizeWithHeader(); + _totalBytes += statsPacket.getSizeWithHeader(); _totalPackets++; if (debug) { NLPacket& sentPacket = nodeData->getPacket(); - sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + sentPacket.seek(sizeof(OCTREE_PACKET_FLAGS)); OCTREE_PACKET_SEQUENCE sequence; - sentPacket->read(&sequence, sizeof(sequence)); + sentPacket.readPrimitive(&sequence); OCTREE_PACKET_SENT_TIME timestamp; - sentPacket->read(×tamp, sizeof(timestamp)); + sentPacket.readPrimitive(×tamp); qDebug() << "Sending separate stats packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " size: " << statsPacket->getSizeWithHeader() << " [" << _totalBytes << + " size: " << statsPacket.getSizeWithHeader() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } - trueBytesSent += statsPacket->getSizeWithHeader(); + trueBytesSent += statsPacket.getSizeWithHeader(); truePacketsSent++; packetsSent++; @@ -218,26 +218,26 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), _node); packetSent = true; - int packetSizeWithHeader = nodeData->getPacket()->getSizeWithHeader(); + int packetSizeWithHeader = nodeData->getPacket().getSizeWithHeader(); thisWastedBytes = MAX_PACKET_SIZE - packetSizeWithHeader; _totalWastedBytes += thisWastedBytes; - _totalBytes += nodeData->getPacket()->getSizeWithHeader(); + _totalBytes += nodeData->getPacket().getSizeWithHeader(); _totalPackets++; if (debug) { NLPacket& sentPacket = nodeData->getPacket(); - sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + sentPacket.seek(sizeof(OCTREE_PACKET_FLAGS)); OCTREE_PACKET_SEQUENCE sequence; - sentPacket->read(&sequence, sizeof(sequence)); + sentPacket.readPrimitive(&sequence); OCTREE_PACKET_SENT_TIME timestamp; - sentPacket->read(×tamp, sizeof(timestamp)); + sentPacket.readPrimitive(×tamp); qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " size: " << nodeData->getPacket()->getSizeWithHeader() << " [" << _totalBytes << + " size: " << nodeData->getPacket().getSizeWithHeader() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } } @@ -250,8 +250,8 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), _node); packetSent = true; - int packetSizeWithHeader = nodeData->getPacket()->getSizeWithHeader(); - int thisWastedBytes = MAX_PACKET_SIZE -; + int packetSizeWithHeader = nodeData->getPacket().getSizeWithHeader(); + int thisWastedBytes = MAX_PACKET_SIZE - packetSizeWithHeader; _totalWastedBytes += thisWastedBytes; _totalBytes += packetSizeWithHeader; _totalPackets++; @@ -259,13 +259,13 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes if (debug) { NLPacket& sentPacket = nodeData->getPacket(); - sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS)); + sentPacket.seek(sizeof(OCTREE_PACKET_FLAGS)); OCTREE_PACKET_SEQUENCE sequence; - sentPacket->read(&sequence, sizeof(sequence)); + sentPacket.readPrimitive(&sequence); OCTREE_PACKET_SENT_TIME timestamp; - sentPacket->read(×tamp, sizeof(timestamp)); + sentPacket.readPrimitive(×tamp); qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << @@ -277,8 +277,8 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // remember to track our stats if (packetSent) { - nodeData->stats.packetSent(nodeData->getPacket()->getSizeUsed()); - trueBytesSent += nodeData->getPacket()->getSizeUsed(); + nodeData->stats.packetSent(nodeData->getPacket().getSizeUsed()); + trueBytesSent += nodeData->getPacket().getSizeUsed(); truePacketsSent++; packetsSent++; nodeData->octreePacketSent(); @@ -528,7 +528,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus } // If we're not running compressed, then we know we can just send now. Or if we're running compressed, but - // the packet doesn't have enough space to bother attempting to pack more... + // the packet doesn't have enough space to bother attempting to pack more...packet bool sendNow = true; if (nodeData->getCurrentPacketIsCompressed() && From f2e05248174c65a086c4a5cadeeaa0a323ea6cff Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 11:20:01 -0700 Subject: [PATCH 220/582] Add send unreliable takes const ref --- libraries/networking/src/LimitedNodeList.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 3d674516d6..8e188947a8 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -144,11 +144,16 @@ public: // qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, // const HifiSockAddr& overridenSockAddr = HifiSockAddr()); // - + + qint64 sendUnreliablePacket(const NLPacket& packet, const SharedNodePointer& destinationNode) + { assert(false); return 0; } + qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) + { assert(false); return 0; } + // TODO remove those qint64 sendUnreliablePacket(std::unique_ptr& packet, const SharedNodePointer& destinationNode) - { assert(false); return 0; } + { assert(false); return 0; } qint64 sendUnreliablePacket(std::unique_ptr& packet, const HifiSockAddr& sockAddr) - { assert(false); return 0; } + { assert(false); return 0; } qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } From 922d6413d539ed8bd3721655ab9be87bc18c59f6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:21:27 -0700 Subject: [PATCH 221/582] change some const unique_ptr to const NLPacket --- assignment-client/src/octree/OctreeQueryNode.cpp | 2 +- assignment-client/src/octree/OctreeQueryNode.h | 2 +- libraries/networking/src/SentPacketHistory.cpp | 6 +++--- libraries/networking/src/SentPacketHistory.h | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 43d6ea9ba6..173c1dd840 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -356,7 +356,7 @@ void OctreeQueryNode::dumpOutOfView() { } } -void OctreeQueryNode::packetSent(const std::unique_ptr& packet) { +void OctreeQueryNode::packetSent(const NLPacket& packet) { _sentPacketHistory.packetSent(_sequenceNumber, packet); _sequenceNumber++; } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 3dfe2ad931..045600fd98 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -105,7 +105,7 @@ public: bool isShuttingDown() const { return _isShuttingDown; } void octreePacketSent() { packetSent(_octreePacket); } - void packetSent(const std::unique_ptr& packet); + void packetSent(const NLPacket& packet); OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 770973f8d8..4717970c2a 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -24,7 +24,7 @@ SentPacketHistory::SentPacketHistory(int size) } -void SentPacketHistory::packetSent(uint16_t sequenceNumber, const std::unique_ptr& packet) { +void SentPacketHistory::packetSent(uint16_t sequenceNumber, const NLPacket& packet) { // check if given seq number has the expected value. if not, something's wrong with // the code calling this function @@ -38,7 +38,7 @@ void SentPacketHistory::packetSent(uint16_t sequenceNumber, const std::unique_pt _sentPackets.insert(NLPacket::createCopy(packet)); } -const std::unique_ptr& SentPacketHistory::getPacket(uint16_t sequenceNumber) const { +const NLPacket& SentPacketHistory::getPacket(uint16_t sequenceNumber) const { const int UINT16_RANGE = std::numeric_limits::max() + 1; @@ -49,5 +49,5 @@ const std::unique_ptr& SentPacketHistory::getPacket(uint16_t sequenceN seqDiff += UINT16_RANGE; } - return *_sentPackets.get(seqDiff); + return *_sentPackets.get(seqDiff).get(); } diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index ad03f87f88..e9ba58d4ef 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -24,8 +24,8 @@ class SentPacketHistory { public: SentPacketHistory(int size = MAX_REASONABLE_SEQUENCE_GAP); - void packetSent(uint16_t sequenceNumber, const std::unique_ptr& packet); - const std::unique_ptr& getPacket(uint16_t sequenceNumber) const; + void packetSent(uint16_t sequenceNumber, const NLPacket& packet); + const NLPacket& getPacket(uint16_t sequenceNumber) const; private: RingBufferHistory> _sentPackets; // circular buffer From bd9b42bd4cbb4fc4f8ff48d65c41a7875274227b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:23:44 -0700 Subject: [PATCH 222/582] change createCopy in packet to take const & --- libraries/networking/src/NLPacket.cpp | 9 ++++----- libraries/networking/src/NLPacket.h | 2 +- libraries/networking/src/Packet.cpp | 5 ++--- libraries/networking/src/Packet.h | 2 +- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index f61b47b4b2..f125cdc6b7 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -33,13 +33,12 @@ std::unique_ptr NLPacket::create(PacketType::Value type, int64_t size) if (size > maxPayloadSize(type)) { return std::unique_ptr(); } - + return std::unique_ptr(new NLPacket(type, size)); } -std::unique_ptr NLPacket::createCopy(const std::unique_ptr& other) { - Q_ASSERT(other); - return std::unique_ptr(new NLPacket(*other)); +std::unique_ptr NLPacket::createCopy(const NLPacket& other) { + return std::unique_ptr(new NLPacket(other)); } NLPacket::NLPacket(PacketType::Value type, int64_t size) : Packet(type, localHeaderSize(type) + size) { @@ -59,4 +58,4 @@ void NLPacket::setConnectionUuid(QUuid connectionUuid) { auto offset = Packet::totalHeadersSize() + ((NON_SOURCED_PACKETS.contains(_type)) ? 0 : NUM_BYTES_RFC4122_UUID); memcpy(_packet.get() + offset, connectionUuid.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); -} \ No newline at end of file +} diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 744056c103..7ea449815b 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -19,7 +19,7 @@ class NLPacket : public Packet { public: static std::unique_ptr create(PacketType::Value type, int64_t size = -1); // Provided for convenience, try to limit use - static std::unique_ptr createCopy(const std::unique_ptr& other); + static std::unique_ptr createCopy(const NLPacket& other); static int64_t localHeaderSize(PacketType::Value type); static int64_t maxPayloadSize(PacketType::Value type); diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index aa0b407398..6d585ac4aa 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -38,9 +38,8 @@ std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { return std::unique_ptr(new Packet(type, size)); } -std::unique_ptr Packet::createCopy(const std::unique_ptr& other) { - Q_ASSERT(other); - return std::unique_ptr(new Packet(*other)); +std::unique_ptr Packet::createCopy(const Packet& other) { + return std::unique_ptr(new Packet(other)); } qint64 Packet::totalHeadersSize() const { diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 7bd8d81194..1de17602da 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -25,7 +25,7 @@ public: static std::unique_ptr create(PacketType::Value type, int64_t size = -1); // Provided for convenience, try to limit use - static std::unique_ptr createCopy(const std::unique_ptr& other); + static std::unique_ptr createCopy(const Packet& other); static qint64 localHeaderSize(PacketType::Value type); static qint64 maxPayloadSize(PacketType::Value type); From 6d2fea442616c2d311e6a6e60ad109323818a27b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:24:58 -0700 Subject: [PATCH 223/582] make NLPacket copy take const, fix get in SPH --- libraries/networking/src/NLPacket.cpp | 2 +- libraries/networking/src/NLPacket.h | 2 +- libraries/networking/src/SentPacketHistory.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index f125cdc6b7..4f17d3d754 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -44,7 +44,7 @@ std::unique_ptr NLPacket::createCopy(const NLPacket& other) { NLPacket::NLPacket(PacketType::Value type, int64_t size) : Packet(type, localHeaderSize(type) + size) { } -NLPacket::NLPacket(NLPacket& other) : Packet(other) { +NLPacket::NLPacket(const NLPacket& other) : Packet(other) { } void NLPacket::setSourceUuid(QUuid sourceUuid) { diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 7ea449815b..9368b25720 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -29,7 +29,7 @@ public: protected: NLPacket(PacketType::Value type, int64_t size); - NLPacket(NLPacket& other); + NLPacket(const NLPacket& other); void setSourceUuid(QUuid sourceUuid); void setConnectionUuid(QUuid connectionUuid); diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 4717970c2a..68bd5f1c67 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -49,5 +49,5 @@ const NLPacket& SentPacketHistory::getPacket(uint16_t sequenceNumber) const { seqDiff += UINT16_RANGE; } - return *_sentPackets.get(seqDiff).get(); + return *_sentPackets.get(seqDiff)->get(); } From 765265abd8b59630e47db0af9126601278d7db07 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:27:06 -0700 Subject: [PATCH 224/582] fix networking API calls in IceServer --- ice-server/src/IceServer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index bc76d818c3..24199b8bb8 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -56,12 +56,12 @@ void IceServer::processDatagrams() { PacketType::Value packetType = packetTypeForPacket(incomingPacket); - if (packetType == PacketType::IceServerHeartbeat) { + if (packetType == PacketType::ICEServerHeartbeat) { SharedNetworkPeer peer = addOrUpdateHeartbeatingPeer(incomingPacket); // so that we can send packets to the heartbeating peer when we need, we need to activate a socket now peer->activateMatchingOrNewSymmetricSocket(sendingSockAddr); - } else if (packetType == PacketType::IceServerQuery) { + } else if (packetType == PacketType::ICEServerQuery) { QDataStream heartbeatStream(incomingPacket); // this is a node hoping to connect to a heartbeating peer - do we have the heartbeating peer? @@ -128,13 +128,13 @@ SharedNetworkPeer IceServer::addOrUpdateHeartbeatingPeer(const QByteArray& incom } void IceServer::sendPeerInformationPacket(const NetworkPeer& peer, const HifiSockAddr* destinationSockAddr) { - auto peerPacket = Packet::create(PacketType::IceServerPeerInformation); + auto peerPacket = Packet::create(PacketType::ICEServerPeerInformation); // get the byte array for this peer peerPacket->write(peer.toByteArray()); // write the current packet - _serverSocket.writeDatagram(peerPacket.constData(), peerPacket.sizeUsed(), + _serverSocket.writeDatagram(peerPacket->getData(), peerPacket->getSizeWithHeader(), destinationSockAddr->getAddress(), destinationSockAddr->getPort()); } From c903d284bb66c6e60d0c457077b003cdd816ee78 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:31:57 -0700 Subject: [PATCH 225/582] fix for arguments that are now const NLPacket& --- libraries/networking/src/SentPacketHistory.cpp | 10 +++++++--- libraries/networking/src/SentPacketHistory.h | 2 +- libraries/octree/src/OctreeEditPacketSender.cpp | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index 68bd5f1c67..bea144e6aa 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -38,7 +38,7 @@ void SentPacketHistory::packetSent(uint16_t sequenceNumber, const NLPacket& pack _sentPackets.insert(NLPacket::createCopy(packet)); } -const NLPacket& SentPacketHistory::getPacket(uint16_t sequenceNumber) const { +const NLPacket* SentPacketHistory::getPacket(uint16_t sequenceNumber) const { const int UINT16_RANGE = std::numeric_limits::max() + 1; @@ -48,6 +48,10 @@ const NLPacket& SentPacketHistory::getPacket(uint16_t sequenceNumber) const { if (seqDiff < 0) { seqDiff += UINT16_RANGE; } - - return *_sentPackets.get(seqDiff)->get(); + auto packet = _sentPackets.get(seqDiff); + if (packet) { + return packet->get(); + } else { + return nullptr; + } } diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index e9ba58d4ef..2971df12f5 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -25,7 +25,7 @@ public: SentPacketHistory(int size = MAX_REASONABLE_SEQUENCE_GAP); void packetSent(uint16_t sequenceNumber, const NLPacket& packet); - const NLPacket& getPacket(uint16_t sequenceNumber) const; + const NLPacket* getPacket(uint16_t sequenceNumber) const; private: RingBufferHistory> _sentPackets; // circular buffer diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 86d25af759..4151f19821 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -108,7 +108,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu } // add packet to history - _sentPacketHistories[nodeUUID].packetSent(sequence, packet); + _sentPacketHistories[nodeUUID].packetSent(sequence, *packet.get()); queuePacketForSending(node, std::move(packet)); } @@ -186,7 +186,7 @@ void OctreeEditPacketSender::queuePacketToNodes(std::unique_ptr packet if (isMyJurisdiction) { // make a copy of this packet for this node and queue - auto packetCopy = NLPacket::createCopy(packet); + auto packetCopy = NLPacket::createCopy(*packet.get()); queuePacketToNode(nodeUUID, std::move(packetCopy)); } } @@ -362,10 +362,10 @@ void OctreeEditPacketSender::processNackPacket(const QByteArray& packet) { dataAt += sizeof(unsigned short int); // retrieve packet from history - const std::unique_ptr& packet = sentPacketHistory.getPacket(sequenceNumber); + const NLPacket* packet = sentPacketHistory.getPacket(sequenceNumber); if (packet) { const SharedNodePointer& node = DependencyManager::get()->nodeWithUUID(sendingNodeUUID); - queuePacketForSending(node, NLPacket::createCopy(packet)); + queuePacketForSending(node, NLPacket::createCopy(*packet)); } } } From 7e07754773c860be329ff1f053bbd0a0635d7e7e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:35:12 -0700 Subject: [PATCH 226/582] fix octreePacketSent call with const NLPacket& --- assignment-client/src/octree/OctreeQueryNode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 0329c7756a..cdd9270014 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -103,7 +103,7 @@ public: void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } - void octreePacketSent() { packetSent(_octreePacket); } + void octreePacketSent() { packetSent(*_octreePacket.get()); } void packetSent(const NLPacket& packet); OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } From cc0e0e6a1f37a9e762f9e52a1ab11541086c87b4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 11:35:36 -0700 Subject: [PATCH 227/582] Compile fixes in assignment client --- .../octree/OctreeInboundPacketProcessor.cpp | 23 ++++++++++--------- .../src/octree/OctreeQueryNode.h | 3 ++- .../src/octree/OctreeSendThread.cpp | 4 ++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 678a448fce..174a592c2a 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -240,8 +240,9 @@ int OctreeInboundPacketProcessor::sendNackPackets() { return 0; } - NLPacketList nackPacketList(_myServer->getMyEditNackType(); + NLPacketList nackPacketList(_myServer->getMyEditNackType()); auto nodeList = DependencyManager::get(); + int packetsSent = 0; NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); while (i != _singleSenderStats.end()) { @@ -275,20 +276,20 @@ int OctreeInboundPacketProcessor::sendNackPackets() { while (it != missingSequenceNumbers.constEnd()) { unsigned short int sequenceNumber = *it; - nackPacketList->write(&sequenceNumber, sizeof(sequenceNumber)); + nackPacketList.writePrimitive(sequenceNumber); ++it; } + + packetsSent = nackPacketList.getNumPackets(); + + if (packetsSent) { + qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; + } + + // send the list of nack packets + nodeList->sendPacketList(nackPacketList, destinationNode); } - int packetsSent = nackPacketList.getNumPackets(); - - if (packetsSent) { - qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; - } - - // send the list of nack packets - nodeList->sendPacketList(nackPacketList, destinationNode); - return packetsSent; } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 4597378401..9de0efc84b 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -46,7 +46,8 @@ public: bool packetIsDuplicate() const; bool shouldSuppressDuplicatePacket(); - + + unsigned int getAvailable() const { return _octreePacket->bytesAvailable(); } int getMaxSearchLevel() const { return _maxSearchLevel; } void resetMaxSearchLevel() { _maxSearchLevel = 1; } void incrementMaxSearchLevel() { _maxSearchLevel++; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index d2c395dec9..ca32d1a528 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -580,9 +580,9 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // Here's where we can/should allow the server to send other data... // send the environment packet // TODO: should we turn this into a while loop to better handle sending multiple special packets - if (_myServer->hasSpecialPacketToSend(_node) && !nodeData->isShuttingDown()) { + if (_myServer->hasSpecialPacketsToSend(_node) && !nodeData->isShuttingDown()) { int specialPacketsSent; - trueBytesSent += _myServer->sendSpecialPacket(_node, nodeData, specialPacketsSent); + trueBytesSent += _myServer->sendSpecialPackets(_node, nodeData, specialPacketsSent); nodeData->resetOctreePacket(); // because nodeData's _sequenceNumber has changed truePacketsSent += specialPacketsSent; packetsSentThisInterval += specialPacketsSent; From 83cc4380a746f1c0f89a0b4afac881a4db532b5b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:36:12 -0700 Subject: [PATCH 228/582] fix for sentPacketHistory dequeue --- assignment-client/src/octree/OctreeQueryNode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 6799a9e9cf..7df9604817 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -368,7 +368,7 @@ bool OctreeQueryNode::hasNextNackedPacket() const { const NLPacket* OctreeQueryNode::getNextNackedPacket() { if (!_nackedSequenceNumbers.isEmpty()) { // could return null if packet is not in the history - return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()).get(); + return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()); } return nullptr; From a49b985dad499028acd20608d0fa69560d50f008 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:37:20 -0700 Subject: [PATCH 229/582] fix call to packetSent from EntityServer --- assignment-client/src/entities/EntityServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 59a7df1075..abb55f2a48 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -96,7 +96,7 @@ int EntityServer::sendSpecialPackets(const SharedNodePointer& node, OctreeQueryN auto specialPacket = tree->encodeEntitiesDeletedSince(queryNode->getSequenceNumber(), deletedEntitiesSentAt, hasMoreToSend); - queryNode->packetSent(specialPacket); + queryNode->packetSent(*specialPacket.get()); totalBytes += specialPacket->getSizeWithHeader(); packetsSent++; From a363f42bb206bb09b17e32a34605f4100170405a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:42:18 -0700 Subject: [PATCH 230/582] pass const NLPacket& for all sendUnreliablePacket calls --- domain-server/src/DomainServer.cpp | 6 +++--- interface/src/Application.cpp | 2 +- libraries/audio-client/src/AudioClient.cpp | 2 +- libraries/audio/src/AudioInjector.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 7 +------ libraries/networking/src/PacketSender.cpp | 2 +- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index fffd67876f..46b126396b 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1029,7 +1029,7 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) { addNodePacket->write(rfcConnectionSecret); // send off this packet to the node - limitedNodeList->sendUnreliablePacket(addNodePacket, node); + limitedNodeList->sendUnreliablePacket(*addNodePacket, node); } ); } @@ -1093,7 +1093,7 @@ void DomainServer::readAvailableDatagrams() { assignmentStream << uniqueAssignment; - limitedNodeList->sendUnreliablePacket(assignmentPacket, senderSockAddr); + limitedNodeList->sendUnreliablePacket(*assignmentPacket, senderSockAddr); // add the information for that deployed assignment to the hash of pending assigned nodes PendingAssignedNodeData* pendingNodeData = new PendingAssignedNodeData(assignmentToDeploy->getUUID(), @@ -1124,7 +1124,7 @@ void DomainServer::readAvailableDatagrams() { dtlsRequiredPacket->writePrimitive(dtlsPort); } - limitedNodeList->sendUnreliablePacket(dtlsRequiredPacket, senderSockAddr); + limitedNodeList->sendUnreliablePacket(*dtlsRequiredPacket, senderSockAddr); } } } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9a7f33fda3..be773d52f3 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2891,7 +2891,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp queryPacket->setSizeUsed(packetSize); // make sure we still have an active socket - nodeList->sendUnreliablePacket(queryPacket, node); + nodeList->sendUnreliablePacket(*queryPacket, node); } }); } diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 858be03296..73a785bb7b 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -882,7 +882,7 @@ void AudioClient::handleAudioInput() { nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendAudioPacket); - nodeList->sendUnreliablePacket(_audioPacket, audioMixer); + nodeList->sendUnreliablePacket(*_audioPacket, audioMixer); _outgoingAvatarAudioSequenceNumber++; } diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 6b28f800df..c8744ace42 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -238,7 +238,7 @@ void AudioInjector::injectToMixer() { SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); // send off this audio packet - nodeList->sendUnreliablePacket(audioPacket, audioMixer); + nodeList->sendUnreliablePacket(*audioPacket, audioMixer); outgoingInjectedAudioSequenceNumber++; _currentSendPosition += bytesToCopy; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 8e188947a8..8dd2a459ad 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -144,16 +144,11 @@ public: // qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, // const HifiSockAddr& overridenSockAddr = HifiSockAddr()); // - + qint64 sendUnreliablePacket(const NLPacket& packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { assert(false); return 0; } - // TODO remove those - qint64 sendUnreliablePacket(std::unique_ptr& packet, const SharedNodePointer& destinationNode) - { assert(false); return 0; } - qint64 sendUnreliablePacket(std::unique_ptr& packet, const HifiSockAddr& sockAddr) - { assert(false); return 0; } qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index 3db845166e..de3ee7dc98 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -272,7 +272,7 @@ bool PacketSender::nonThreadedProcess() { unlock(); // send the packet through the NodeList... - DependencyManager::get()->sendUnreliablePacket(packetPair.second, packetPair.first); + DependencyManager::get()->sendUnreliablePacket(*(packetPair.second), packetPair.first); packetsSentThisCall++; _packetsOverCheckInterval++; From 806862fae9bb3ae0cc500e70941cdb7adde0f619 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:50:39 -0700 Subject: [PATCH 231/582] pass existing SharedNodePointer from EntityServer --- assignment-client/src/entities/EntityServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index abb55f2a48..b928adde53 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -101,7 +101,7 @@ int EntityServer::sendSpecialPackets(const SharedNodePointer& node, OctreeQueryN totalBytes += specialPacket->getSizeWithHeader(); packetsSent++; - DependencyManager::get()->sendPacket(std::move(specialPacket), SharedNodePointer(node)); + DependencyManager::get()->sendPacket(std::move(specialPacket), node); } nodeData->setLastDeletedEntitiesSentAt(deletePacketSentAt); From 94d2fce1dd329863204a23db116b309dc71e7905 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 11:52:57 -0700 Subject: [PATCH 232/582] Fix sendNackPackets logic --- .../src/octree/OctreeInboundPacketProcessor.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 174a592c2a..613eec18df 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -280,14 +280,15 @@ int OctreeInboundPacketProcessor::sendNackPackets() { ++it; } - packetsSent = nackPacketList.getNumPackets(); - if (packetsSent) { + if (nackPacketList.getNumPackets()) { qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; + + packetsSent += nackPacketList.getNumPackets(); + + // send the list of nack packets + nodeList->sendPacketList(nackPacketList, destinationNode); } - - // send the list of nack packets - nodeList->sendPacketList(nackPacketList, destinationNode); } return packetsSent; From a38cb56c1c9a8c54ee0f08dc5cf3a7926914edf3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 11:56:24 -0700 Subject: [PATCH 233/582] fix an accidental comment add --- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index ca32d1a528..a9619034d9 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -528,7 +528,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus } // If we're not running compressed, then we know we can just send now. Or if we're running compressed, but - // the packet doesn't have enough space to bother attempting to pack more...packet + // the packet doesn't have enough space to bother attempting to pack more... bool sendNow = true; if (nodeData->getCurrentPacketIsCompressed() && From adf2ce85f123a877e1b738eef43759d4620639b3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:03:15 -0700 Subject: [PATCH 234/582] pack the size of the connection denied reason --- domain-server/src/DomainServer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 46b126396b..3876366790 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -620,9 +620,10 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock // this is an agent and we've decided we won't let them connect - send them a packet to deny connection QByteArray utfString = reason.toUtf8(); - int payloadSize = utfString.size(); + qint16 payloadSize = utfString.size(); - auto connectionDeniedPacket = NLPacket::create(PacketType::DomainConnectionDenied, payloadSize); + auto connectionDeniedPacket = NLPacket::create(PacketType::DomainConnectionDenied, payloadSize + sizeof(payloadSize)); + connectionDeniedPacket->write(payloadSize); connectionDeniedPacket->write(utfString); // tell client it has been refused. From cafa8b65f5092c90316f9c7380b3d831b084842c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:05:44 -0700 Subject: [PATCH 235/582] specify the size of the DTLS required packet --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 3876366790..f78fbc6bbf 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1118,7 +1118,7 @@ void DomainServer::readAvailableDatagrams() { static std::unique_ptr dtlsRequiredPacket; if (!dtlsRequiredPacket) { - dtlsRequiredPacket = NLPacket::create(PacketType::DomainServerRequireDTLS); + dtlsRequiredPacket = NLPacket::create(PacketType::DomainServerRequireDTLS, sizeof(unsigned short)); // pack the port that we accept DTLS traffic on unsigned short dtlsPort = limitedNodeList->getDTLSSocket().localPort(); From 4c8f32ce7be8579652215697c2478cda9bb58783 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:13:15 -0700 Subject: [PATCH 236/582] add an assert for an NLPacketList segment that is oversized --- libraries/networking/src/NLPacketList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NLPacketList.cpp b/libraries/networking/src/NLPacketList.cpp index 785e3c3f9f..8cadc1b9f5 100644 --- a/libraries/networking/src/NLPacketList.cpp +++ b/libraries/networking/src/NLPacketList.cpp @@ -63,7 +63,7 @@ qint64 NLPacketList::writeData(const char* data, qint64 maxSize) { // but the PacketList is not going to be sent ordered qDebug() << "Error in PacketList::writeData - attempted to write a segment to an unordered packet that is" << "larger than the payload size."; - return -1; + Q_ASSERT(false); } // copy from currentPacket where the segment started to the beginning of the newPacket From 01d1a17231bd67d3f052304c0ec12ec62b85db30 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:20:28 -0700 Subject: [PATCH 237/582] fix indentation in LimitedNodeList --- libraries/networking/src/LimitedNodeList.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 901788b1f3..812920ee5a 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -220,16 +220,16 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { } qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* address = 0, quint16* port = 0) { - qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); + qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); - SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); - if (sendingNode) { - emit dataReceived(sendingNode->getType(), incomingPacket.size()); - } else { - emit dataReceived(NodeType::Unassigned, incomingPacket.size()); - } + SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); + if (sendingNode) { + emit dataReceived(sendingNode->getType(), incomingPacket.size()); + } else { + emit dataReceived(NodeType::Unassigned, incomingPacket.size()); + } - return result; + return result; } qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { From bcea400ee4312f9d587dbe6950ef299b73f0ae92 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:23:12 -0700 Subject: [PATCH 238/582] delete the old methods to get closer to an even PR --- libraries/networking/src/LimitedNodeList.cpp | 114 ------------------- libraries/networking/src/LimitedNodeList.h | 43 ++----- 2 files changed, 7 insertions(+), 150 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 812920ee5a..dc08f6d200 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -248,107 +248,6 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSock return bytesWritten; } -//qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, -// const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr) { -// if (destinationNode) { -// PacketType::Value packetType = packetTypeForPacket(datagram); -// -// if (NON_VERIFIED_PACKETS.contains(packetType)) { -// return writeUnverifiedDatagram(datagram, destinationNode, overridenSockAddr); -// } -// -// // if we don't have an overridden address, assume they want to send to the node's active socket -// const HifiSockAddr* destinationSockAddr = &overridenSockAddr; -// if (overridenSockAddr.isNull()) { -// if (destinationNode->getActiveSocket()) { -// // use the node's active socket as the destination socket -// destinationSockAddr = destinationNode->getActiveSocket(); -// } else { -// // we don't have a socket to send to, return 0 -// return 0; -// } -// } -// -// QByteArray datagramCopy = datagram; -// -// // if we're here and the connection secret is null, debug out - this could be a problem -// if (destinationNode->getConnectionSecret().isNull()) { -// qDebug() << "LimitedNodeList::writeDatagram called for verified datagram with null connection secret for" -// << "destination node" << destinationNode->getUUID() << " - this is either not secure or will cause" -// << "this packet to be unverifiable on the receiving side."; -// } -// -// // perform replacement of hash and optionally also sequence number in the header -// if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { -// PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType); -// replaceHashAndSequenceNumberInPacket(datagramCopy, destinationNode->getConnectionSecret(), -// sequenceNumber, packetType); -// } else { -// replaceHashInPacket(datagramCopy, destinationNode->getConnectionSecret(), packetType); -// } -// -// emit dataSent(destinationNode->getType(), datagram.size()); -// auto bytesWritten = writeDatagram(datagramCopy, *destinationSockAddr); -// // Keep track of per-destination-node bandwidth -// destinationNode->recordBytesSent(bytesWritten); -// return bytesWritten; -// } -// -// // didn't have a destinationNode to send to, return 0 -// return 0; -//} -// -//qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr) { -// if (destinationNode) { -// // if we don't have an ovveriden address, assume they want to send to the node's active socket -// const HifiSockAddr* destinationSockAddr = &overridenSockAddr; -// if (overridenSockAddr.isNull()) { -// if (destinationNode->getActiveSocket()) { -// // use the node's active socket as the destination socket -// destinationSockAddr = destinationNode->getActiveSocket(); -// } else { -// // we don't have a socket to send to, return 0 -// return 0; -// } -// } -// -// PacketType::Value packetType = packetTypeForPacket(datagram); -// -// // optionally peform sequence number replacement in the header -// if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { -// -// QByteArray datagramCopy = datagram; -// -// PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType); -// replaceSequenceNumberInPacket(datagramCopy, sequenceNumber, packetType); -// -// // send the datagram with sequence number replaced in header -// return writeDatagram(datagramCopy, *destinationSockAddr); -// } else { -// return writeDatagram(datagram, *destinationSockAddr); -// } -// } -// -// // didn't have a destinationNode to send to, return 0 -// return 0; -//} -// -//qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { -// return writeDatagram(datagram, destinationSockAddr); -//} -// -//qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr) { -// return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); -//} -// -//qint64 LimitedNodeList::writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr) { -// return writeUnverifiedDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); -//} - PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType) { // Thanks to std::map and std::unordered_map this line either default constructs the // PacketType::SequenceMap and the PacketSequenceNumber or returns the existing value. @@ -506,19 +405,6 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t } } -// unsigned LimitedNodeList::broadcastToNodes(PacketList& packetList, const NodeSet& destinationNodeTypes) { - // unsigned n = 0; - // - // eachNode([&](const SharedNodePointer& node){ - // if (destinationNodeTypes.contains(node->getType())) { - // writeDatagram(packet, node); - // ++n; - // } - // }); - // - // return n; -// } - std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingType) { int packetSize = sizeof(PingType_t) + sizeof(quint64); auto pingPacket = NLPacket::create(PacketType::Ping, packetSize); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 8dd2a459ad..5298eec042 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -121,44 +121,16 @@ public: bool packetVersionAndHashMatch(const QByteArray& packet); - // QByteArray byteArrayWithPopulatedHeader(PacketType::Value packetType) - // { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } - // int populatePacketHeader(QByteArray& packet, PacketType::Value packetType) - // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - // int populatePacketHeader(char* packet, PacketType::Value packetType) - // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); -// -// qint64 writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); -// -// qint64 writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); -// -// qint64 writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); -// -// qint64 writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); -// -// qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, -// const HifiSockAddr& overridenSockAddr = HifiSockAddr()); -// - qint64 sendUnreliablePacket(const NLPacket& packet, const SharedNodePointer& destinationNode) - { assert(false); return 0; } - qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) - { assert(false); return 0; } + qint64 sendUnreliablePacket(const NLPacket& packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } + qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { assert(false); return 0; } - qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) - { assert(false); return 0; } - qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) - { assert(false); return 0; } + qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } + qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) { assert(false); return 0; } - qint64 sendPacketList(NLPacketList& packetList, const SharedNodePointer& destinationNode) - { assert(false); return 0; } - qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) - { assert(false); return 0; } + qint64 sendPacketList(NLPacketList& packetList, const SharedNodePointer& destinationNode) { assert(false); return 0; } + qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) { assert(false); return 0; } void (*linkedDataCreateCallback)(Node *); @@ -183,8 +155,7 @@ public: int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray& packet); int findNodeAndUpdateWithDataFromPacket(const QByteArray& packet); - unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) - { assert(false); return 0; } + unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) { assert(false); return 0; } SharedNodePointer soloNodeOfType(char nodeType); void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); From 11a4c20a212b34a3046a547cf073a89616e99707 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:23:54 -0700 Subject: [PATCH 239/582] fix payloadSize write in DomainServer --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index f78fbc6bbf..a77156a8c9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -623,7 +623,7 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock qint16 payloadSize = utfString.size(); auto connectionDeniedPacket = NLPacket::create(PacketType::DomainConnectionDenied, payloadSize + sizeof(payloadSize)); - connectionDeniedPacket->write(payloadSize); + connectionDeniedPacket->writePrimitive(payloadSize); connectionDeniedPacket->write(utfString); // tell client it has been refused. From 6dc7745826c20b871d104c3c5d1fe73093a288db Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:29:21 -0700 Subject: [PATCH 240/582] remove two lines from PacketHeaders --- libraries/networking/src/PacketHeaders.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 2fc21b9a38..ca1dfc31e4 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -166,8 +166,6 @@ QString nameForPacketType(PacketType::Value packetType) { return QString("unexpected"); } - - QByteArray byteArrayWithUUIDPopulatedHeader(PacketType::Value packetType, const QUuid& connectionUUID) { QByteArray freshByteArray(MAX_PACKET_HEADER_BYTES, 0); freshByteArray.resize(populatePacketHeaderWithUUID(freshByteArray, packetType, connectionUUID)); From e4051f9e30673bf40219e449db552caa523fb6ec Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 12:32:18 -0700 Subject: [PATCH 241/582] Remove unnecessary .get() --- assignment-client/src/avatars/AvatarMixer.cpp | 2 -- assignment-client/src/octree/OctreeQueryNode.h | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 0135e62143..0d4e5b5934 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -408,7 +408,6 @@ void AvatarMixer::readPendingDatagrams() { break; } case PacketType::AvatarIdentity: { - // check if we have a matching node in our list SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); @@ -425,7 +424,6 @@ void AvatarMixer::readPendingDatagrams() { break; } case PacketType::AvatarBillboard: { - // check if we have a matching node in our list SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 5964d4eaf1..faec2d2bba 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -104,7 +104,7 @@ public: void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } - void octreePacketSent() { packetSent(*_octreePacket.get()); } + void octreePacketSent() { packetSent(*_octreePacket); } void packetSent(const NLPacket& packet); OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } From 3da1a81363deccf7440e408f239d1dc489f60755 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:32:52 -0700 Subject: [PATCH 242/582] remove packet header population from PacketHeaders --- libraries/networking/src/PacketHeaders.cpp | 41 ---------------------- libraries/networking/src/PacketHeaders.h | 4 --- 2 files changed, 45 deletions(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index ca1dfc31e4..865159f7cc 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -166,47 +166,6 @@ QString nameForPacketType(PacketType::Value packetType) { return QString("unexpected"); } -QByteArray byteArrayWithUUIDPopulatedHeader(PacketType::Value packetType, const QUuid& connectionUUID) { - QByteArray freshByteArray(MAX_PACKET_HEADER_BYTES, 0); - freshByteArray.resize(populatePacketHeaderWithUUID(freshByteArray, packetType, connectionUUID)); - return freshByteArray; -} - -int populatePacketHeaderWithUUID(QByteArray& packet, PacketType::Value packetType, const QUuid& connectionUUID) { - if (packet.size() < numBytesForPacketHeaderGivenPacketType(packetType)) { - packet.resize(numBytesForPacketHeaderGivenPacketType(packetType)); - } - - return populatePacketHeaderWithUUID(packet.data(), packetType, connectionUUID); -} - -int populatePacketHeaderWithUUID(char* packet, PacketType::Value packetType, const QUuid& connectionUUID) { - int numTypeBytes = packArithmeticallyCodedValue(packetType, packet); - packet[numTypeBytes] = versionForPacketType(packetType); - - char* position = packet + numTypeBytes + sizeof(PacketVersion); - - QByteArray rfcUUID = connectionUUID.toRfc4122(); - memcpy(position, rfcUUID.constData(), NUM_BYTES_RFC4122_UUID); - position += NUM_BYTES_RFC4122_UUID; - - if (!NON_VERIFIED_PACKETS.contains(packetType)) { - // pack 16 bytes of zeros where the md5 hash will be placed once data is packed - memset(position, 0, NUM_BYTES_MD5_HASH); - position += NUM_BYTES_MD5_HASH; - } - - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { - // Pack zeros for the number of bytes that the sequence number requires. - // The LimitedNodeList will handle packing in the sequence number when sending out the packet. - memset(position, 0, sizeof(PacketSequenceNumber)); - position += sizeof(PacketSequenceNumber); - } - - // return the number of bytes written for pointer pushing - return position - packet; -} - int numBytesForPacketHeader(const QByteArray& packet) { PacketType::Value packetType = packetTypeForPacket(packet); return numBytesForPacketHeaderGivenPacketType(packetType); diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 132bff6419..002e4ae58e 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -107,10 +107,6 @@ QString nameForPacketType(PacketType::Value packetType); const QUuid nullUUID = QUuid(); -QByteArray byteArrayWithUUIDPopulatedHeader(PacketType::Value packetType, const QUuid& connectionUUID); -int populatePacketHeaderWithUUID(QByteArray& packet, PacketType::Value packetType, const QUuid& connectionUUID); -int populatePacketHeaderWithUUID(char* packet, PacketType::Value packetType, const QUuid& connectionUUID); - int numHashBytesForType(PacketType::Value packetType); int numSequenceNumberBytesForType(PacketType::Value packetType); From f68845e8062777241074ea1202254f515c6b725c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:33:34 -0700 Subject: [PATCH 243/582] remove hash and sequence number replacement in PacketHeaders --- libraries/networking/src/PacketHeaders.cpp | 28 ---------------------- libraries/networking/src/PacketHeaders.h | 8 ------- 2 files changed, 36 deletions(-) diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 865159f7cc..bea061ae74 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -231,34 +231,6 @@ PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketTy return result; } -void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType::Value packetType) { - if (packetType == PacketType::Unknown) { - packetType = packetTypeForPacket(packet); - } - - packet.replace(hashOffsetForPacketType(packetType), NUM_BYTES_MD5_HASH, - hashForPacketAndConnectionUUID(packet, connectionUUID)); -} - -void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, PacketType::Value packetType) { - if (packetType == PacketType::Unknown) { - packetType = packetTypeForPacket(packet); - } - - packet.replace(sequenceNumberOffsetForPacketType(packetType), - sizeof(PacketSequenceNumber), reinterpret_cast(&sequenceNumber), sizeof(PacketSequenceNumber)); -} - -void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, - PacketType::Value packetType) { - if (packetType == PacketType::Unknown) { - packetType = packetTypeForPacket(packet); - } - - replaceHashInPacket(packet, connectionUUID, packetType); - replaceSequenceNumberInPacket(packet, sequenceNumber, packetType); -} - PacketType::Value packetTypeForPacket(const QByteArray& packet) { return (PacketType::Value) arithmeticCodingValueFromBuffer(packet.data()); } diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 002e4ae58e..0108e3e03a 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -129,14 +129,6 @@ QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType = PacketType::Unknown); -void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType::Value packetType = PacketType::Unknown); - -void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, - PacketType::Value packetType = PacketType::Unknown); - -void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, - PacketType::Value packetType = PacketType::Unknown); - int arithmeticCodingValueFromBuffer(const char* checkValue); int numBytesArithmeticCodingFromBuffer(const char* checkValue); From dd30813ae00c410036228ff4af94d4e098ddaff2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:39:43 -0700 Subject: [PATCH 244/582] remove an extra line in DomainServer --- domain-server/src/DomainServer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index f62ba89871..b46ccf3884 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -34,7 +34,6 @@ typedef QSharedPointer SharedAssignmentPointer; typedef QMultiHash TransactionHash; - class DomainServer : public QCoreApplication, public HTTPSRequestHandler { Q_OBJECT public: From 14b73ae00f967895b204fdfcfe0b844c12a59c1e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 12:45:32 -0700 Subject: [PATCH 245/582] remove qtimespan that isn't used anymore --- assignment-client/src/Agent.cpp | 48 +- libraries/shared/src/qtimespan.cpp | 2291 ---------------------------- libraries/shared/src/qtimespan.h | 301 ---- 3 files changed, 24 insertions(+), 2616 deletions(-) delete mode 100644 libraries/shared/src/qtimespan.cpp delete mode 100644 libraries/shared/src/qtimespan.h diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0cf5b4b7d5..0a4408cbf0 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -42,7 +42,7 @@ Agent::Agent(const QByteArray& packet) : { // be the parent of the script engine so it gets moved when we do _scriptEngine.setParent(this); - + DependencyManager::get()->setPacketSender(&_entityEditSender); DependencyManager::set(); @@ -53,16 +53,16 @@ void Agent::readPendingDatagrams() { QByteArray receivedPacket; HifiSockAddr senderSockAddr; auto nodeList = DependencyManager::get(); - + while (readAvailableDatagram(receivedPacket, senderSockAddr)) { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType::Value datagramPacketType = packetTypeForPacket(receivedPacket); - + if (datagramPacketType == PacketType::Jurisdiction) { int headerBytes = numBytesForPacketHeader(receivedPacket); - + SharedNodePointer matchedNode = nodeList->sendingNodeForPacket(receivedPacket); - + if (matchedNode) { // PacketType_JURISDICTION, first byte is the node type... switch (receivedPacket[headerBytes]) { @@ -72,7 +72,7 @@ void Agent::readPendingDatagrams() { break; } } - + } else if (datagramPacketType == PacketType::OctreeStats || datagramPacketType == PacketType::EntityData || datagramPacketType == PacketType::EntityErase @@ -89,7 +89,7 @@ void Agent::readPendingDatagrams() { int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(mutablePacket, sourceNode); if (messageLength > statsMessageLength) { mutablePacket = mutablePacket.mid(statsMessageLength); - + // TODO: this needs to be fixed, the goal is to test the packet version for the piggyback, but // this is testing the version and hash of the original packet // need to use numBytesArithmeticCodingFromBuffer()... @@ -106,7 +106,7 @@ void Agent::readPendingDatagrams() { if (datagramPacketType == PacketType::EntityData || datagramPacketType == PacketType::EntityErase) { _entityViewer.processDatagram(mutablePacket, sourceNode); } - + } else if (datagramPacketType == PacketType::MixedAudio || datagramPacketType == PacketType::SilentAudioFrame) { _receivedAudioStream.parseData(receivedPacket); @@ -114,7 +114,7 @@ void Agent::readPendingDatagrams() { _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); _receivedAudioStream.clearBuffer(); - + // let this continue through to the NodeList so it updates last heard timestamp // for the sending audio mixer DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); @@ -124,7 +124,7 @@ void Agent::readPendingDatagrams() { || datagramPacketType == PacketType::KillAvatar) { // let the avatar hash map process it DependencyManager::get()->processAvatarMixerDatagram(receivedPacket, nodeList->sendingNodeForPacket(receivedPacket)); - + // let this continue through to the NodeList so it updates last heard timestamp // for the sending avatar-mixer DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); @@ -139,14 +139,14 @@ const QString AGENT_LOGGING_NAME = "agent"; void Agent::run() { ThreadedAssignment::commonInit(AGENT_LOGGING_NAME, NodeType::Agent); - + auto nodeList = DependencyManager::get(); nodeList->addSetOfNodeTypesToNodeInterestSet(NodeSet() << NodeType::AudioMixer << NodeType::AvatarMixer << NodeType::EntityServer ); - + // figure out the URL for the script for this agent assignment QUrl scriptURL; if (_payload.isEmpty()) { @@ -157,29 +157,29 @@ void Agent::run() { } else { scriptURL = QUrl(_payload); } - + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest = QNetworkRequest(scriptURL); networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.get(networkRequest); - + QNetworkDiskCache* cache = new QNetworkDiskCache(); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "agentCache"); networkAccessManager.setCache(cache); - + qDebug() << "Downloading script at" << scriptURL.toString(); - + QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - + loop.exec(); - + QString scriptContents(reply->readAll()); delete reply; - + qDebug() << "Downloaded script:" << scriptContents; - + // setup an Avatar for the script to use ScriptableAvatar scriptedAvatar(&_scriptEngine); scriptedAvatar.setForceFaceTrackerConnected(true); @@ -187,16 +187,16 @@ void Agent::run() { // call model URL setters with empty URLs so our avatar, if user, will have the default models scriptedAvatar.setFaceModelURL(QUrl()); scriptedAvatar.setSkeletonModelURL(QUrl()); - + // give this AvatarData object to the script engine _scriptEngine.setAvatarData(&scriptedAvatar, "Avatar"); _scriptEngine.setAvatarHashMap(DependencyManager::get().data(), "AvatarList"); - + // register ourselves to the script engine _scriptEngine.registerGlobalObject("Agent", this); _scriptEngine.init(); // must be done before we set up the viewers - + _scriptEngine.registerGlobalObject("SoundCache", DependencyManager::get().data()); auto entityScriptingInterface = DependencyManager::get(); @@ -213,7 +213,7 @@ void Agent::run() { void Agent::aboutToFinish() { _scriptEngine.stop(); - + // our entity tree is going to go away so tell that to the EntityScriptingInterface DependencyManager::get()->setEntityTree(NULL); } diff --git a/libraries/shared/src/qtimespan.cpp b/libraries/shared/src/qtimespan.cpp deleted file mode 100644 index 72a227948e..0000000000 --- a/libraries/shared/src/qtimespan.cpp +++ /dev/null @@ -1,2291 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qplatformdefs.h" -//#include "private/qdatetime_p.h" -#include -#include -#include -#include "qdatastream.h" -#include "qlocale.h" -#include "qtimespan.h" -#include "qdebug.h" -#include "qcoreapplication.h" -#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) -#include -#endif -#ifndef Q_WS_WIN -#include -#endif - -#include -#if defined(Q_OS_WINCE) -#include "qfunctions_wince.h" -#endif - -#if defined(Q_WS_MAC) -#include -#endif - -#if defined(Q_OS_SYMBIAN) -#include -#endif - -#include "SharedLogging.h" - - -/*! - \class QTimeSpan - \brief The QTimeSpan represents a span of time - \since 4.8 - - QTimeSpan represents a span of time, which is optionally in reference to a specific - point in time. A QTimeSpan behaves slightly different if it has a reference date or time - or not. - - \section1 Constructing a QTimeSpan - A QTimeSpan can be created by initializing it directly with a length and optionally with - a reference (start) date, or by substracting two QDate or QDateTime values. By substracting - QDate or QDateTime values, you create a QTimeSpan with the QDate or QDateTime on the right - hand side of the - operator as the reference date. - - \code - //Creates a QTimeSpan representing the time from October 10, 1975 to now - QDate birthDay(1975, 10, 10); - QTimeSpan age = QDate::currentDate() - birthDay; - \endcode - - QTimeSpan defines a series of constants that can be used for initializing a QTimeSpan. - Second, Minute, Hour, Day and Week are all QTimeSpan instances with the corresponding - length and no reference date. You can use those to create new instances. See the - section on Date arithmatic below. - - \code - //Creates a QTimeSpan representing 2 days, 4 hours and 31 minutes. - QTimeSpan span(2 * QTimeSpan::Day + 4 * QTimeSpan::Hour + 31 * QTimeSpan::Minute); - \endcode - - Finally, a QTimeSpan can be constructed by using one of the static constructors - fromString or fromTimeUnit. - - \section1 Date arithmatic - A negative QTimeSpan means that the reference date lies before the referenced date. Call - normalize() to ensure that the reference date is smaller or equal than the referenced date. - - Basic arithmatic can be done with QTimeSpan. QTimeSpans can be added up or substracted, or - be multiplied by a scalar factor. For this, the usual operators are implemented. The union - of QTimeSpans will yield the minimal QTimeSpan that covers both the original QTimeSpans, - while the intersection will yield the overlap between them (or an empty one if there is no - overlap). Please refer to the method documentation for details on what happens to a - reference date when using these methods. - - QTimeSpans can also be added to or substracted from a QDate, QTime or QDateTime. This will yield - a new QDate, QTime or QDateTime moved by the value of the QTimeSpan. Note that the QTimeSpan must - be the right-hand argument of the operator. You can not add a QDate to a QTimeSpan, but you - can do the reverse. - - \code - QTimeSpan span(QTimeSpan::Hour * 5 + 45 * QTimeSpan::Minute); - QDateTime t1 = QDateTime::currentDateTime(); - QDateTime t2 = t1 + span; // t2 is now the date time 5 hours and 45 minutes in the future. - \endcode - - \section1 Accessing the length of a QTimeSpan - There are two sets of methods that return the length of a QTimeSpan. The to* methods such - as toSeconds and toMinutes return the total time in the requested unit. That may be a - fractional number. - - \code - QTimeSpan span = QTimeSpan::Hour * 6; - qreal days = span.toDays(); //yields 0.25 - \endcode - - On the other hand, you may be interested in a number of units at the same time. If you want - to know the number of days, hours and minutes in a QTimeSpan, you can use the to*Part - methods such as toDayPart and toHourPart. These functions take a QTimeSpan::TimeSpanFormat - argument to indicate the units you want to use for the presentation of the QTimeSpan. - This is used to calculate the number of the requested time units. You can also use the - parts method directly, passing pointers to ints for the units you are interested in and 0 - for the other units. - - \section1 Using months and years - QTimeSpan can be used to describe any length of time, ranging from milliseconds to decades and - beyond (up to the maximum value of a qint64 milliseconds; enough for any application not - dealing with geological or astronomical time scales.) It is natural to use units like months - and years when dealing with longer time periods, such as the age of people. The problem with - these units is that unlike the time units for a week or shorter, the length of a month or a - year is not fixed. It it dependent on the reference date. The time period '1 month' has a - different meaning when we are speaking of februari or januari. - - QTimeSpan can only use the month and year time units if a valid reference date has been - set. Without a valid reference date, month and year as time units are meaningless and their - use will result in an assert. The largest unit of time that can be expressed without a reference - date is a week. The time period of one month is understood to mean the period - from a day and time one month to the same date and time in the next. If the next month does - not have that date and time, one month will be taken to mean the period to the end of that - month. - - \example The time from januari 2, 12 PM to februari 2, 12 PM will be understood as exactly one month. - \example The time from januari 30, 2 PM to march 1, 00:00:00.000 will also be one month, because - februari does not have 30 days but 28 or 29 depending on the year. - \example The time from januari 30, 2 PM to march 30, 2 PM will be 2 months. - - The same goes for years. - - QTimeSpan stores the length of time intervals as a 64 bits integer representing milliseconds. - That means that arithmatic with time periods set as months or years may not always yield what you - expect. A time period set as the year describing the whole of 2007 that you multiply by two or - add to itself, will not end up having a length of two years, but of 1 year, 11 months and 30 - days, as 2008 is one day longer than 2007. When months and years are used, they are - converted to the exact time span they describe in reference to the reference date set for - the QTimeSpan. With another reference date, or when negated, that time span may or may not - describe the same number of years and months. -*/ - -QT_BEGIN_NAMESPACE - -const QTimeSpan QTimeSpan::Second = QTimeSpan(qint64(1000)); -const QTimeSpan QTimeSpan::Minute = QTimeSpan(qint64(1000 * 60)); -const QTimeSpan QTimeSpan::Hour = QTimeSpan(qint64(1000 * 60 * 60)); -const QTimeSpan QTimeSpan::Day = QTimeSpan(qint64(1000 * 60 * 60 * 24)); -const QTimeSpan QTimeSpan::Week = QTimeSpan(qint64(1000 * 60 * 60 * 24 * 7)); - -class QTimeSpanPrivate : public QSharedData { -public: - qint64 interval; - QDateTime reference; - static const int s_daysPerMonth[12]; - - void addUnit(QTimeSpan* self, Qt::TimeSpanUnit unit, qreal value) - { - if (unit >= Qt::Months) { - QTimeSpan tempSpan(self->referencedDate()); - tempSpan.setFromTimeUnit(unit, value); - interval += tempSpan.toMSecs(); - } else { - switch (unit) { - case Qt::Weeks: - interval += value * 1000LL * 60LL * 60LL * 24LL * 7LL; - break; - case Qt::Days: - interval += value * 1000LL * 60LL * 60LL * 24LL; - break; - case Qt::Hours: - interval += value * 1000LL * 60LL * 60LL ; - break; - case Qt::Minutes: - interval += value * 1000LL * 60LL; - break; - case Qt::Seconds: - interval += value * 1000LL; - break; - case Qt::Milliseconds: - interval += value; - break; - default: - break; - } - } - } - - class TimePartHash: public QHash - { - public: - TimePartHash(Qt::TimeSpanFormat format) - { - for (int i(Qt::Milliseconds); i <= Qt::Years; i *= 2) { - Qt::TimeSpanUnit u = static_cast(i); - if (format.testFlag(u)) { - int* newValue = new int; - *newValue = 0; - insert(u, newValue); //perhaps we can optimize this not to new each int individually? - - } else { - insert(u, 0); - } - } - } - - ~TimePartHash() - { - qDeleteAll(*this); - } - - inline bool fill(const QTimeSpan& span) - { - bool result = span.parts(value(Qt::Milliseconds), - value(Qt::Seconds), - value(Qt::Minutes), - value(Qt::Hours), - value(Qt::Days), - value(Qt::Weeks), - value(Qt::Months), - value(Qt::Years)); - return result; - } - - inline void addUnit(const Qt::TimeSpanUnit unit) - { - if (value(unit) != 0) - return; - - int* newValue = new int; - *newValue = 0; - insert(unit, newValue); - } - - }; - - //returns a string representation of time in a single time unit - QString unitString(Qt::TimeSpanUnit unit, int num) const - { - switch (unit) { - case::Qt::Milliseconds: - return qApp->translate("QTimeSpanPrivate", "%n millisecond(s)", 0, num); - case::Qt::Seconds: - return qApp->translate("QTimeSpanPrivate", "%n second(s)", 0, num); - case::Qt::Minutes: - return qApp->translate("QTimeSpanPrivate", "%n minute(s)", 0, num); - case::Qt::Hours: - return qApp->translate("QTimeSpanPrivate", "%n hour(s)", 0, num); - case::Qt::Days: - return qApp->translate("QTimeSpanPrivate", "%n day(s)", 0, num); - case::Qt::Weeks: - return qApp->translate("QTimeSpanPrivate", "%n week(s)", 0, num); - case::Qt::Months: - return qApp->translate("QTimeSpanPrivate", "%n month(s)", 0, num); - case::Qt::Years: - return qApp->translate("QTimeSpanPrivate", "%n year(s)", 0, num); - default: - return QString(); - } - } - -#ifndef QT_NO_DATESTRING - struct TimeFormatToken - { - Qt::TimeSpanUnit type; //Qt::NoUnit is used for string literal types - int length; //number of characters to use - QString string; //only used for string literals - }; - - QList parseFormatString(const QString& formatString, Qt::TimeSpanFormat &format) const - { - QHash tokenHash; - tokenHash.insert(QChar('y'), Qt::Years); - tokenHash.insert(QChar('M'), Qt::Months); - tokenHash.insert(QChar('w'), Qt::Weeks); - tokenHash.insert(QChar('d'), Qt::Days); - tokenHash.insert(QChar('h'), Qt::Hours); - tokenHash.insert(QChar('m'), Qt::Minutes); - tokenHash.insert(QChar('s'), Qt::Seconds); - tokenHash.insert(QChar('z'), Qt::Milliseconds); - - - QList tokenList; - format = Qt::NoUnit; - int pos(0); - int length(formatString.length()); - bool inLiteral(false); - while (pos < length) { - const QChar currentChar(formatString[pos]); - if (inLiteral) { - if (currentChar == QLatin1Char('\'')) { - inLiteral = false; //exit literal string mode - if ((pos+1)interval = 0; -} - -/*! - \brief Constructor - - Constructs QTimeSpan of size msecs milliseconds. The reference date will - be invalid. -*/ -QTimeSpan::QTimeSpan(qint64 msecs) - : d(new QTimeSpanPrivate) -{ - d->interval = msecs; -} - -/*! - \brief Copy Constructor -*/ -QTimeSpan::QTimeSpan(const QTimeSpan& other): - d(other.d) -{ -} - -/*! - \brief Constructor - - Constructs QTimeSpan of size msecs milliseconds from the given reference date - and time. -*/ -QTimeSpan::QTimeSpan(const QDateTime &reference, qint64 msecs) - : d(new QTimeSpanPrivate) -{ - d->interval = msecs; - d->reference = reference; -} - -/*! - \brief Constructor - - Constructs QTimeSpan of size msecs milliseconds from the given reference date. - The reference time will be 0:00:00.000 -*/ -QTimeSpan::QTimeSpan(const QDate &reference, quint64 msecs) - : d(new QTimeSpanPrivate) -{ - d->interval = msecs; - d->reference = QDateTime(reference); -} - -/*! - \brief Constructor - - Constructs QTimeSpan of size msecs milliseconds from the given reference time. - The reference date will be today's date. -*/ -QTimeSpan::QTimeSpan(const QTime &reference, quint64 msecs) - : d(new QTimeSpanPrivate) -{ - d->interval = msecs; - QDateTime todayReference(QDate::currentDate()); - todayReference.setTime(reference); - d->reference = todayReference; -} - -/*! - \brief Constructor - - Constructs a QTimeSpan of the same length as other from the given reference date time. -*/ -QTimeSpan::QTimeSpan(const QDateTime& reference, const QTimeSpan& other) - : d(new QTimeSpanPrivate) -{ - d->reference = reference; - d->interval = other.d->interval; -} - -/*! - \brief Constructor - - Constructs a QTimeSpan of the same length as other from the given reference date. - The reference time will be 00:00:00.000 -*/ -QTimeSpan::QTimeSpan(const QDate& reference, const QTimeSpan& other) - : d(new QTimeSpanPrivate) -{ - d->reference = QDateTime(reference); - d->interval = other.d->interval; -} - -/*! - \brief Constructor - - Constructs a QTimeSpan of the same length as other from the given reference time. - The reference date will be today's date. -*/ -QTimeSpan::QTimeSpan(const QTime& reference, const QTimeSpan& other) - : d(new QTimeSpanPrivate) -{ - QDateTime todayReference(QDate::currentDate()); - todayReference.setTime(reference); - d->reference = todayReference; - d->interval = other.d->interval; -} - - -/*! - \brief Destructor -*/ -QTimeSpan::~QTimeSpan() -{ -} - -/*! - \returns true if the time span is 0; that is, if no time is spanned by - this instance. There may or may not be a valid reference date. - - \sa isNull hasValidReference -*/ -bool QTimeSpan::isEmpty() const -{ - return d->interval == 0; -} - -/*! - \returns true if the time span is 0; that is, if no time is spanned by - this instance and there is no valid reference date. - - \sa isEmpty -*/ -bool QTimeSpan::isNull() const -{ - return isEmpty() && (!hasValidReference()); -} - -/*! - \brief Assignment operator -*/ -QTimeSpan& QTimeSpan::operator=(const QTimeSpan& other) { - if (&other == this) - return *this; - - d = other.d; - return *this; -} - -/*! - \returns a new QTimeSpan instance initialized to the indicated number of - time units. The default reference date is invalid. - - \note that you can only construct a valid QTimeSpan using the Months or Years - time units if you supply a valid reference date. - - \sa setFromTimeUnit -*/ -QTimeSpan QTimeSpan::fromTimeUnit(Qt::TimeSpanUnit unit, qreal interval, const QDateTime& reference ) -{ - switch (unit){ //note: fall through is intentional! - case Qt::Weeks: - interval *= 7.0; - case Qt::Days: - interval *= 24.0; - case Qt::Hours: - interval *= 60.0; - case Qt::Minutes: - interval *= 60.0; - case Qt::Seconds: - interval *= 1000.0; - case Qt::Milliseconds: - break; - default: - if (reference.isValid()) { - QTimeSpan result(reference); - result.setFromTimeUnit(unit, interval); - return result; - } - Q_ASSERT_X(false, "static constructor", "Can not construct QTimeSpan from Month or Year TimeSpanUnit without a valid reference date."); - return QTimeSpan(); - } - - return QTimeSpan(reference, qint64(interval)); -} - -/*! - \returns the number of the requested units indicated by unit when formatted - as format. - - \sa parts() -*/ -int QTimeSpan::part(Qt::TimeSpanUnit unit, Qt::TimeSpanFormat format) const -{ - if (!format.testFlag(unit)) - return 0; - - if (!hasValidReference()) { - if (unit == Qt::Months || unit == Qt::Years) { - Q_ASSERT_X(false, "part", "Can not calculate Month or Year part without a reference date"); - } - if (format.testFlag(Qt::Months) || format.testFlag(Qt::Years)) { - qWarning() << "Unsetting Qt::Months and Qt::Years flags from format. Not supported without a reference date"; - //should this assert instead? - format&= (Qt::AllUnits ^ (Qt::Months | Qt::Years)); - } - } - - //build up hash with pointers to ints for the units that are set in format, and 0's for those that are not. - QTimeSpanPrivate::TimePartHash partsHash(format); - bool result = partsHash.fill(*this); - - if (!result) { - //what to do? Assert perhaps? - qWarning() << "Result is invalid!"; - return 0; - } - - int val = *(partsHash.value(unit)); - return val; -} - -#define CHECK_INT_LIMIT(interval, unitFactor) if (interval >= (qint64(unitFactor) * qint64(std::numeric_limits::max()) ) ) {qWarning() << "out of range" << unitFactor; return false;} - -/*! - Retreives a breakup of the length of the QTimeSpan in different time units. - - While part() allows you to retreive the value of a single unit for a specific - representation of time, this method allows you to retreive all these values - with a single call. The units that you want to use in the representation of the - time span is defined implicitly by the pointers you pass. Passing a valid pointer - for a time unit will include that unit in the representation, while passing 0 - for that pointer will exclude it. - - The passed integer pointers will be set to the correct value so that together - they represent the whole time span. This function will then return true. - If it is impossible to represent the whole time span in the requested units, - this function returns false. - - The fractionalSmallestUnit qreal pointer can optionally be passed in to - retreive the value for the smallest time unit passed in as a fractional number. - For instance, if your time span contains 4 minutes and 30 seconds, but the - smallest time unit you pass in an integer pointer for is the minute unit, then - the minute integer will be set to 4 and the fractionalSmallestUnit will be set - to 4.5. - - A negative QTimeSpan will result in all the parts of the representation to be - negative, while a positive QTimeSpan will result in an all positive - representation. - - \note Months and years are only valid as units for time spans that have a valid - reference date. Requesting the number of months or years for time spans without - a valid reference date will return false. - - If this function returns false, the value of the passed in pointers is undefined. - - \sa part() -*/ -bool QTimeSpan::parts(int *msecondsPtr, - int *secondsPtr, - int *minutesPtr, - int *hoursPtr, - int *daysPtr, - int *weeksPtr, - int *monthsPtr, - int *yearsPtr, - qreal *fractionalSmallestUnit) const -{ - /* \todo We should probably cache the results of this operation. However, that requires keeping a dirty flag - in the private data store, or a copy of the reference date, interval and last used parts. Is that worth it? - */ - - // Has the user asked for a fractional component? If yes, find which unit it corresponds to. - Qt::TimeSpanUnit smallestUnit = Qt::NoUnit; - if (fractionalSmallestUnit) - { - if (yearsPtr) - smallestUnit = Qt::Years; - if (monthsPtr) - smallestUnit = Qt::Months; - if (weeksPtr) - smallestUnit = Qt::Weeks; - if (daysPtr) - smallestUnit = Qt::Days; - if (hoursPtr) - smallestUnit = Qt::Hours; - if (minutesPtr) - smallestUnit = Qt::Minutes; - if (secondsPtr) - smallestUnit = Qt::Seconds; - if (msecondsPtr) - smallestUnit = Qt::Milliseconds; - } - - QTimeSpan ts(*this); - if (yearsPtr || monthsPtr) { //deal with months and years - //we can not deal with months or years if there is no valid reference date - if (!hasValidReference()) { - qWarning() << "Can not request month or year parts of a QTimeSpan without a valid reference date."; - return false; - } - - int* _years = yearsPtr; - if (!yearsPtr) - _years = new int; - - *_years = 0; - QDate startDate = ts.startDate().date(); - QDate endDate = ts.endDate().date(); - *_years = endDate.year() - startDate.year(); - if (endDate.month() < startDate.month()) { - (*_years)--; - } else if (endDate.month() == startDate.month()) { - if (endDate.day() < startDate.day()) { - (*_years)--; - } - } - - /** \todo Handle fractional years component */ - - int* _months = monthsPtr; - if (!monthsPtr) - _months = new int; - - *_months = endDate.month() - startDate.month(); - if (*_months < 0) - (*_months) += 12; - if (endDate.day() < startDate.day()) { - (*_months)--; - } - int totalMonths = (*_months); - if (!yearsPtr) - totalMonths += (*_years) * 12; - - QDate newStartDate(startDate); - newStartDate = newStartDate.addYears(*_years); - newStartDate = newStartDate.addMonths(*_months); - //qCDebug(shared) << "working with new start date" << newStartDate << "and end date" << endDate; - ts = QDateTime(endDate, ts.endDate().time()) - QDateTime(newStartDate, ts.startDate().time()); - *_months = totalMonths; - - /** \todo Handle fractional months component */ - - //clean up temporary variables on the heap - if (!monthsPtr) - delete _months; - if (!yearsPtr) - delete _years; - } - - //from here on, we use ts as the time span! - qint64 intervalLeft = ts.toMSecs(); - qint64 unitFactor; - //qCDebug(shared) << "intervalLeft" << intervalLeft; - if (weeksPtr) { - unitFactor = (7 * 24 * 60 * 60 * 1000); - CHECK_INT_LIMIT(intervalLeft, unitFactor) - - *weeksPtr = intervalLeft / unitFactor; - if (smallestUnit == Qt::Weeks) - { - QTimeSpan leftOverTime(referencedDate(), -intervalLeft); - leftOverTime.normalize(); - *fractionalSmallestUnit = leftOverTime.toTimeUnit(smallestUnit); - } - - if (*weeksPtr != 0) { - intervalLeft = intervalLeft % unitFactor; - } - } - - if (daysPtr) { - unitFactor = (24 * 60 * 60 * 1000); - CHECK_INT_LIMIT(intervalLeft, unitFactor) - - *daysPtr = intervalLeft / unitFactor; - if (smallestUnit == Qt::Days) - { - QTimeSpan leftOverTime(referencedDate(), -intervalLeft); - leftOverTime.normalize(); - *fractionalSmallestUnit = leftOverTime.toTimeUnit(smallestUnit); - } - - if (*daysPtr != 0 ) { - intervalLeft = intervalLeft % unitFactor; - } - } - - if (hoursPtr) { - unitFactor = (60 * 60 * 1000); - CHECK_INT_LIMIT(intervalLeft, unitFactor) - - *hoursPtr = intervalLeft / unitFactor; - if (smallestUnit == Qt::Hours) - { - QTimeSpan leftOverTime(referencedDate(), -intervalLeft); - leftOverTime.normalize(); - *fractionalSmallestUnit = leftOverTime.toTimeUnit(smallestUnit); - } - - if (*hoursPtr != 0 ) { - intervalLeft = intervalLeft % unitFactor; - } - } - - if (minutesPtr) { - unitFactor = (60 * 1000); - CHECK_INT_LIMIT(intervalLeft, unitFactor) - - *minutesPtr = intervalLeft / unitFactor; - if (smallestUnit == Qt::Minutes) - { - QTimeSpan leftOverTime(referencedDate(), -intervalLeft); - leftOverTime.normalize(); - *fractionalSmallestUnit = leftOverTime.toTimeUnit(smallestUnit); - } - - if (*minutesPtr != 0 ) { - intervalLeft = intervalLeft % unitFactor; - } - } - - if (secondsPtr) { - unitFactor = (1000); - CHECK_INT_LIMIT(intervalLeft, unitFactor) - - *secondsPtr = intervalLeft / unitFactor; - if (smallestUnit == Qt::Seconds) - { - QTimeSpan leftOverTime(referencedDate(), -intervalLeft); - leftOverTime.normalize(); - *fractionalSmallestUnit = leftOverTime.toTimeUnit(smallestUnit); - } - - if (*secondsPtr > 0 ) { - intervalLeft = intervalLeft % unitFactor; - } - } - - if (msecondsPtr) { - unitFactor = 1; - CHECK_INT_LIMIT(intervalLeft, unitFactor) - - *msecondsPtr = intervalLeft; - if (smallestUnit == Qt::Weeks) - { - *fractionalSmallestUnit = qreal(intervalLeft); - } - } - - return true; -} - -/*! - Sets a part of the time span in the given format. - - setPart allows you to adapt the current time span interval unit-by-unit based on - any time format. Where setFromTimeUnit resets the complete time interval, setPart - only sets a specific part in a chosen format. - - \example If you have a time span representing 3 weeks, 2 days, 4 hours, 31 minutes - and 12 seconds, you can change the number of hours to 2 by just calling - span.setPart(Qt::Hours, 2, Qt::Weeks | Qt::Days | Qt::Hours | Qt::Minutes | Qt::Seconds); - - Note that just like with any other function, you can not use the Months and Years - units without using a reference date. -*/ -void QTimeSpan::setPart(Qt::TimeSpanUnit unit, int interval, Qt::TimeSpanFormat format) -{ - if (!format.testFlag(unit)) { - qWarning() << "Can not set a unit that is not part of the format. Ignoring."; - return; - } - - QTimeSpanPrivate::TimePartHash partsHash(format); - bool result = partsHash.fill(*this); - - if (!result) { - qWarning() << "Retreiving parts failed, cannot set parts. Ignoring."; - return; - } - - d->addUnit(this, unit, interval - *(partsHash.value(unit) ) ); -} - -/*! - Returns Qt::TimeSpanUnit representing the order of magnitude of the time span. - That is, the largest unit that can be used to display the time span that - will result in a non-zero value. - - If the QTimeSpan does not have a valid reference date, the largest - possible time unit that will be returned is Qt::Weeks. Otherwise, - the largest possible time unit is Qt::Years. - - \returns Unit representing the order of magnitude of the time span. -*/ -Qt::TimeSpanUnit QTimeSpan::magnitude() -{ - //abs(qint64) doesnt't compile properly with mingw32? - qint64 mag = d->interval; - if (mag < 0) - mag = -mag; - - if (mag < 1000) - return Qt::Milliseconds; - if (mag < (1000LL * 60LL)) - return Qt::Seconds; - if (mag < (1000LL * 60LL * 60LL)) - return Qt::Minutes; - if (mag < (1000LL * 60LL * 60LL * 24LL)) - return Qt::Hours; - if (mag < (1000LL * 60LL * 60LL * 24LL * 7LL)) - return Qt::Days; - - //those the simple cases. The rest is dependent on if there is a reference date - if (hasValidReference()) { - //simple test. If bigger than 366 (not 365!) then we are certain of dealing with years - if (mag > (1000LL * 60LL * 60LL * 24LL * 366LL)) - return Qt::Years; - //we need a more complicated test - int years = 0; - int months = 0; - parts(0, 0, 0, 0, 0, 0, &months, &years); - if (years > 0) - return Qt::Years; - if (months > 0) - return Qt::Months; - } - - return Qt::Weeks; -} - -/*! - \returns true if there is a valid reference date set, false otherwise. -*/ -bool QTimeSpan::hasValidReference() const -{ - return d->reference.isValid(); -} - -/*! - \returns the reference date. Note that the reference date may be invalid. -*/ -QDateTime QTimeSpan::referenceDate() const -{ - return d->reference; -} - -/*! - Sets the reference date. - - If there currently is a reference date, the referenced date will - not be affected. That means that the length of the time span will - change. If there currently is no reference date set, the interval - will not be affected and this function will have the same - effect as moveReferenceDate. - - /sa moveReferenceDate setReferencedDate moveReferencedDate -*/ -void QTimeSpan::setReferenceDate(const QDateTime &referenceDate) -{ - if (d->reference.isValid() && referenceDate.isValid()) { - *this = referencedDate() - referenceDate; - } else { - d->reference = referenceDate; - } -} - -/*! - Moves the time span to align the time spans reference date with the - new reference date. - - Note that the length of the time span will not be modified, so the - referenced date will shift as well. If no reference date was set - before, it is set now and the referenced date will become valid. - - /sa setReferenceDate setReferencedDate moveReferencedDate -*/ -void QTimeSpan::moveReferenceDate(const QDateTime &referenceDate) -{ - d->reference = referenceDate; -} - -/*! - Sets the referenced date. - - If there currently is a reference date, that reference date will - not be affected. This implies that the length of the time span changes. - If there currently is no reference date set, the interval - will not be affected and this function will have the same - effect as moveReferencedDate. - - /sa setReferenceDate moveReferenceDate moveReferencedDate - -*/ -void QTimeSpan::setReferencedDate(const QDateTime &referencedDate) -{ - if (d->reference.isValid()) { - *this = referencedDate - d->reference; - } else { - d->reference = referencedDate.addMSecs(-(d->interval)); - } -} - -/*! - Moves the time span to align the time spans referenced date with the - new referenced date. - - Note that the length of the time span will not be modified, so the - reference date will shift as well. If no reference date was set - before, it is set now. - - /sa setReferenceDate setReferencedDate moveReferencedDate -*/ -void QTimeSpan::moveReferencedDate(const QDateTime &referencedDate) -{ - d->reference = referencedDate.addMSecs(-(d->interval)); -} - -/*! - Returns the referenced date and time. - - The referenced QDateTime is the "other end" of the QTimeSpan from - the reference date. - - An invalid QDateTime will be returned if no valid reference date - has been set. -*/ -QDateTime QTimeSpan::referencedDate() const -{ - if (!(d->reference.isValid())) - return QDateTime(); - - QDateTime dt(d->reference); - dt = dt.addMSecs(d->interval); - return dt; -} - -// Comparison operators -/*! - Returns true if the two compared QTimeSpans have both the same - reference date and the same length. - - Note that two QTimeSpan objects that span the same period, but - where one is positive and the other is negative are not considdered - equal. If you need to compare those, compare the normalized - versions. - - \sa matchesLength -*/ -bool QTimeSpan::operator==(const QTimeSpan &other) const -{ - return ((d->interval == other.d->interval) && - (d->reference == other.d->reference)); -} - -/*! - Returns true if the interval of this QTimeSpan is shorter than - the interval of the other QTimeSpan. -*/ -bool QTimeSpan::operator<(const QTimeSpan &other) const -{ - return d->interval < other.d->interval; -} - -/*! - Returns true if the interval of this QTimeSpan is shorter or equal - than the interval of the other QTimeSpan. -*/ -bool QTimeSpan::operator<=(const QTimeSpan &other) const -{ - return d->interval <= other.d->interval; -} - -/*! - Returns true if the interval of this QTimeSpan is equal - to the interval of the other QTimeSpan. That is, if they have the - same length. - - The default value of normalize is false. If normalize is true, the - absolute values of the interval lengths are compared instead of the - real values. - - \code - QTimeSpan s1 = 2 * QTimeSpan::Day; - QTimeSpan s2 = -2 * QTimeSpan::Day; - qCDebug(shared) << s1.matchesLength(s2); //returns false - qCDebug(shared) << s1.matchesLength(s2, true); //returns true - \endcode -*/ -bool QTimeSpan::matchesLength(const QTimeSpan &other, bool normalize) const -{ - if (!normalize) { - return d->interval == other.d->interval; - } else { - return qAbs(d->interval) == qAbs(other.d->interval); - } -} - -// Arithmatic operators -/*! - Adds the interval of the other QTimeSpan to the interval of - this QTimeSpan. The reference date of the other QTimeSpan is - ignored. -*/ -QTimeSpan & QTimeSpan::operator+=(const QTimeSpan &other) -{ - d->interval += other.d->interval; - return *this; -} - -/*! - Adds the number of milliseconds to the interval of - this QTimeSpan. The reference date of the QTimeSpan is - not affected. -*/ -QTimeSpan & QTimeSpan::operator+=(qint64 msecs) -{ - d->interval += msecs; - return *this; -} - -/*! - Substracts the interval of the other QTimeSpan from the interval of - this QTimeSpan. The reference date of the other QTimeSpan is - ignored while the reference date of this QTimeSpan is not affected. -*/ -QTimeSpan & QTimeSpan::operator-=(const QTimeSpan &other) -{ - d->interval -= (other.d->interval); - return *this; -} - -/*! - Substracts the number of milliseconds from the interval of - this QTimeSpan. The reference date of the QTimeSpan is - not affected. -*/ -QTimeSpan & QTimeSpan::operator-=(qint64 msecs) -{ - d->interval -= msecs; - return *this; -} - -/*! - Multiplies the interval described by this QTimeSpan by the - given factor. The reference date of the QTimeSpan is not - affected. -*/ -QTimeSpan & QTimeSpan::operator*=(qreal factor) -{ - d->interval *= factor; - return *this; -} - -/*! - Multiplies the interval described by this QTimeSpan by the - given factor. The reference date of the QTimeSpan is not - affected. -*/ -QTimeSpan & QTimeSpan::operator*=(int factor) -{ - d->interval *= factor; - return *this; -} - -/*! - Divides the interval described by this QTimeSpan by the - given factor. The reference date of the QTimeSpan is not - affected. -*/ -QTimeSpan & QTimeSpan::operator/=(qreal factor) -{ - d->interval /= factor; - return *this; -} - -/*! - Divides the interval described by this QTimeSpan by the - given factor. The reference date of the QTimeSpan is not - affected. -*/ -QTimeSpan & QTimeSpan::operator/=(int factor) -{ - d->interval /= factor; - return *this; -} - -/*! - \brief Modifies this QTimeSpan to be the union of two QTimeSpans. - - The union of two QTimeSpans is defined as the minimum QTimeSpan that - encloses both QTimeSpans. The QTimeSpans need not be overlapping. - - \warning Only works if both QTimeSpans have a valid reference date. - \sa operator&=(const QTimeSpan& other) - \sa operator|(const QTimeSpan& other) - \sa united(const QTimeSpan& other) -*/ -QTimeSpan& QTimeSpan::operator|=(const QTimeSpan& other) // Union -{ - Q_ASSERT_X((hasValidReference() && other.hasValidReference()), "assignment-or operator", "Both participating time spans need a valid reference date"); - - //do we need to check for self-assignment? - - QDateTime start = qMin(startDate(), other.startDate()); - QDateTime end = qMax(endDate(), other.endDate()); - - *this = end - start; - return *this; -} - -/*! - \brief Modifies this QTimeSpan to be the intersection of two QTimeSpans. - - The intersection of two QTimeSpans is defined as the maximum QTimeSpan that - both QTimeSpans have in common. If the QTimeSpans don't overlap, a null QTimeSpan - will be returned. The returned QTimeSpan will be positive. - - \warning Only works if both QTimeSpans have a valid reference date. - \sa operator&=(const QTimeSpan& other) - \sa operator&(const QTimeSpan& other) - \sa overlapped(const QTimeSpan& other) -*/ -QTimeSpan& QTimeSpan::operator&=(const QTimeSpan &other) // Intersection -{ - Q_ASSERT_X((hasValidReference() && other.hasValidReference()), "assignment-or operator", "Both participating time spans need a valid reference date"); - - //do we need to check for self-assignment? - - const QTimeSpan* first = this; - const QTimeSpan* last = &other; - if (other.startDate() < startDate()) { - first = &other; - last = this; - } - - //check if there is overlap at all. If not, reset the interval to 0 - if (!(first->endDate() > last->startDate()) ) { - d->interval = 0; - return *this; - } - - *this = qMin(first->endDate(), last->endDate()) - last->startDate(); - return *this; -} - -/*! - Returns true if this QTimeSpan overlaps with the other QTimeSpan. - If one of the QTimeSpans does not have a valid reference date, this - function returns false. -*/ -bool QTimeSpan::overlaps(const QTimeSpan &other) const -{ - if (!hasValidReference() || !other.hasValidReference()) - return false; - - const QTimeSpan* first = this; - const QTimeSpan* last = &other; - if (other.startDate() < startDate()) { - first = &other; - last = this; - } - - return (first->endDate() > last->startDate()); -} - -/*! - \brief Returns a new QTimeSpan that represents the intersection of the two QTimeSpans. - - The intersection of two QTimeSpans is defined as the maximum QTimeSpan that - both QTimeSpans have in common. If the QTimeSpans don't overlap, a null QTimeSpan - will be returned. Any valid returned QTimeSpan will be positive. - - \warning Only works if both QTimeSpans have a valid reference date. Will assert otherwise. - \sa operator&=(const QTimeSpan& other) - \sa operator&(const QTimeSpan& other) - -*/ -QTimeSpan QTimeSpan::overlapped(const QTimeSpan &other) const -{ - Q_ASSERT_X((hasValidReference() && other.hasValidReference()), "assignment-or operator", "Both participating time spans need a valid reference date"); - - const QTimeSpan* first = this; - const QTimeSpan* last = &other; - if (other.startDate() < startDate()) { - first = &other; - last = this; - } - - //check if there is overlap at all. If not, reset the interval to 0 - if (!(first->endDate() >= last->startDate()) ) { - return QTimeSpan(); - } - - return qMin(first->endDate(), last->endDate()) - last->startDate(); -} - -/*! - \brief Returns a new QTimeSpan that represents the union of two QTimeSpans. - - The union of two QTimeSpans is defined as the minimum QTimeSpan that - encloses both QTimeSpans. The QTimeSpans need not be overlapping. - - \warning Only works if both QTimeSpans have a valid reference date. Will assert otherwise. - \sa operator|=(const QTimeSpan& other) - \sa operator|(const QTimeSpan& other) -*/ -QTimeSpan QTimeSpan::united(const QTimeSpan &other) const -{ - Q_ASSERT_X((hasValidReference() && other.hasValidReference()), "assignment-or operator", "Both participating time spans need a valid reference date"); - - QDateTime start = qMin(startDate(), other.startDate()); - QDateTime end = qMax(endDate(), other.endDate()); - - return ( end - start ); -} - -/*! - Determines if the given dateTime lies within the time span. The begin - and end times are taken to be contained in the time span in this function. - - If the time span does not have a valid reference date, this function - returns false. -*/ -bool QTimeSpan::contains(const QDateTime &dateTime) const -{ - if (!hasValidReference()) - return false; - - return ((startDate() <= dateTime) && - (endDate()) >= dateTime); -} - -/*! - Determines if the given date lies within the time span. The begin - and end times are taken to be contained in the time span in this function. - Just like in the QTimeSpan constructors that take a QDate, the time will assumed - to be 00:00:00.000. - - If the time span does not have a valid reference date, this function - returns false. -*/ -bool QTimeSpan::contains(const QDate &date) const -{ - QDateTime dt(date); - return contains(dt); -} - -/*! - Determines if the given time lies within the time span. The begin - and end times are taken to be contained in the time span in this function. - Just like in the QTimeSpan constructors that take a QTime, the date - will be set to today. - - If the time span does not have a valid reference date, this function - returns false. -*/ -bool QTimeSpan::contains(const QTime &time) const -{ - QDateTime dt(QDate::currentDate()); - dt.setTime(time); - return contains(dt); -} - -/*! - Determines if the other QTimeSpan lies within this time span. Another - time span is contained if its start time is the same or later then the - start time of this time span, and its end time is the same or earlier - than the end time of this time span. - - If either time span does not have a valid reference date, this function - returns false. -*/ -bool QTimeSpan::contains(const QTimeSpan &other) const -{ - if (!(hasValidReference() && other.hasValidReference())) - return false; - - return ((startDate() <= other.startDate()) && - (endDate()) >= other.endDate()); -} - -/*! - Returns a new QTimeSpan representing the same time span as this QTimeSpan, but - that is guaranteed to be positive; that is, to have the reference date before or - equal to the referenced date. - - \sa normalize abs - */ -QTimeSpan QTimeSpan::normalized() const -{ - QTimeSpan ts(*this); - ts.normalize(); - return ts; -} - -/*! - Modifies this QTimeSpan to represent the same time span, but - that is guaranteed to be positive; that is, to have the reference date before or - equal to the referenced date. If there is no valid reference date, the interval - will just be made positive. - - \sa normalized abs - */ -void QTimeSpan::normalize() -{ - if (d->interval < 0) { - if (hasValidReference()) { - d->reference = referencedDate(); - } - d->interval = qAbs(d->interval); - } -} - -/*! - Returns a copy of this QTimeSpan that is guaranteed to be positive; that is, - to have the reference date before or equal to the referenced date. The reference - date is not modified. That implies that if there is a reference date, and the - QTimeSpan is negative, the returned QTimeSpan will describe the time span \i after - the reference date instead of the time span \i before. - - If there is no valid reference date, the interval will just be made positive. - - \sa normalize normalized - */ -QTimeSpan QTimeSpan::abs() const -{ - QTimeSpan result(*this); - result.d->interval = qAbs(result.d->interval); - - return result; -} - -/*! - Returns true if the interval is negative. - \sa isNormal - */ -bool QTimeSpan::isNegative() const -{ - return d->interval < 0; -} - -/*! - \fn QTimeSpan::isNormal() const - - Returns true if the interval is normal, that is: not negative. - \sa isNegative - */ - -/*! - Returns the first date of the spanned time period. If there is no valid - reference date, an invalid QDateTime will be returned. - */ -QDateTime QTimeSpan::startDate() const -{ - if (isNegative()) - return referencedDate(); - - return referenceDate(); -} - -/*! - Returns the last date of the spanned time period. If there is no valid - reference date, an invalid QDateTime will be returned. - */ -QDateTime QTimeSpan::endDate() const -{ - if (isNegative()) - return referenceDate(); - - return referencedDate(); -} - -/*! - Returns the duration of the QTimeSpan expressed in milliseconds. This - value may be negative. -*/ -qint64 QTimeSpan::toMSecs() const -{ - return d->interval; -} - -/*! - Returns the duration of the QTimeSpan expressed in the given TimeSpanUnit. This - value may be negative. -*/ -qreal QTimeSpan::toTimeUnit(Qt::TimeSpanUnit unit) const -{ - qreal interval = qreal(d->interval); - switch (unit){ //fall through is intentional - case Qt::Weeks: - interval /= 7.0; - case Qt::Days: - interval /= 24.0; - case Qt::Hours: - interval /= 60.0; - case Qt::Minutes: - interval /= 60.0; - case Qt::Seconds: - interval /= 1000.0; - case Qt::Milliseconds: - break; - default: - Q_ASSERT_X(hasValidReference(), "toTimeUnit", "Can not convert to time units that depend on the reference date (month and year)."); - qreal result(0.0); - int intResult(0); - bool succes(false); - if (unit == Qt::Months) { - succes = parts(0, 0, 0, 0, 0, 0, &intResult, 0, &result); - } else if (unit == Qt::Years) { - succes = parts(0, 0, 0, 0, 0, 0, 0, &intResult, &result); - } - - if (!succes) - return 0.0; - - return result; - } - - return interval; -} - -/*! - Sets the length of this QTimeSpan from the given number of milliseconds. The reference date is not - affected. - */ -void QTimeSpan::setFromMSecs(qint64 msecs) -{ - d->interval = msecs; -} - -/*! - Sets the length of this QTimeSpan from the given number of TimeSpanUnits. The reference date is not - affected. - */ -void QTimeSpan::setFromTimeUnit(Qt::TimeSpanUnit unit, qreal interval) -{ - switch (unit){ - case Qt::Weeks: //fall through of cases is intentional! - interval *= 7.0; - case Qt::Days: - interval *= 24.0; - case Qt::Hours: - interval *= 60.0; - case Qt::Minutes: - interval *= 60.0; - case Qt::Seconds: - interval *= 1000.0; - case Qt::Milliseconds: - break; - case Qt::Months: - setFromMonths(interval); - return; - case Qt::Years: - setFromYears(interval); - return; - default: - Q_ASSERT_X(false, "setFromTimeUnit", "Can not set a QTimeSpan duration from unknown TimeSpanUnit."); - } - - d->interval = qint64(interval); -} - -/*! - Sets the interval of the time span as a number of months. - - \warning This function can only be used if a valid reference date has been set! - - The setFromMonths method deals with fractional months in the following way: first, - the whole number of months is extracted and added to the reference date. The fractional - part of the number of months is then multiplied with the number of days in the month - in which that date falls. If the number of months is negative and adding a whole month - yields a date exactly on a month boundary, the number of days in the month before is - used instead. - That number is used as the number of days and is added to the interval. - - \code - QTimeSpan ts(QDate(2010,01,01)); - ts.setFromMonths(1.5); // ts's referenced date is now februari 14, 0:00:00 - ts.setFromMonths(2.5); // ts's referenced date is now march 15, 0:00:00 - QTimeSpan ts2(QDate(2008,01,01)); //2008 is a leap year! - ts2.setFromMonths(1.5); // ts2's referenced date is now februari 14, 12:00:00 - QTimeSpan ts3(QDate(2008,03,01)); //2008 is a leap year - ts3.setFromMonths(-0.5); // ts3's referenced date is now februari 14: 12:00:00 // - \endcode - */ -void QTimeSpan::setFromMonths(qreal months) -{ - Q_ASSERT_X(hasValidReference(), "setFromMonths", "Can not set interval from time unit month if there is no reference date."); - - int fullMonths = (int)months; - qreal fractionalMonth = months - fullMonths; - - QDateTime endDate = d->reference; - endDate = endDate.addMonths(fullMonths); - - int days = d->s_daysPerMonth[endDate.date().month()-1]; - QDateTime measureDate(endDate); - if (fractionalMonth < 0) { - measureDate = measureDate.addMSecs(-1); - } - if (QDate::isLeapYear(measureDate.date().year()) && measureDate.date().month() == 2) { - ++days; //februari has an extra day this year... - } - - QTimeSpan tmp = endDate - d->reference; - qreal fractionalDays = fractionalMonth * days; - d->interval = tmp.toMSecs() + qint64(fractionalDays * 24.0 * 60.0 * 60.0 * 1000.0); -} - -/*! - Sets the interval of the time span as a number of years. - - \warning This function can only be used if a valid reference date has been set! - - The setFromYears method deals with fractional years in the following way: first, - the whole number of years is extracted and added to the reference date. The fractional - part of the number of years is then multiplied with the number of days in the year - in which that date falls. That number is used as the number of days and is added to the - interval. - If the number of years is negative and adding the whole years yields a date exactly on - a year boundary, the number of days in the year before is used instead. - */ -void QTimeSpan::setFromYears(qreal years) -{ - Q_ASSERT_X(hasValidReference(), "setFromYears", "Can not set interval from time unit year if there is no reference date."); - - int fullYears = (int)years; - qreal fractionalYear = years - fullYears; - - QDateTime endDate = d->reference; - endDate = endDate.addYears(fullYears); - - qreal days = 365.0; - QDateTime measureDate(endDate); - if (fractionalYear < 0) { - measureDate = measureDate.addMSecs(-1); - } - if (QDate::isLeapYear(measureDate.date().year())) { - days += 1.0; //februari has an extra day this year... - } - - QTimeSpan tmp = endDate - d->reference; - qreal fractionalDays = fractionalYear * days; - d->interval = tmp.toMSecs() + qint64(fractionalDays * 24.0 * 60.0 * 60.0 * 1000.0); -} - -#ifndef QT_NO_DATASTREAM -/*! - Streaming operator. - - This operator allows you to stream a QTimeSpan into a QDataStream. - /sa operator>>(QDataStream &stream, QTimeSpan &span) - */ -QDataStream & operator<<(QDataStream &stream, const QTimeSpan & span) -{ - stream << span.d->reference << span.d->interval; - return stream; -} - -/*! - Streaming operator. - - This operator allows you to stream a QTimeSpan out of a QDataStream. - /sa operator>>(QDataStream &stream, QTimeSpan &span) - */ -QDataStream & operator>>(QDataStream &stream, QTimeSpan &span) -{ - stream >> span.d->reference >> span.d->interval; - return stream; -} -#endif - -/*! - Adds another QTimeSpan to this QTimeSpan. - - The values of the intervals of the QTimeSpans are added up with normal - arithmatic. Negative values will work as expected. - - If the left argument has a reference date, that reference will be kept. - If only the right argument has a reference date, then that reference - date will be used as the new reference date. - - The above can have suprising consequences: - \code - // s1 and s2 are two QTimeSpan objects - QTimeSpan s12 = s1 + s2; - QTimeSpan s21 = s2 + s1; - - if (s12 == s21) { - //may or may not happen, depending on the reference dates of s1 and s2. - } - \endcode -*/ -QTimeSpan operator+(const QTimeSpan &left, const QTimeSpan &right) -{ - QTimeSpan result(left); - result += right; - - // only keep the right reference date if the left argument does not have one - if (!left.hasValidReference() && right.hasValidReference()) { - result.setReferenceDate(right.referenceDate()); - } - - return result; -} - -/*! - Substracts another QTimeSpan from this QTimeSpan. - - The value of the interval of the right QTimeSpan is substracted from the - left QTimeSpan with normal arithmatic. Negative values will work as expected. - - If the left argument has a reference date, that reference will be kept. - If only the right argument has a reference date, then that reference - date will be used as the new reference date. - - \sa operator+ -*/ -QTimeSpan operator-(const QTimeSpan &left, const QTimeSpan &right) -{ - QTimeSpan result(left); - result -= right; - - // only keep the right reference date if the left argument does not have one - if (!left.hasValidReference() && right.hasValidReference()) { - result.setReferenceDate(right.referenceDate()); - } - - return result; - -} - -/*! - Multiply a QTimeSpan by a scalar factor. - - \returns a new QTimeSpan object that has the same reference date as the - left QTimeSpan, but with an interval length that is multiplied by the - right argument. -*/ -QTimeSpan operator*(const QTimeSpan &left, qreal right) -{ - QTimeSpan result(left); - result*=right; - return result; -} - -/*! - Multiply a QTimeSpan by a scalar factor. - - \returns a new QTimeSpan object that has the same reference date as the - left QTimeSpan, but with an interval length that is multiplied by the - right argument. -*/ -QTimeSpan operator*(const QTimeSpan &left, int right) -{ - QTimeSpan result(left); - result*=right; - return result; -} - -/*! - Devide a QTimeSpan by a scalar factor. - - \returns a new QTimeSpan object that has the same reference date as the - left QTimeSpan, but with an interval length that is devided by the - right argument. -*/ -QTimeSpan operator/(const QTimeSpan &left, qreal right) -{ - QTimeSpan result(left); - result/=right; - return result; -} - -/*! - Devide a QTimeSpan by a scalar factor. - - \returns a new QTimeSpan object that has the same reference date as the - left QTimeSpan, but with an interval length that is devided by the - right argument. -*/ -QTimeSpan operator/(const QTimeSpan &left, int right) -{ - QTimeSpan result(left); - result/=right; - return result; -} - -/*! - Devides two QTimeSpans. The devision works on the interval lengths of - the two QTimeSpan objects as you would expect from normal artithmatic. -*/ -qreal operator/(const QTimeSpan &left, const QTimeSpan &right) -{ - return (qreal(left.toMSecs()) / qreal(right.toMSecs())); -} - -/*! - Returns a QTimeSpan object with the same reference date as the right - hand argument, but with a negated interval. Note that unlike with the - normalize() method, this function will result in a QTimeSpan that - describes a different period if the QTimeSpan has a reference date because - the reference date is not modified. -*/ -QTimeSpan operator-(const QTimeSpan &right) // Unary negation -{ - QTimeSpan result(right); - result.setFromMSecs(-result.toMSecs()); - return result; -} - -/*! - \returns the union of the two QTimeSpans. - - \sa united -*/ -QTimeSpan operator|(const QTimeSpan &left, const QTimeSpan &right) // Union -{ - QTimeSpan result(left); - result|=right; - return result; -} - -/*! - \returns the intersection of the two QTimeSpans. - - \sa intersected -*/ -QTimeSpan operator&(const QTimeSpan &left, const QTimeSpan &right) // Intersection -{ - QTimeSpan result(left); - result&=right; - return result; -} - -// Operators that use QTimeSpan and other date/time classes -/*! - Creates a new QTimeSpan object that describes the period between the two - QDateTime objects. The right hand object will be used as the reference date, - so that substracting a date in the past from a date representing now will yield - a positive QTimeSpan. - - \note that while substracting two dates will result in a QTimeSpan describing - the time between those dates, there is no pendant operation for adding two dates. - - Substractions involving an invalid QDateTime, will result in a time span with - an interval length 0. If the right-hand QDateTime is valid, it will still be - used as the reference date. -*/ -QTimeSpan operator-(const QDateTime &left, const QDateTime &right) -{ - QTimeSpan result(right); -#if QT_VERSION >= 0x040700 - if (left.isValid() && right.isValid()) { - result = QTimeSpan(right, right.msecsTo(left)); - } -#else - if (left.isValid() && right.isValid()) { - QDateTime tmpLeft = left.toUTC(); - QDateTime tmpRight = right.toUTC(); - //don't use QDateTime::secsTo, you end up in rounding issues as well as overflow problems! - qint64 interval = 1000LL * 60LL * 60LL * 24LL * qint64(tmpRight.date().daysTo(tmpLeft.date())); - interval += tmpRight.time().msecsTo(tmpLeft.time()); - result.setFromMSecs(interval); - } -#endif - return result; -} - -/*! - Creates a new QTimeSpan object that describes the period between the two - QDate objects. The right hand object will be used as the reference date, - so that substracting a date in the past from a date representing now will yield - a positive QTimeSpan. - - \note that while substracting two dates will result in a QTimeSpan describing - the time between those dates, there is no pendant operation for adding two dates. -*/ -QTimeSpan operator-(const QDate &left, const QDate &right) -{ - QTimeSpan result = QDateTime(left) - QDateTime(right); - return result; -} - -/*! - Creates a new QTimeSpan object that describes the period between the two - QTime objects. The right hand time will be used as the reference time, - so that substracting a time in the past from a time representing now will yield - a positive QTimeSpan. - - \note that that both times will be assumed to be on the current date. - - \note that while substracting two times will result in a QTimeSpan describing - the time between those, there is no pendant operation for adding two times. -*/ -QTimeSpan operator-(const QTime &left, const QTime &right) -{ - return QDateTime(QDate::currentDate(), left) - QDateTime(QDate::currentDate(), right); -} - -/*! - \returns the date described by the left-hand date, shifted by the interval - described in the QTimeSpan. The reference date of the QTimeSpan, if set, is - ignored. - - No rounding takes place. If a QTimeSpan describes 1 day, 23 hours and 59 minutes, - adding that QTimeSpan to a QDate respresenting April 1 will still yield April 2. -*/ -QDate operator+(const QDate &left, const QTimeSpan &right) -{ - QDateTime dt(left); - return (dt + right).date(); -} - -/*! - \returns the date and time described by the left-hand QDateTime, shifted by - the interval described in the QTimeSpan. The reference date of the QTimeSpan, if set, - is ignored. -*/ -QDateTime operator+(const QDateTime &left, const QTimeSpan &right) -{ - QDateTime result(left); - result = result.addMSecs(right.toMSecs()); - return result; -} - -/*! - \returns the time described by the left-hand QTime, shifted by - the interval described in the QTimeSpan. The reference date of the QTimeSpan, if set, - is ignored. - - \note that since QTimeSpan works with dates and times, the time returned will never - be bigger than 23:59:59.999. The time will wrap to the next date. Use QDateTime objects - if you need to keep track of that. -*/ -QTime operator+(const QTime &left, const QTimeSpan &right) -{ - QDateTime dt(QDate::currentDate(), left); - dt = dt.addMSecs(right.toMSecs()); - return dt.time(); -} - -/*! - \returns the date described by the left-hand date, shifted by the negated interval - described in the QTimeSpan. The reference date of the QTimeSpan, if set, is - ignored. - - No rounding takes place. If a QTimeSpan describes 1 day, 23 hours and 59 minutes, - adding that QTimeSpan to a QDate respresenting April 1 will still yield April 2. -*/ -QDate operator-(const QDate &left, const QTimeSpan &right) -{ - QDateTime dt(left); - return (dt - right).date(); -} - -/*! - \returns the date and time described by the left-hand QDateTime, shifted by - the negated interval described in the QTimeSpan. The reference date of the - QTimeSpan, if set, is ignored. -*/ -QDateTime operator-(const QDateTime &left, const QTimeSpan &right) -{ - QDateTime result(left); - result = result.addMSecs( -(right.toMSecs()) ); - return result; -} - -/*! - \returns the time described by the left-hand QTime, shifted by - the negated interval described in the QTimeSpan. The reference date of - the QTimeSpan, if set, is ignored. - - \note that since QTimeSpan works with dates and times, the time returned will never - be bigger than 23:59:59.999. The time will wrap to the next date. Use QDateTimes - if you need to keep track of that. -*/ -QTime operator-(const QTime &left, const QTimeSpan &right) -{ - QDateTime dt(QDate::currentDate(), left); - dt = dt.addMSecs( -(right.toMSecs()) ); - return dt.time(); -} - -#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_NO_DATESTRING) -/*! - Operator to stream QTimeSpan objects to a debug stream. -*/ -QDebug operator<<(QDebug debug, const QTimeSpan &ts) -{ - debug << "QTimeSpan(Reference Date =" << ts.referenceDate() - << "msecs =" << ts.toMSecs() << ")"; - return debug; -} -#endif - -//String conversions -#ifndef QT_NO_DATESTRING -/*! - \returns an approximate representation of the time span length - - When representing the lenght of a time span, it is often not nessecairy to be - completely accurate. For instance, when dispaying the age of a person, it is - often enough to just state the number of years, or possibly the number of years - and the number of months. Similary, when displaying how long a certain operation - the user of your application started will run, it is useless to display the - number of seconds left if the operation will run for hours more. - - toApproximateString() provides functionality to display the length of the - QTimeSpan in such an approximate way. It will format the time using one or two - neighbouring time units. The first time unit that will be used is the unit - that represents the biggest portion of time in the span. The second time unit - will be the time unit directly under that. The second unit will only be used - if it is not 0, and if the first number is smaller than the indicated - suppresSecondUnitLimit. - - The suppressSecondUnitLimit argument can be used to suppres, for instance, - the number of seconds when the operation will run for more than five minutes - more. The idea is that for an approximate representation of the time length, - it is no longer relevant to display the second unit if the first respresents - a time span that is perhaps an order of magnitude larger already. - - If you set suppressSecondUnitLimit to a negative number, the second unit will - always be displayed, unless no valid unit for it could be found. -*/ -QString QTimeSpan::toApproximateString(int suppresSecondUnitLimit, Qt::TimeSpanFormat format) -{ - if (format==Qt::NoUnit) - return QString(); - - //retreive the time unit to use as the primairy unit - int primairy = -1; - int secondairy = -1; - - Qt::TimeSpanUnit primairyUnit = magnitude(); - while (!format.testFlag(primairyUnit ) && primairyUnit > Qt::NoUnit) { - primairyUnit = Qt::TimeSpanUnit(primairyUnit / 2); - } - - Qt::TimeSpanUnit secondairyUnit = Qt::NoUnit; - if (primairyUnit > 1) { - secondairyUnit = Qt::TimeSpanUnit(primairyUnit / 2); - } else { - primairy = 0; - } - while (!format.testFlag(secondairyUnit) && secondairyUnit > Qt::NoUnit) { - secondairyUnit = Qt::TimeSpanUnit(secondairyUnit / 2); - } - - //build up hash with pointers to ints for the units that are set in format, and 0's for those that are not. - if (primairy < 0) { - QTimeSpanPrivate::TimePartHash partsHash(format); - bool result = partsHash.fill(*this); - - if (!result) { - qCDebug(shared) << "false result from parts function"; - return QString(); - } - - primairy = *(partsHash.value(primairyUnit)); - if (secondairyUnit > 0) { - secondairy = *(partsHash.value(secondairyUnit)); - } else { - secondairy = 0; - } - } - - if ((primairy > 0 - && secondairy > 0 - && primairy < suppresSecondUnitLimit) - || (suppresSecondUnitLimit < 0 - && secondairyUnit > Qt::NoUnit) ) - { - //we will display with two units - return d->unitString(primairyUnit, primairy) + QLatin1String(", ") + d->unitString(secondairyUnit, secondairy); - } - - //we will display with only the primairy unit - return d->unitString(primairyUnit, primairy); -} - -/*! - \returns a string representation of the duration of this time span in the requested format - - This function returns a representation of only the length of this time span. If - you need the reference or referenced dates, access those using one of the provided - methods and output them directly. - - The format parameter determines the format of the result string. The duration will be - expressed in the units you use in the format. - - y The number of years - M The number of months - w The number of weeks - d The number of days - h The number of hours - m The number of minutes - s The number of seconds - z The number of milliseconds - - Use multiple letters to force leading zeros. - - \note You can not use years or months if the time span does not have a valid reference - date. - - Characters in the string that don't represent a time unit, are used as literal strings in the - output. Everything between single quotes will always be used as a literal string. This makes - it possible to use the characters used for the time span format also as literal output. To use a - single quote in the output, put two consecutive single quotes within a single quote literal - string block. To just put a single quote in a the output, you need four consequtive single - quotes. -*/ -QString QTimeSpan::toString(const QString &format) const -{ - Qt::TimeSpanFormat tsFormat = Qt::NoUnit; - QList tokenList = d->parseFormatString(format, tsFormat); - - QTimeSpanPrivate::TimePartHash partsHash(tsFormat); - bool result = partsHash.fill(*this); - - if (!result) - return QString(); - - QString formattedString; - foreach(QTimeSpanPrivate::TimeFormatToken token, tokenList) { - if (token.type == 0) { - formattedString.append(token.string); - } else { - Qt::TimeSpanUnit unit(token.type); - formattedString.append (QString("%1").arg(*partsHash.value( unit ), - token.length, - 10, - QChar('0') ) ); - } - } - - return formattedString; -} - -/*! - Returns a time span represented by the string using the format given, or an empty - time span if the string cannot be parsed. - - The optional reference argument will be used as the reference date for the string. - - \note You can only use months or years if you also pass a valid reference. - */ -QTimeSpan QTimeSpan::fromString(const QString &string, const QString &format, const QDateTime &reference) -{ - /* - - There are two possible ways of parsing a string. On the one hand, you could use the - lengths of string literals to determine the positions in the string where you expect - the different parts of the string. On the other hand, you could use the actual contents - of the literals as delimiters to figure out what parts of the string refer to what - unit of time. In that case, the length of the time units would only matter if they are - not surrounded by a string literal. Both seem useful. Perhaps we need two different - modes for this? - - The code here implements the first option. The overloaded version below implements a - more flexible regexp based approach. - */ - - //stage one: parse the format string - QTimeSpan span(reference); - Qt::TimeSpanFormat tsFormat = Qt::NoUnit; - QList tokenList = span.d->parseFormatString(format, tsFormat); - - //prepare the temporaries - QTimeSpanPrivate::TimePartHash partsHash(tsFormat); - QString input(string); - - //extract the values from the input string into our temporary structure - foreach(const QTimeSpanPrivate::TimeFormatToken token, tokenList) { - if (token.type == Qt::NoUnit) { - input = input.remove(0, token.length); - } else { - QString part = input.left(token.length); - input = input.remove(0, token.length); - - bool success(false); - part = part.trimmed(); - int value = part.toInt(&success, 10); - if (!success) { - return QTimeSpan(); - } - *(partsHash.value(token.type)) = value; - } - } - - //construct the time span from the temporary data - //we must set the number of years and months first; for the rest order is not important - if (partsHash.value(Qt::Years)) { - span.d->addUnit(&span, Qt::Years, *(partsHash.value(Qt::Years))); - delete partsHash.value(Qt::Years); - partsHash.insert(Qt::Years, 0); - } - if (partsHash.value(Qt::Months)) { - span.d->addUnit(&span, Qt::Months, *(partsHash.value(Qt::Months))); - delete partsHash.value(Qt::Months); - partsHash.insert(Qt::Months, 0); - } - - //add the rest of the units - QHashIterator it(partsHash); - while (it.hasNext()) { - it.next(); - if (it.value()) { - span.d->addUnit(&span, it.key(), *(it.value())); - qCDebug(shared) << "Added unit" << it.key() << "with value" << *(it.value()) << "new value" << span.d->interval; - } - } - - return span; -} - -/*! - Returns a time span represented by the string using the patern given, or an empty - time span if the string cannot be parsed. Each pair of capturing parenthesis can - extract a time unit. The order in which the units appear is given by the list of - arguments unit1 to unit8. Captures for which the corresponding type is set to - Qt::NoUnit will be ignored. - - The reference argument will be used as the reference date for the string. - - \note You can only use months or years if you also pass a valid reference. - */ -QTimeSpan QTimeSpan::fromString(const QString &string, const QRegExp &pattern, const QDateTime &reference, - Qt::TimeSpanUnit unit1, Qt::TimeSpanUnit unit2, Qt::TimeSpanUnit unit3, - Qt::TimeSpanUnit unit4, Qt::TimeSpanUnit unit5, Qt::TimeSpanUnit unit6, - Qt::TimeSpanUnit unit7, Qt::TimeSpanUnit unit8) -{ - if (pattern.indexIn(string) < 0) - return QTimeSpan(); - - QTimeSpanPrivate::TimePartHash partsHash(Qt::NoUnit); - - QList unitList; - unitList << unit1 << unit2 << unit3 << unit4 << unit5 << unit6 << unit7 << unit8; - - for (int i(0); i < qMin(pattern.captureCount(), 8 ); ++i) { - if (unitList.at(i) > Qt::NoUnit) { - partsHash.addUnit(unitList.at(i)); - QString capture = pattern.cap(i + 1); - bool ok(false); - int value = capture.toInt(&ok, 10); - if (!ok) - return QTimeSpan(); - - *(partsHash.value(unitList.at(i))) = value; - } - } - - //create the time span to return - QTimeSpan span(reference); - - //construct the time span from the temporary data - //we must set the number of years and months first; for the rest order is not important - if (partsHash.value(Qt::Years)) { - span.d->addUnit(&span, Qt::Years, *(partsHash.value(Qt::Years))); - delete partsHash.value(Qt::Years); - partsHash.insert(Qt::Years, 0); - } - if (partsHash.value(Qt::Months)) { - span.d->addUnit(&span, Qt::Months, *(partsHash.value(Qt::Months))); - delete partsHash.value(Qt::Months); - partsHash.insert(Qt::Months, 0); - } - - //add the rest of the units - QHashIterator it(partsHash); - while (it.hasNext()) { - it.next(); - if (it.value()) { - span.d->addUnit(&span, it.key(), *(it.value())); - } - } - - return span; -} -#endif - -QT_END_NAMESPACE diff --git a/libraries/shared/src/qtimespan.h b/libraries/shared/src/qtimespan.h deleted file mode 100644 index 83f9cdbec7..0000000000 --- a/libraries/shared/src/qtimespan.h +++ /dev/null @@ -1,301 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QTIMESPAN_H -#define QTIMESPAN_H - -#include -#include -#include -#include -#include - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Core) - -//Move this to qnamespace.h when integrating -namespace Qt -{ - enum TimeSpanUnit { - Milliseconds = 0x0001, - Seconds = 0x0002, - Minutes = 0x0004, - Hours = 0x0008, - Days = 0x0010, - Weeks = 0x0020, - Months = 0x0040, - Years = 0x0080, - DaysAndTime = Days | Hours | Minutes | Seconds, - AllUnits = Milliseconds | DaysAndTime | Months | Years, - NoUnit = 0 - }; - - Q_DECLARE_FLAGS(TimeSpanFormat, TimeSpanUnit) -} -Q_DECLARE_OPERATORS_FOR_FLAGS(Qt::TimeSpanFormat) - -//end of section to move - -class QTimeSpanPrivate; - -class QTimeSpan -{ -public: - QTimeSpan(); - explicit QTimeSpan(qint64 msecs); - explicit QTimeSpan(const QDateTime& reference, qint64 msecs = 0); - explicit QTimeSpan(const QDate& reference, quint64 msecs = 0); - explicit QTimeSpan(const QTime& reference, quint64 msecs = 0); - explicit QTimeSpan(const QDateTime& reference, const QTimeSpan& other); - explicit QTimeSpan(const QDate& reference, const QTimeSpan& other); - explicit QTimeSpan(const QTime& reference, const QTimeSpan& other); - QTimeSpan(const QTimeSpan& other); - - - ~QTimeSpan(); - - // constant time units - static const QTimeSpan Second; - static const QTimeSpan Minute; - static const QTimeSpan Hour; - static const QTimeSpan Day; - static const QTimeSpan Week; - - // status/validity of the time span - bool isEmpty() const; - bool isNull() const; - - // This set of functions operates on a single component of the time span. - inline int msecsPart(Qt::TimeSpanFormat format = Qt::DaysAndTime | Qt::Milliseconds) const {return part(Qt::Milliseconds, format);} - inline int secsPart(Qt::TimeSpanFormat format = Qt::DaysAndTime) const {return part(Qt::Seconds, format);} - inline int minutesPart(Qt::TimeSpanFormat format = Qt::DaysAndTime) const {return part(Qt::Minutes, format);} - inline int hoursPart(Qt::TimeSpanFormat format = Qt::DaysAndTime) const {return part(Qt::Hours, format);} - inline int daysPart(Qt::TimeSpanFormat format = Qt::DaysAndTime) const {return part(Qt::Days, format);} - inline int weeksPart(Qt::TimeSpanFormat format = Qt::DaysAndTime) const {return part(Qt::Weeks, format);} - //int monthsPart(Qt::TimeSpanFormat format) const; - //int yearsPart(Qt::TimeSpanFormat format) const; - int part(Qt::TimeSpanUnit unit, Qt::TimeSpanFormat format = Qt::DaysAndTime) const; - - bool parts(int *msecondsPtr, - int *secondsPtr = 0, - int *minutesPtr = 0, - int *hoursPtr = 0, - int *daysPtr = 0, - int *weeksPtr = 0, - int *monthsPtr = 0, - int *yearsPtr = 0, - qreal *fractionalSmallestUnit = 0) const; - - Qt::TimeSpanUnit magnitude(); - - inline void setMSecsPart(int msecs, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Milliseconds, msecs, format);} - inline void setSecsPart(int seconds, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Seconds, seconds, format);} - inline void setMinutesPart(int minutes, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Minutes, minutes, format);} - inline void setHoursPart(int hours, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Hours, hours, format);} - inline void setDaysPart(int days, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Days, days, format);} - inline void setWeeksPart(int weeks, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Weeks, weeks, format);} - inline void setMonthsPart(int months, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Months, months, format);} - inline void setYearsPart(int years, Qt::TimeSpanFormat format = Qt::DaysAndTime) {setPart(Qt::Years, years, format);} - void setPart(Qt::TimeSpanUnit unit, int interval, Qt::TimeSpanFormat format = Qt::DaysAndTime); - - // This set of functions operator on the entire timespan and not - // just a single component of it. - qint64 toMSecs() const; - inline qreal toSecs() const {return toTimeUnit(Qt::Seconds);} - inline qreal toMinutes() const {return toTimeUnit(Qt::Minutes);} - inline qreal toHours() const {return toTimeUnit(Qt::Hours);} - inline qreal toDays() const {return toTimeUnit(Qt::Days);} - inline qreal toWeeks() const {return toTimeUnit(Qt::Weeks);} - inline qreal toMonths() const {return toTimeUnit(Qt::Seconds);} - inline qreal toYears() const {return toTimeUnit(Qt::Seconds);} - qreal toTimeUnit(Qt::TimeSpanUnit unit) const; - - void setFromMSecs(qint64 msecs); - inline void setFromSecs(qreal secs) {setFromTimeUnit(Qt::Seconds, secs);} - inline void setFromMinutes(qreal minutes) {setFromTimeUnit(Qt::Minutes, minutes);} - inline void setFromHours(qreal hours) {setFromTimeUnit(Qt::Hours, hours);} - inline void setFromDays(qreal days) {setFromTimeUnit(Qt::Days, days);} - inline void setFromWeeks(qreal weeks) {setFromTimeUnit(Qt::Weeks, weeks);} - void setFromMonths(qreal months); - void setFromYears(qreal years); - void setFromTimeUnit(Qt::TimeSpanUnit unit, qreal interval); - - // Reference date - bool hasValidReference() const; - QDateTime referenceDate() const; - void setReferenceDate(const QDateTime &referenceDate); - void moveReferenceDate(const QDateTime &referenceDate); - void setReferencedDate(const QDateTime &referencedDate); - void moveReferencedDate(const QDateTime &referencedDate); - - // Referenced date - referenceDate() + *this - QDateTime referencedDate() const; - - // Pretty printing -#ifndef QT_NO_DATESTRING - QString toString(const QString &format) const; - QString toApproximateString(int suppresSecondUnitLimit = 3, - Qt::TimeSpanFormat format = Qt::Seconds | Qt::Minutes | Qt::Hours | Qt::Days | Qt::Weeks); -#endif - - // Assignment operator - QTimeSpan &operator=(const QTimeSpan& other); - - // Comparison operators - bool operator==(const QTimeSpan &other) const; - inline bool operator!=(const QTimeSpan &other) const {return !(operator==(other));} - bool operator<(const QTimeSpan &other) const; - bool operator<=(const QTimeSpan &other) const; - inline bool operator>(const QTimeSpan &other) const {return !(operator<=(other));} - inline bool operator>=(const QTimeSpan &other) const {return !(operator<(other));} - bool matchesLength(const QTimeSpan &other, bool normalize = false) const; - - // Arithmetic operators. Operators that don't change *this are declared as non-members. - QTimeSpan &operator+=(const QTimeSpan &other); - QTimeSpan &operator+=(qint64 msecs); - QTimeSpan &operator-=(const QTimeSpan &other); - QTimeSpan &operator-=(qint64 msecs); - QTimeSpan &operator*=(qreal factor); - QTimeSpan &operator*=(int factor); - QTimeSpan &operator/=(qreal factor); - QTimeSpan &operator/=(int factor); - QTimeSpan &operator|=(const QTimeSpan &other); // Union - QTimeSpan &operator&=(const QTimeSpan &other); // Intersection - - // Ensure the reference date is before the referenced date - QTimeSpan normalized() const; - void normalize(); - QTimeSpan abs() const; - bool isNegative() const; - bool isNormal() const {return !isNegative();} - - // Naturally ordered dates - QDateTime startDate() const; - QDateTime endDate() const; - - // Containment - bool contains(const QDateTime &dateTime) const; - bool contains(const QDate &date) const; - bool contains(const QTime &time) const; - bool contains(const QTimeSpan &other) const; - - bool overlaps(const QTimeSpan &other) const; - QTimeSpan overlapped(const QTimeSpan &other) const; - QTimeSpan united(const QTimeSpan &other) const; - - // Static construction methods -#ifndef QT_NO_DATESTRING - static QTimeSpan fromString(const QString &string, const QString &format, const QDateTime& reference = QDateTime()); - static QTimeSpan fromString(const QString &string, const QRegExp &pattern, const QDateTime& reference, - Qt::TimeSpanUnit unit1, - Qt::TimeSpanUnit unit2 = Qt::NoUnit, Qt::TimeSpanUnit unit3 = Qt::NoUnit, - Qt::TimeSpanUnit unit4 = Qt::NoUnit, Qt::TimeSpanUnit unit5 = Qt::NoUnit, - Qt::TimeSpanUnit unit6 = Qt::NoUnit, Qt::TimeSpanUnit unit7 = Qt::NoUnit, - Qt::TimeSpanUnit unit8 = Qt::NoUnit); -#endif - //static QTimeSpan fromString(const QString &string, Qt::TimeSpanFormat format); - static QTimeSpan fromTimeUnit(Qt::TimeSpanUnit unit, qreal interval, const QDateTime& reference = QDateTime()); - /* - static QTimeSpan fromMSecs(qint64 msecs); - static QTimeSpan fromSecs(qreal secs) {return QTimeSpan::Second * secs;} - static QTimeSpan fromMinutes(qreal minutes) {return QTimeSpan::Minute * minutes;} - static QTimeSpan fromHours(qreal hours) {return QTimeSpan::Hour * hours;} - static QTimeSpan fromDays(qreal days) {return QTimeSpan::Day * days;} - static QTimeSpan fromWeeks(qreal weeks) {return QTimeSpan::Week * weeks;} - */ - -private: -#ifndef QT_NO_DATASTREAM - friend QDataStream &operator<<(QDataStream &, const QTimeSpan &); - friend QDataStream &operator>>(QDataStream &, QTimeSpan &); -#endif - - QSharedDataPointer d; -}; -Q_DECLARE_TYPEINFO(QTimeSpan, Q_MOVABLE_TYPE); -Q_DECLARE_METATYPE(QTimeSpan); -Q_DECLARE_METATYPE(Qt::TimeSpanUnit); - -//non-member operators -QTimeSpan operator+(const QTimeSpan &left, const QTimeSpan &right); -QTimeSpan operator-(const QTimeSpan &left, const QTimeSpan &right); -QTimeSpan operator*(const QTimeSpan &left, qreal right);//no problem -QTimeSpan operator*(const QTimeSpan &left, int right);//no problem -inline QTimeSpan operator*(qreal left, const QTimeSpan &right) {return right * left;} // works -inline QTimeSpan operator*(int left, const QTimeSpan &right) {return right * left;} // works -//QTimeSpan operator*(qreal left, const QTimeSpan &right) {return right * left;} //does not work -//QTimeSpan operator*(int left, const QTimeSpan &right) {return right * left;} //does not work -QTimeSpan operator/(const QTimeSpan &left, qreal right); -QTimeSpan operator/(const QTimeSpan &left, int right); -qreal operator/(const QTimeSpan &left, const QTimeSpan &right); -QTimeSpan operator-(const QTimeSpan &right); // Unary negation -QTimeSpan operator|(const QTimeSpan &left, const QTimeSpan &right); // Union -QTimeSpan operator&(const QTimeSpan &left, const QTimeSpan &right); // Intersection - -// Operators that use QTimeSpan and other date/time classes -QTimeSpan operator-(const QDateTime &left, const QDateTime &right); -QTimeSpan operator-(const QDate &left, const QDate &right); -QTimeSpan operator-(const QTime &left, const QTime &right); -QDate operator+(const QDate &left, const QTimeSpan &right); -QDate operator-(const QDate &left, const QTimeSpan &right); -QTime operator+(const QTime &left, const QTimeSpan &right); -QTime operator-(const QTime &left, const QTimeSpan &right); -QDateTime operator+(const QDateTime &left, const QTimeSpan &right); -QDateTime operator-(const QDateTime &left, const QTimeSpan &right); - - -#ifndef QT_NO_DATASTREAM -QDataStream &operator<<(QDataStream &, const QTimeSpan &); -QDataStream &operator>>(QDataStream &, QTimeSpan &); -#endif // QT_NO_DATASTREAM - -#if !defined(QT_NO_DEBUG_STREAM) && !defined(QT_NO_DATESTRING) -QDebug operator<<(QDebug, const QTimeSpan &); -#endif - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QTIMESPAN_H From 6f2e9f48998d0674ae19f30b83ecf730895f48ed Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 13:06:34 -0700 Subject: [PATCH 246/582] cleanup return in SentPacketHistory --- libraries/networking/src/SentPacketHistory.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/SentPacketHistory.cpp b/libraries/networking/src/SentPacketHistory.cpp index bea144e6aa..c6eec8eb63 100644 --- a/libraries/networking/src/SentPacketHistory.cpp +++ b/libraries/networking/src/SentPacketHistory.cpp @@ -48,10 +48,6 @@ const NLPacket* SentPacketHistory::getPacket(uint16_t sequenceNumber) const { if (seqDiff < 0) { seqDiff += UINT16_RANGE; } - auto packet = _sentPackets.get(seqDiff); - if (packet) { - return packet->get(); - } else { - return nullptr; - } + + return _sentPackets.get(seqDiff)->get(); } From f90f3a05be2aaf9faf554372db25bdfa6f71d9bf Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 13:11:43 -0700 Subject: [PATCH 247/582] Fail in Packet::create if size is invalid --- assignment-client/src/octree/OctreeQueryNode.h | 1 - libraries/networking/src/Packet.cpp | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index faec2d2bba..6316cc5e86 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -14,7 +14,6 @@ #include - #include #include #include diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 6d585ac4aa..876cd91962 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -29,10 +29,9 @@ std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { // default size of -1, means biggest packet possible size = maxPayload; } - if (size <= 0 || size > maxPayload) { - // Invalid size, return null pointer - return std::unique_ptr(); - } + + // Fail with invalid size + Q_ASSERT(size >= 0 || size < maxPayload); // allocate memory return std::unique_ptr(new Packet(type, size)); From 01f1a6e2b94662f807a86c21b107406fae66c35f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 13:12:21 -0700 Subject: [PATCH 248/582] Fix NLPacket::create --- libraries/networking/src/NLPacket.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 4f17d3d754..711114cc1e 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -29,11 +29,17 @@ qint64 NLPacket::localHeaderSize() const { return localHeaderSize(_type); } -std::unique_ptr NLPacket::create(PacketType::Value type, int64_t size) { - if (size > maxPayloadSize(type)) { - return std::unique_ptr(); +std::unique_ptr NLPacket::create(PacketType::Value type, qint64 size) { + auto maxPayload = maxPayloadSize(type); + if (size == -1) { + // default size of -1, means biggest packet possible + size = maxPayload; } - + + // Fail with invalid size + Q_ASSERT(size >= 0 || size < maxPayload); + + // allocate memory return std::unique_ptr(new NLPacket(type, size)); } From 7e4999b71785c62c7af6eb761ea8eee0a97c75b3 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 13:12:48 -0700 Subject: [PATCH 249/582] int64_t to qint64 for consistency --- libraries/networking/src/NLPacket.cpp | 8 ++++---- libraries/networking/src/NLPacket.h | 8 ++++---- libraries/networking/src/Packet.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 711114cc1e..1b1ac50eda 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -11,13 +11,13 @@ #include "NLPacket.h" -int64_t NLPacket::localHeaderSize(PacketType::Value type) { - int64_t size = ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID) + +qint64 NLPacket::localHeaderSize(PacketType::Value type) { + qint64 size = ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID) + ((NON_VERIFIED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID); return size; } -int64_t NLPacket::maxPayloadSize(PacketType::Value type) { +qint64 NLPacket::maxPayloadSize(PacketType::Value type) { return Packet::maxPayloadSize(type) - localHeaderSize(type); } @@ -47,7 +47,7 @@ std::unique_ptr NLPacket::createCopy(const NLPacket& other) { return std::unique_ptr(new NLPacket(other)); } -NLPacket::NLPacket(PacketType::Value type, int64_t size) : Packet(type, localHeaderSize(type) + size) { +NLPacket::NLPacket(PacketType::Value type, qint64 size) : Packet(type, localHeaderSize(type) + size) { } NLPacket::NLPacket(const NLPacket& other) : Packet(other) { diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 9368b25720..e70df1dad7 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -17,18 +17,18 @@ class NLPacket : public Packet { Q_OBJECT public: - static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + static std::unique_ptr create(PacketType::Value type, qint64 size = -1); // Provided for convenience, try to limit use static std::unique_ptr createCopy(const NLPacket& other); - static int64_t localHeaderSize(PacketType::Value type); - static int64_t maxPayloadSize(PacketType::Value type); + static qint64 localHeaderSize(PacketType::Value type); + static qint64 maxPayloadSize(PacketType::Value type); virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers virtual qint64 localHeaderSize() const; // Current level's header size protected: - NLPacket(PacketType::Value type, int64_t size); + NLPacket(PacketType::Value type, qint64 size); NLPacket(const NLPacket& other); void setSourceUuid(QUuid sourceUuid); diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 1de17602da..e9483ca1f1 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -23,7 +23,7 @@ class Packet : public QIODevice { public: using SequenceNumber = uint16_t; - static std::unique_ptr create(PacketType::Value type, int64_t size = -1); + static std::unique_ptr create(PacketType::Value type, qint64 size = -1); // Provided for convenience, try to limit use static std::unique_ptr createCopy(const Packet& other); From 7ee08130f02bccdbd3de04391803751d638aeb07 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 13:18:11 -0700 Subject: [PATCH 250/582] fix for avatar packet size in ScriptEngine --- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index e265fd3c8d..73aede85f7 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -588,7 +588,7 @@ void ScriptEngine::run() { const int SCRIPT_AUDIO_BUFFER_BYTES = SCRIPT_AUDIO_BUFFER_SAMPLES * sizeof(int16_t); QByteArray avatarByteArray = _avatarData->toByteArray(); - auto avatarPacket = NLPacket::create(PacketType::AvatarData); + auto avatarPacket = NLPacket::create(PacketType::AvatarData, avatarByteArray.size()); avatarPacket->write(avatarByteArray); From 16e7b2625bac3b2d5e1a13db12b174535c19d6f8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 13:20:10 -0700 Subject: [PATCH 251/582] don't sink the audioPacket in ScriptEngine --- libraries/script-engine/src/ScriptEngine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 73aede85f7..d24b7af714 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -588,7 +588,7 @@ void ScriptEngine::run() { const int SCRIPT_AUDIO_BUFFER_BYTES = SCRIPT_AUDIO_BUFFER_SAMPLES * sizeof(int16_t); QByteArray avatarByteArray = _avatarData->toByteArray(); - auto avatarPacket = NLPacket::create(PacketType::AvatarData, avatarByteArray.size()); + auto avatarPacket = NLPacket::create(PacketType::AvatarData); avatarPacket->write(avatarByteArray); @@ -675,7 +675,7 @@ void ScriptEngine::run() { audioPacket->writePrimitive(sequence); // send audio packet - nodeList->sendPacket(std::move(audioPacket), node); + nodeList->sendUnreliablePacket(audioPacket, node); } }); } From c0b8f83ca0f35a3a5d222c0940a682301290212d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 13:22:09 -0700 Subject: [PATCH 252/582] Better ring index compute --- libraries/shared/src/RingBufferHistory.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/RingBufferHistory.h b/libraries/shared/src/RingBufferHistory.h index 4ab87329df..f5b1d97999 100644 --- a/libraries/shared/src/RingBufferHistory.h +++ b/libraries/shared/src/RingBufferHistory.h @@ -45,7 +45,7 @@ public: void insert(const T& entry) { // increment newest entry index cyclically - _newestEntryAtIndex = (_newestEntryAtIndex == _size - 1) ? 0 : _newestEntryAtIndex + 1; + _newestEntryAtIndex = (_newestEntryAtIndex + 1) % _size; // insert new entry _buffer[_newestEntryAtIndex] = entry; @@ -57,7 +57,7 @@ public: // std::unique_ptr need to be passed as an rvalue ref and moved into the vector void insert(T&& entry) { // increment newest entry index cyclically - _newestEntryAtIndex = (_newestEntryAtIndex == _size - 1) ? 0 : _newestEntryAtIndex + 1; + _newestEntryAtIndex = (_newestEntryAtIndex + 1) % _size; // insert new entry _buffer[_newestEntryAtIndex] = std::move(entry); From 893e1864fda708d7e11fd3bcbddd82fdb55f3653 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 13:22:41 -0700 Subject: [PATCH 253/582] cleanup _newestEntryAtIndex calc in RBH insert --- libraries/shared/src/RingBufferHistory.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/shared/src/RingBufferHistory.h b/libraries/shared/src/RingBufferHistory.h index 4ab87329df..6408373079 100644 --- a/libraries/shared/src/RingBufferHistory.h +++ b/libraries/shared/src/RingBufferHistory.h @@ -21,7 +21,7 @@ template class RingBufferHistory { public: - + RingBufferHistory(int capacity = 10) : _size(capacity + 1), _capacity(capacity), @@ -45,7 +45,7 @@ public: void insert(const T& entry) { // increment newest entry index cyclically - _newestEntryAtIndex = (_newestEntryAtIndex == _size - 1) ? 0 : _newestEntryAtIndex + 1; + _newestEntryAtIndex = (_newestEntryAtIndex + 1) % size; // insert new entry _buffer[_newestEntryAtIndex] = entry; @@ -53,12 +53,12 @@ public: _numEntries++; } } - + // std::unique_ptr need to be passed as an rvalue ref and moved into the vector void insert(T&& entry) { // increment newest entry index cyclically _newestEntryAtIndex = (_newestEntryAtIndex == _size - 1) ? 0 : _newestEntryAtIndex + 1; - + // insert new entry _buffer[_newestEntryAtIndex] = std::move(entry); if (_numEntries < _capacity) { From caed7da99b0f6ec34fc58ffff1b7be1a275549e1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Jul 2015 13:23:20 -0700 Subject: [PATCH 254/582] create the avatarPacket in ScriptEngine with the right size --- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index d24b7af714..1a9088ca4b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -588,7 +588,7 @@ void ScriptEngine::run() { const int SCRIPT_AUDIO_BUFFER_BYTES = SCRIPT_AUDIO_BUFFER_SAMPLES * sizeof(int16_t); QByteArray avatarByteArray = _avatarData->toByteArray(); - auto avatarPacket = NLPacket::create(PacketType::AvatarData); + auto avatarPacket = NLPacket::create(PacketType::AvatarData, avatarByteArray.size()); avatarPacket->write(avatarByteArray); From 57d4e649262cdadc7818f545660246caa5016df9 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 13:24:07 -0700 Subject: [PATCH 255/582] Missing deref --- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index d24b7af714..382f78a6ec 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -675,7 +675,7 @@ void ScriptEngine::run() { audioPacket->writePrimitive(sequence); // send audio packet - nodeList->sendUnreliablePacket(audioPacket, node); + nodeList->sendUnreliablePacket(*audioPacket, node); } }); } From c77310019db567fd453449c874f36e3e73e326bd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 14:03:32 -0700 Subject: [PATCH 256/582] Some .get() cleanup --- assignment-client/src/audio/AudioMixer.cpp | 2 -- assignment-client/src/entities/EntityServer.cpp | 2 +- libraries/octree/src/OctreeEditPacketSender.cpp | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index bb58bb0f78..e81f4c66f8 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -463,8 +463,6 @@ int AudioMixer::prepareMixForListeningNode(Node* node) { } void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { - static char clientEnvBuffer[MAX_PACKET_SIZE]; - // Send stream properties bool hasReverb = false; float reverbTime, wetLevel; diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index b928adde53..08907380fb 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -96,7 +96,7 @@ int EntityServer::sendSpecialPackets(const SharedNodePointer& node, OctreeQueryN auto specialPacket = tree->encodeEntitiesDeletedSince(queryNode->getSequenceNumber(), deletedEntitiesSentAt, hasMoreToSend); - queryNode->packetSent(*specialPacket.get()); + queryNode->packetSent(*specialPacket); totalBytes += specialPacket->getSizeWithHeader(); packetsSent++; diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 4151f19821..41b8b7bca6 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -108,7 +108,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu } // add packet to history - _sentPacketHistories[nodeUUID].packetSent(sequence, *packet.get()); + _sentPacketHistories[nodeUUID].packetSent(sequence, *packet); queuePacketForSending(node, std::move(packet)); } @@ -186,7 +186,7 @@ void OctreeEditPacketSender::queuePacketToNodes(std::unique_ptr packet if (isMyJurisdiction) { // make a copy of this packet for this node and queue - auto packetCopy = NLPacket::createCopy(*packet.get()); + auto packetCopy = NLPacket::createCopy(*packet); queuePacketToNode(nodeUUID, std::move(packetCopy)); } } From a2a60f253c090b6cbc3547d9c05e4ee2199da333 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 14:19:47 -0700 Subject: [PATCH 257/582] Fail with packet size in constructor --- libraries/networking/src/NLPacket.cpp | 10 ---------- libraries/networking/src/Packet.cpp | 18 +++++++----------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 1b1ac50eda..c3b09439ba 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -30,16 +30,6 @@ qint64 NLPacket::localHeaderSize() const { } std::unique_ptr NLPacket::create(PacketType::Value type, qint64 size) { - auto maxPayload = maxPayloadSize(type); - if (size == -1) { - // default size of -1, means biggest packet possible - size = maxPayload; - } - - // Fail with invalid size - Q_ASSERT(size >= 0 || size < maxPayload); - - // allocate memory return std::unique_ptr(new NLPacket(type, size)); } diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 876cd91962..a5ab9d1716 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -24,16 +24,6 @@ qint64 Packet::maxPayloadSize(PacketType::Value type) { } std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { - auto maxPayload = maxPayloadSize(type); - if (size == -1) { - // default size of -1, means biggest packet possible - size = maxPayload; - } - - // Fail with invalid size - Q_ASSERT(size >= 0 || size < maxPayload); - - // allocate memory return std::unique_ptr(new Packet(type, size)); } @@ -55,8 +45,14 @@ Packet::Packet(PacketType::Value type, qint64 size) : _packet(new char(_packetSize)), _payloadStart(_packet.get() + localHeaderSize(_type)), _capacity(size) { + auto maxPayload = maxPayloadSize(type); + if (size == -1) { + // default size of -1, means biggest packet possible + size = maxPayload; + } + // Sanity check - Q_ASSERT(size <= maxPayloadSize(type)); + Q_ASSERT(size >= 0 || size < maxPayload); // copy packet type and version in header writePacketTypeAndVersion(type); From aaafa7acd28e870102f425640996ba91dd285092 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 9 Jul 2015 14:20:04 -0700 Subject: [PATCH 258/582] Copy _type in assignment operators --- libraries/networking/src/Packet.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index a5ab9d1716..ca1c66f4ca 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -68,6 +68,8 @@ Packet::Packet(const Packet& other) { } Packet& Packet::operator=(const Packet& other) { + _type = other._type; + _packetSize = other._packetSize; _packet = std::unique_ptr(new char(_packetSize)); memcpy(_packet.get(), other._packet.get(), _packetSize); @@ -85,6 +87,8 @@ Packet::Packet(Packet&& other) { } Packet& Packet::operator=(Packet&& other) { + _type = other._type; + _packetSize = other._packetSize; _packet = std::move(other._packet); From 5e65f422fa1a81e885fb4c8cf504a5c952173fe1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 15:30:25 -0700 Subject: [PATCH 259/582] Move mute environment handling to Application --- interface/src/Application.cpp | 11 +++++ libraries/audio-client/src/AudioClient.cpp | 48 +--------------------- libraries/audio-client/src/AudioClient.h | 7 +++- 3 files changed, 19 insertions(+), 47 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b7c926a7e8..20878205a9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -419,6 +419,17 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::receivedFirstPacket); connect(audioIO.data(), &AudioClient::disconnected, &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::disconnected); + connect(audioIO.data(), &AudioClient::muteEnvironmentRequested, [](glm::vec3 position, float radius) { + auto audioClient = DependencyManager::get(); + float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), + position); + bool shouldMute = !audioClient->isMuted() && (distance < radius); + + if (shouldMute) { + audioClient->toggleMute(); + AudioScriptingInterface::getInstance().environmentMuted(); + } + }); audioThread->start(); diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 983fa4c20e..2571f42786 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -602,19 +602,13 @@ void AudioClient::handleMuteEnvironmentPacket(std::unique_ptr packet, int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::MuteEnvironment); memcpy(&position, packet->getPayload(), sizeof(glm::vec3)); memcpy(&radius, packet->getPayload() + sizeof(glm::vec3), sizeof(float)); - float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), - position); - bool shouldMute = !_muted && (distance < radius); - if (shouldMute) { - toggleMute(); - // TODO reimplement on interface side - //AudioScriptingInterface::getInstance().environmentMuted(); - } + emit muteEnvironmentRequested(position, radius); } void AudioClient::updateLastHeardFromAudioMixer(std::unique_ptr& packet) { // update having heard from the audio-mixer and record the bytes received + auto nodeList = DependencyManager::get(); SharedNodePointer audioMixer = nodeList->nodeWithUUID(packet->getSourceID()); if (audioMixer) { audioMixer->setLastHeardMicrostamp(usecTimestampNow()); @@ -1023,44 +1017,6 @@ void AudioClient::sendMuteEnvironmentPacket() { } } -void AudioClient::addReceivedAudioToStream(const QByteArray& audioByteArray) { - DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveFirstAudioPacket); - - if (_audioOutput) { - - if (!_hasReceivedFirstPacket) { - _hasReceivedFirstPacket = true; - - // have the audio scripting interface emit a signal to say we just connected to mixer - emit receivedFirstPacket(); - } - - // Audio output must exist and be correctly set up if we're going to process received audio - _receivedAudioStream.parseData(audioByteArray); - } -} - -void AudioClient::parseAudioEnvironmentData(const QByteArray &packet) { - int numBytesPacketHeader = numBytesForPacketHeader(packet); - const char* dataAt = packet.constData() + numBytesPacketHeader; - - char bitset; - memcpy(&bitset, dataAt, sizeof(char)); - dataAt += sizeof(char); - - bool hasReverb = oneAtBit(bitset, HAS_REVERB_BIT);; - if (hasReverb) { - float reverbTime, wetLevel; - memcpy(&reverbTime, dataAt, sizeof(float)); - dataAt += sizeof(float); - memcpy(&wetLevel, dataAt, sizeof(float)); - dataAt += sizeof(float); - _receivedAudioStream.setReverb(reverbTime, wetLevel); - } else { - _receivedAudioStream.clearReverb(); - } -} - void AudioClient::toggleMute() { _muted = !_muted; emit muteToggled(); diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 37e21e7277..cc04d60367 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -13,6 +13,7 @@ #define hifi_AudioClient_h #include +#include #include #include @@ -32,8 +33,10 @@ #include #include #include -#include +#include +#include +#include #include #include #include @@ -197,6 +200,8 @@ signals: void audioFinished(); + void muteEnvironmentRequested(glm::vec3 position, float radius); + protected: AudioClient(); ~AudioClient(); From 8da50d342ccc2f0845a97aaf9336326fa229fcac Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 15:31:01 -0700 Subject: [PATCH 260/582] Remove DatagramProcessor.h from Application --- interface/src/Application.h | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index 8ae00cdd38..9653556da0 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -43,7 +43,6 @@ #include "AudioClient.h" #include "Bookmarks.h" #include "Camera.h" -#include "DatagramProcessor.h" #include "Environment.h" #include "FileLogger.h" #include "GLCanvas.h" From 6f9907a22d81d1e0d59406ce50fce81a1da7c5f2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 15:31:30 -0700 Subject: [PATCH 261/582] Stub in process() for OctreePacketProcessor --- interface/src/octree/OctreePacketProcessor.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index a0f2ed3e7b..7e5d6e40e4 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -21,6 +21,8 @@ class OctreePacketProcessor : public GenericThread { public: OctreePacketProcessor(); + virtual bool process() override { }; + signals: void packetVersionMismatch(); From 5737b3b7707730af0d1db507a8e2c3e52f5696a0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 15:32:19 -0700 Subject: [PATCH 262/582] Fix call to size() in AvatarHashMap --- libraries/avatars/src/AvatarHashMap.cpp | 4 ++-- libraries/avatars/src/AvatarHashMap.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index fb20f91431..eebd9aabdd 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -53,7 +53,7 @@ AvatarSharedPointer AvatarHashMap::addAvatar(const QUuid& sessionUUID, const QWe } void AvatarHashMap::processAvatarDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { - const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size); + const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size()); int bytesRead = 0; SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); @@ -125,7 +125,7 @@ void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr packet } void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { - const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size); + const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size()); QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(data, NUM_BYTES_RFC4122_UUID)); SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index dbfd2dc88e..365241bc2c 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -19,6 +19,7 @@ #include #include +#include #include #include "AvatarData.h" From 672c5cc5b332b857e159c15d4129a4fff955a161 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 15:33:00 -0700 Subject: [PATCH 263/582] Properly create QByteArray in EntityEditPacketSender --- libraries/entities/src/EntityEditPacketSender.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index a00fea4948..48f5403063 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -24,7 +24,7 @@ EntityEditPacketSender::EntityEditPacketSender() { void EntityEditPacketSender::processEntityEditNackPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { - processNackPacket(QByteArray::fromRawData(packet->getData())); + processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } } From b7fe91ccc69869f883555b7e5d848143d7ad8535 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 15:34:02 -0700 Subject: [PATCH 264/582] Fix errors PacketReceiver --- libraries/networking/src/PacketReceiver.cpp | 44 +++++++++------------ libraries/networking/src/PacketReceiver.h | 11 +++++- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index b94242f85e..a83b3b91a5 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -10,19 +10,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include - -#include -#include - -#include "Application.h" -#include "avatar/AvatarManager.h" -#include "AudioClient.h" -#include "Menu.h" -#include "InterfaceLogging.h" - #include "PacketReceiver.h" +#include "DependencyManager.h" +#include "NLPacket.h" +#include "NodeList.h" + PacketReceiver::PacketReceiver(QObject* parent) : QObject(parent), _packetListenerMap() @@ -31,18 +24,18 @@ PacketReceiver::PacketReceiver(QObject* parent) : } void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* object, QString methodName) { - packetListenerLock.lock(); - if (packetListenerMap.contains(type)) { + _packetListenerLock.lock(); + if (_packetListenerMap.contains(type)) { qDebug() << "Warning: Registering a packet listener for packet type " << type << " that will remove a previously registered listener"; } - packetListenerMap[type] = QPair(object, methodName); - packetListenerLock.unlock(); + _packetListenerMap[type] = QPair(object, methodName); + _packetListenerLock.unlock(); } void PacketReceiver::processDatagrams() { - PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), - "PacketReceiver::processDatagrams()"); + //PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), + //"PacketReceiver::processDatagrams()"); if (_isShuttingDown) { return; // bail early... we're shutting down. @@ -66,21 +59,22 @@ void PacketReceiver::processDatagrams() { // TODO What do we do about this? //nodeList->processNodeData(senderSockAddr, incomingPacket); - packetListenerLock.lock(); - auto& listener = packetListenerMap[incomingType]; - packetListenerLock.unlock(); + _packetListenerLock.lock(); + auto& listener = _packetListenerMap[incomingType]; + _packetListenerLock.unlock(); - if (packetListenerMap.contains(incomingType)) { - auto& listener = packetListenerMap[incomingType]; - NLPacket packet; + if (_packetListenerMap.contains(incomingType)) { + auto& listener = _packetListenerMap[incomingType]; + //TODO Update packet + std::unique_ptr packet; bool success = QMetaObject::invokeMethod(listener.first, listener.second, Q_ARG(std::unique_ptr, packet), Q_ARG(HifiSockAddr, senderSockAddr)); if (!success) { - qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first.name() << "::" << listener.second; + qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first->objectName() << "::" << listener.second; } } else { - QDebug() << "No listener found for packet type: " << incomingType; + qDebug() << "No listener found for packet type: " << incomingType; } } diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index fd814c85ea..609797cc26 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -13,7 +13,14 @@ #ifndef hifi_PacketReceiver_h #define hifi_PacketReceiver_h +#include +#include #include +#include + +#include + +#include "PacketHeaders.h" class PacketReceiver : public QObject { Q_OBJECT @@ -35,8 +42,8 @@ public slots: void processDatagrams(); private: - QMutex packetListenerLock; - QMap> packetListenerMap; + QMutex _packetListenerLock; + QMap> _packetListenerMap; int _inPacketCount = 0; int _outPacketCount = 0; int _inByteCount = 0; From f8b4c8490357136674e3ba2a9d8e19f2f70b4d45 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 15:34:20 -0700 Subject: [PATCH 265/582] Add missing header in SentPacketHistory --- libraries/networking/src/SentPacketHistory.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/SentPacketHistory.h b/libraries/networking/src/SentPacketHistory.h index 2971df12f5..1808e0020b 100644 --- a/libraries/networking/src/SentPacketHistory.h +++ b/libraries/networking/src/SentPacketHistory.h @@ -13,8 +13,9 @@ #include #include -#include "RingBufferHistory.h" +#include "NLPacket.h" +#include "RingBufferHistory.h" #include "SequenceNumberStats.h" class NLPacket; From 2380fb23c3ea7e31ec6d4d790f1dbdcbb75ff3d2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 16:05:52 -0700 Subject: [PATCH 266/582] Update OctreePacketProcessor to use NLPacket& --- interface/src/octree/OctreePacketProcessor.cpp | 8 ++++---- interface/src/octree/OctreePacketProcessor.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 5d26ac4536..5ba191e3c7 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -26,28 +26,28 @@ OctreePacketProcessor::OctreePacketProcessor() { } // TODO implement packet processing in PacketType-specific methods -void OctreePacketProcessor::handleEntityDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleEntityDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } } -void OctreePacketProcessor::handleEntityErasePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleEntityErasePacket(NLPacket& packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } } -void OctreePacketProcessor::handleOctreeStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleOctreeStatsPacket(NLPacket& packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } } -void OctreePacketProcessor::handleEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleEnvironmentDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 7e5d6e40e4..0aac9538bb 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -30,9 +30,9 @@ protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); private slots: - void handleEntityDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleEntityErasePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleOctreeStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleEntityDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr); + void handleEntityErasePacket(NLPacket& packet, HifiSockAddr senderSockAddr); + void handleOctreeStatsPacket(NLPacket& packet, HifiSockAddr senderSockAddr); + void handleEnvironmentDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr); }; #endif // hifi_OctreePacketProcessor_h From 976d14736d4e8e229828fe680688a61a0a16d66e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 9 Jul 2015 16:06:21 -0700 Subject: [PATCH 267/582] Update PacketReceiver to pass NLPacket as NLPacket& --- libraries/networking/src/PacketReceiver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index a83b3b91a5..853a4baae4 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -68,7 +68,7 @@ void PacketReceiver::processDatagrams() { //TODO Update packet std::unique_ptr packet; bool success = QMetaObject::invokeMethod(listener.first, listener.second, - Q_ARG(std::unique_ptr, packet), + Q_ARG(NLPacket&, *packet), Q_ARG(HifiSockAddr, senderSockAddr)); if (!success) { qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first->objectName() << "::" << listener.second; From 78ff6477bdb6479da9d6dd328827b668f7928b29 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 08:45:21 -0700 Subject: [PATCH 268/582] Update OctreePacketProcessor to use QSharedPointer --- interface/src/octree/OctreePacketProcessor.cpp | 8 ++++---- interface/src/octree/OctreePacketProcessor.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 5ba191e3c7..4f3a4765ed 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -26,28 +26,28 @@ OctreePacketProcessor::OctreePacketProcessor() { } // TODO implement packet processing in PacketType-specific methods -void OctreePacketProcessor::handleEntityDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleEntityDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } } -void OctreePacketProcessor::handleEntityErasePacket(NLPacket& packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleEntityErasePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } } -void OctreePacketProcessor::handleOctreeStatsPacket(NLPacket& packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleOctreeStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } } -void OctreePacketProcessor::handleEnvironmentDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr) { +void OctreePacketProcessor::handleEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (sendingNode) { processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 0aac9538bb..73d9161a74 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -30,9 +30,9 @@ protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); private slots: - void handleEntityDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr); - void handleEntityErasePacket(NLPacket& packet, HifiSockAddr senderSockAddr); - void handleOctreeStatsPacket(NLPacket& packet, HifiSockAddr senderSockAddr); - void handleEnvironmentDataPacket(NLPacket& packet, HifiSockAddr senderSockAddr); + void handleEntityDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleEntityErasePacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleOctreeStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); }; #endif // hifi_OctreePacketProcessor_h From 28a1059232b710fc97f432e04fd1cb9d0189e6d3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 08:45:39 -0700 Subject: [PATCH 269/582] Update AudioClient to use QSharedPointer --- libraries/audio-client/src/AudioClient.cpp | 14 +++++++------- libraries/audio-client/src/AudioClient.h | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 2571f42786..c946586074 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -535,13 +535,13 @@ void AudioClient::stop() { } } -void AudioClient::handleAudioStreamStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { _stats.parseAudioStreamStatsPacket(packet->getData()); updateLastHeardFromAudioMixer(packet); } -void AudioClient::handleAudioEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { const char* dataAt = packet->getPayload(); char bitset; @@ -563,7 +563,7 @@ void AudioClient::handleAudioEnvironmentDataPacket(std::unique_ptr pac updateLastHeardFromAudioMixer(packet); } -void AudioClient::handleAudioDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleAudioDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveFirstAudioPacket); @@ -583,11 +583,11 @@ void AudioClient::handleAudioDataPacket(std::unique_ptr packet, HifiSo updateLastHeardFromAudioMixer(packet); } -void AudioClient::handleSilentAudioFrame(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleSilentAudioFrame(QSharedPointer packet, HifiSockAddr senderSockAddr) { updateLastHeardFromAudioMixer(packet); } -void AudioClient::handleNoisyMutePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleNoisyMutePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { if (!_muted) { toggleMute(); // TODO reimplement on interface side @@ -595,7 +595,7 @@ void AudioClient::handleNoisyMutePacket(std::unique_ptr packet, HifiSo } } -void AudioClient::handleMuteEnvironmentPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { glm::vec3 position; float radius; @@ -606,7 +606,7 @@ void AudioClient::handleMuteEnvironmentPacket(std::unique_ptr packet, emit muteEnvironmentRequested(position, radius); } -void AudioClient::updateLastHeardFromAudioMixer(std::unique_ptr& packet) { +void AudioClient::updateLastHeardFromAudioMixer(QSharedPointer& packet) { // update having heard from the audio-mixer and record the bytes received auto nodeList = DependencyManager::get(); SharedNodePointer audioMixer = nodeList->nodeWithUUID(packet->getSourceID()); diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index cc04d60367..8812473a79 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -139,12 +139,12 @@ public slots: void start(); void stop(); - void handleAudioStreamStatsPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleAudioEnvironmentDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleAudioDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleSilentAudioFrame(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleNoisyMutePacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void handleMuteEnvironmentPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleAudioEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleAudioDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleSilentAudioFrame(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleNoisyMutePacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); } void handleAudioInput(); @@ -214,7 +214,7 @@ private slots: void audioStateChanged(QAudio::State state); private: - void updateLastHeardFromAudioMixer(std::unique_ptr& packet); + void updateLastHeardFromAudioMixer(QSharedPointer& packet); void outputFormatChanged(); QByteArray firstInputFrame; From 4db3b309b5e6be7110f2bda27f7bead55729df2e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 08:45:54 -0700 Subject: [PATCH 270/582] Update AvatarHashMap to use QSharedPointer --- libraries/avatars/src/AvatarHashMap.cpp | 8 ++++---- libraries/avatars/src/AvatarHashMap.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index eebd9aabdd..15d161aa84 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -52,7 +52,7 @@ AvatarSharedPointer AvatarHashMap::addAvatar(const QUuid& sessionUUID, const QWe return avatar; } -void AvatarHashMap::processAvatarDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size()); int bytesRead = 0; @@ -83,7 +83,7 @@ void AvatarHashMap::processAvatarDataPacket(std::unique_ptr packet, Hi } } -void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { // setup a data stream to parse the packet QDataStream identityStream { packet.get() }; @@ -124,7 +124,7 @@ void AvatarHashMap::processAvatarIdentityPacket(std::unique_ptr packet } } -void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AvatarHashMap::processAvatarBillboardPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size()); QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(data, NUM_BYTES_RFC4122_UUID)); @@ -144,7 +144,7 @@ void AvatarHashMap::processAvatarBillboardPacket(std::unique_ptr packe } } -void AvatarHashMap::processKillAvatar(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void AvatarHashMap::processKillAvatar(QSharedPointer packet, HifiSockAddr senderSockAddr) { SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); if (avatarMixer) { avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 365241bc2c..95f996dec3 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -39,10 +39,10 @@ public slots: private slots: void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); - void processAvatarDataPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void processAvatarIdentityPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void processAvatarBillboardPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); - void processKillAvatar(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void processAvatarDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void processAvatarIdentityPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void processAvatarBillboardPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void processKillAvatar(QSharedPointer packet, HifiSockAddr senderSockAddr); protected: AvatarHashMap(); From ec0fc81b86b0bb3c473c76360f9f3d96c0f8577a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 08:46:11 -0700 Subject: [PATCH 271/582] Update EntityEditPacketSender to use QSharedPointer --- libraries/entities/src/EntityEditPacketSender.cpp | 2 +- libraries/entities/src/EntityEditPacketSender.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 48f5403063..3b938b9f1d 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -22,7 +22,7 @@ EntityEditPacketSender::EntityEditPacketSender() { packetReceiver.registerPacketListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); } -void EntityEditPacketSender::processEntityEditNackPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr) { +void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index f1cee09207..667040c1df 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -30,7 +30,7 @@ public: void queueEraseEntityMessage(const EntityItemID& entityItemID); - void processEntityEditNackPacket(std::unique_ptr packet, HifiSockAddr senderSockAddr); + void processEntityEditNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } From d009bf826e017ff4fd00ce348e455431bf625216 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 08:46:21 -0700 Subject: [PATCH 272/582] Update PacketReceiver to use QSharedPointer --- libraries/networking/src/PacketReceiver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 853a4baae4..6b4628e62c 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -66,9 +66,9 @@ void PacketReceiver::processDatagrams() { if (_packetListenerMap.contains(incomingType)) { auto& listener = _packetListenerMap[incomingType]; //TODO Update packet - std::unique_ptr packet; + QSharedPointer packet; bool success = QMetaObject::invokeMethod(listener.first, listener.second, - Q_ARG(NLPacket&, *packet), + Q_ARG(QSharedPointer, packet), Q_ARG(HifiSockAddr, senderSockAddr)); if (!success) { qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first->objectName() << "::" << listener.second; From c841867044012d7f349182a1714462a216c06f06 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 09:37:24 -0700 Subject: [PATCH 273/582] Update AudioMixer to use PacketReceiver --- assignment-client/src/audio/AudioMixer.cpp | 70 ++++++++++++++-------- assignment-client/src/audio/AudioMixer.h | 8 +++ 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index bb58bb0f78..0d0237b7e1 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -94,6 +94,15 @@ AudioMixer::AudioMixer(const QByteArray& packet) : { // constant defined in AudioMixer.h. However, we don't want to include this here // we will soon find a better common home for these audio-related constants + // SOON + + auto nodeList = DependencyManager::get(); + nodeList->registerPacketListener(PacketType::MicrophoneAudioNoEcho, this, "handleMicrophoneAudioNoEchoPacket"); + nodeList->registerPacketListener(PacketType::MicrophoneAudioWithEcho, this, "handleMicrophoneAudioWithEchoPacket"); + nodeList->registerPacketListener(PacketType::InjectAudio, this, "handleInjectAudioPacket"); + nodeList->registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFramePacket"); + nodeList->registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioStreamStatsPacket"); + nodeList->registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } const float ATTENUATION_BEGINS_AT_DISTANCE = 1.0f; @@ -535,36 +544,45 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { } void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { - auto nodeList = DependencyManager::get(); - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - // pull any new audio data from nodes off of the network stack - PacketType::Value mixerPacketType = packetTypeForPacket(receivedPacket); - if (mixerPacketType == PacketType::MicrophoneAudioNoEcho - || mixerPacketType == PacketType::MicrophoneAudioWithEcho - || mixerPacketType == PacketType::InjectAudio - || mixerPacketType == PacketType::SilentAudioFrame - || mixerPacketType == PacketType::AudioStreamStats) { + nodeList->processNodeData(senderSockAddr, receivedPacket); + } +} - nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket); - } else if (mixerPacketType == PacketType::MuteEnvironment) { - SharedNodePointer sendingNode = nodeList->sendingNodeForPacket(receivedPacket); - if (sendingNode->getCanAdjustLocks()) { - auto packet = NLPacket::create(PacketType::MuteEnvironment); - // Copy payload - packet->write(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); +void AudioMixer::handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); +} - nodeList->eachNode([&](const SharedNodePointer& node){ - if (node->getType() == NodeType::Agent && node->getActiveSocket() && - node->getLinkedData() && node != sendingNode) { - nodeList->sendPacket(std::move(packet), node); - } - }); +void AudioMixer::handleMicrophoneAudioWithEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); +} + +void AudioMixer::handleInjectAudioPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); +} + +void AudioMixer::handleSilentAudioFramePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); +} + +void AudioMixer::handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); +} + +void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + auto nodeList = DependencyManager::get(); + SharedNodePointer sendingNode = nodeList->nodeWithUUID(packet->getSourceID()); + if (sendingNode->getCanAdjustLocks()) { + auto packet = NLPacket::create(PacketType::MuteEnvironment); + // Copy payload + packet->write(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); + + nodeList->eachNode([&](const SharedNodePointer& node){ + if (node->getType() == NodeType::Agent && node->getActiveSocket() && + node->getLinkedData() && node != sendingNode) { + nodeList->sendPacket(std::move(packet), node); } - } else { - // let processNodeData handle it. - nodeList->processNodeData(senderSockAddr, receivedPacket); - } + }); } } diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 8eb64af74c..a800ffbe68 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -42,6 +42,14 @@ public slots: static const InboundAudioStream::Settings& getStreamSettings() { return _streamSettings; } +private slots: + void handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleMicrophoneAudioWithEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleInjectAudioPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleSilentAudioFramePacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + private: /// adds one stream to the mix for a listening node int addStreamToMixForListeningNodeWithStream(AudioMixerClientData* listenerNodeData, From 83dedd0a1532b2371470619362d58f37200436ea Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 09:37:43 -0700 Subject: [PATCH 274/582] Add todo to move PacketReceiver to its own thread --- libraries/networking/src/LimitedNodeList.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 15ffeb2ebd..9532a1a389 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -93,6 +93,8 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short // check the local socket right now updateLocalSockAddr(); + // TODO: Create a new thread, and move PacketReceiver to it + connect(&_nodeSocket, &QUdpSocket::readyRead, &_packetReceiver, &PacketReceiver::processDatagrams); _packetStatTimer.start(); From 528fac6b84af02a80c465100d715244c904cb8a5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 10 Jul 2015 12:22:25 -0700 Subject: [PATCH 275/582] rework of PacketReceiver registration API, HifiSockAddr packet getter --- libraries/networking/src/Packet.h | 5 +++ libraries/networking/src/PacketReceiver.cpp | 47 +++++++++++++++++++-- libraries/networking/src/PacketReceiver.h | 6 ++- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index e9483ca1f1..c52fb88e49 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -48,6 +48,9 @@ public: qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } + HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } + const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } + // Header readers PacketType::Value readType() const; PacketVersion readVersion() const; @@ -87,6 +90,8 @@ protected: qint64 _capacity = 0; // Total capacity of the payload qint64 _sizeUsed = 0; // How much of the payload is actually used + + HifiSockAddr _senderSockAddr; // sender address for packet (only used on receiving end) }; diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 6b4628e62c..a0a5e0ca6f 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -23,13 +23,54 @@ PacketReceiver::PacketReceiver(QObject* parent) : } -void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* object, QString methodName) { +void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* object, const char* slot) { + Q_ASSERT(object); + _packetListenerLock.lock(); + if (_packetListenerMap.contains(type)) { qDebug() << "Warning: Registering a packet listener for packet type " << type - << " that will remove a previously registered listener"; + << "that will remove a previously registered listener"; } - _packetListenerMap[type] = QPair(object, methodName); + + // convert the const char* slot to a QMetaMethod + int methodIndex = object->indexOfSlot(slot); + Q_ASSERT(methodIndex >= 0); + + QMetaMethod slotMethod = object->method(methodIndex); + Q_ASSERT(method.isValid()); + + // compare the parameters we expect and the parameters the QMetaMethod has + bool parametersMatch = false; + + if (NON_SOURCED_PACKETS.contains(type)) { + const QList NON_SOURCED_PACKET_LISTENER_PARAMETERS = QList() + << QString("QSharedPointer"); + + parametersMatch = slotMethod.parameterTypes() == NON_SOURCED_PACKET_LISTENER_PARAMETERS; + + qDebug() << "PacketReceiver::registerPacketListener expected a method that takes" + << NON_SOURCED_PACKET_LISTENER_PARAMETERS + << "but parameter method takes" << signalMethod.parameterTypes(); + } else { + const QList SOURCED_PACKET_LISTENER_PARAMETERS = QList() + << QString("QSharedPointer") << QString("QSharedPointer"); + + parametersMatch = slotMethod.parameterTypes() == SOURCED_PACKET_LISTENER_PARAMETERS; + + if (!parametersMatch) { + qDebug() << "PacketReceiver::registerPacketListener expected a method that takes" + << SOURCED_PACKET_LISTENER_PARAMETERS + << "but parameter method takes" << signalMethod.parameterTypes(); + } + } + + // make sure the parameters match + assert(parametersMatch); + + // add the mapping + _packetListenerMap[type] = ObjectMethodPair(object, slotMethod); + _packetListenerLock.unlock(); } diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 609797cc26..9e20a381e1 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -36,14 +36,16 @@ public: void shutdown() { _isShuttingDown = true; } - void registerPacketListener(PacketType::Value type, QObject* object, QString methodName); + bool registerPacketListener(PacketType::Value type, QObject* listener, const char* slot); public slots: void processDatagrams(); private: + using ObjectMethodPair = QPair; + QMutex _packetListenerLock; - QMap> _packetListenerMap; + QMap _packetListenerMap; int _inPacketCount = 0; int _outPacketCount = 0; int _inByteCount = 0; From 99121a3a209c5ff61c0ab08e699366ae0ec32e87 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 12:22:53 -0700 Subject: [PATCH 276/582] Fix AudioMixer not using PacketReceiver correctly --- assignment-client/src/audio/AudioMixer.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 0d0237b7e1..abd43ba907 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -96,13 +96,13 @@ AudioMixer::AudioMixer(const QByteArray& packet) : // we will soon find a better common home for these audio-related constants // SOON - auto nodeList = DependencyManager::get(); - nodeList->registerPacketListener(PacketType::MicrophoneAudioNoEcho, this, "handleMicrophoneAudioNoEchoPacket"); - nodeList->registerPacketListener(PacketType::MicrophoneAudioWithEcho, this, "handleMicrophoneAudioWithEchoPacket"); - nodeList->registerPacketListener(PacketType::InjectAudio, this, "handleInjectAudioPacket"); - nodeList->registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFramePacket"); - nodeList->registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioStreamStatsPacket"); - nodeList->registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver->registerPacketListener(PacketType::MicrophoneAudioNoEcho, this, "handleMicrophoneAudioNoEchoPacket"); + packetReceiver->registerPacketListener(PacketType::MicrophoneAudioWithEcho, this, "handleMicrophoneAudioWithEchoPacket"); + packetReceiver->registerPacketListener(PacketType::InjectAudio, this, "handleInjectAudioPacket"); + packetReceiver->registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFramePacket"); + packetReceiver->registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioStreamStatsPacket"); + packetReceiver->registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } const float ATTENUATION_BEGINS_AT_DISTANCE = 1.0f; From 1ee7a839271669373646535895f12f2b4c2c217a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 12:23:35 -0700 Subject: [PATCH 277/582] Add EntityServer packet handling --- .../src/entities/EntityServer.cpp | 24 ++++++++++++++++++- assignment-client/src/entities/EntityServer.h | 5 ++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index b928adde53..c09e068b21 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -23,7 +23,11 @@ const char* LOCAL_MODELS_PERSIST_FILE = "resources/models.svo"; EntityServer::EntityServer(const QByteArray& packet) : OctreeServer(packet), _entitySimulation(NULL) { - // nothing special to do here... + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::EntityAdd, this, "handleEntityAddPacket"); + packetReceiver.registerPacketListener(PacketType::EntityEdit, this, "handleEntityEditPacket"); + packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleEntityErasePacket"); } EntityServer::~EntityServer() { @@ -36,6 +40,24 @@ EntityServer::~EntityServer() { tree->removeNewlyCreatedHook(this); } +void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + if (_octreeInboundPacketProcessor) { + _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + } +} + +void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + if (_octreeInboundPacketProcessor) { + _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + } +} + +void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + if (_octreeInboundPacketProcessor) { + _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + } +} + OctreeQueryNode* EntityServer::createOctreeQueryNode() { return new EntityNodeData(); } diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index b73ace6048..cacf8f3457 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -49,6 +49,11 @@ public slots: protected: virtual Octree* createTree(); +private slots: + void handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + private: EntitySimulation* _entitySimulation; QTimer* _pruneDeletedEntitiesTimer = nullptr; From 09f978207b304fa90374376856c96fa7b8f7f923 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 12:23:58 -0700 Subject: [PATCH 278/582] Add packet handling to OctreeServer --- assignment-client/src/octree/OctreeServer.cpp | 36 +++++++++++++++++++ assignment-client/src/octree/OctreeServer.h | 5 +++ 2 files changed, 41 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 3a3b5dec37..55d6f0be81 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -247,6 +247,11 @@ OctreeServer::OctreeServer(const QByteArray& packet) : // make sure the AccountManager has an Auth URL for payment redemptions AccountManager::getInstance().setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); + + auto packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver->registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); + packetReceiver->registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); + packetReceiver->registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); } OctreeServer::~OctreeServer() { @@ -855,6 +860,37 @@ void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const H } } +void handleOctreeQueryPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + // If we got a query packet, then we're talking to an agent, and we + // need to make sure we have it in our nodeList. + SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); + if (matchingNode) { + nodeList->updateNodeWithDataFromPacket(matchingNode, packet->getData()); + + OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); + if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + nodeData->initializeOctreeSendThread(this, matchingNode); + } + } +} + +void handleOctreeDataNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + // If we got a nack packet, then we're talking to an agent, and we + // need to make sure we have it in our nodeList. + SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); + if (matchingNode) { + OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); + if (nodeData) { + nodeData->parseNackPacket(packet->getData()); + } + } +} + +void handleJurisdictionRequestPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); + _jurisdictionSender->queueReceivedPacket(matchingNode, packet->getData()); +} + void OctreeServer::setupDatagramProcessingThread() { auto nodeList = DependencyManager::get(); diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index ec5c85c3f5..d25ef3183b 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -128,6 +128,11 @@ public slots: void readPendingDatagrams() { }; // this will not be called since our datagram processing thread will handle void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); +private slots: + void handleOctreeQueryPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleOctreeDataNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleJurisdictionRequestPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + protected: virtual Octree* createTree() = 0; bool readOptionBool(const QString& optionName, const QJsonObject& settingsSectionObject, bool& result); From 5a862739aaa9fd3cddd516ad3a2b80d2597e7a4d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 12:24:17 -0700 Subject: [PATCH 279/582] Fix shared ptr call in AvatarHashMap --- libraries/avatars/src/AvatarHashMap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 15d161aa84..03187a02bc 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -85,7 +85,7 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Hif void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { // setup a data stream to parse the packet - QDataStream identityStream { packet.get() }; + QDataStream identityStream { packet.data() }; QUuid sessionUUID; From 2f0c21a603b6950ebdedecb90171bab770439c1c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 12:24:35 -0700 Subject: [PATCH 280/582] Temporarily disable packet dispatching in PacketReceiver --- libraries/networking/src/PacketReceiver.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 6b4628e62c..d40ce40ba1 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -67,9 +67,9 @@ void PacketReceiver::processDatagrams() { auto& listener = _packetListenerMap[incomingType]; //TODO Update packet QSharedPointer packet; - bool success = QMetaObject::invokeMethod(listener.first, listener.second, - Q_ARG(QSharedPointer, packet), - Q_ARG(HifiSockAddr, senderSockAddr)); + bool success = true; //QMetaObject::invokeMethod(listener.first, listener.second, + // Q_ARG(QSharedPointer, packet), + // Q_ARG(HifiSockAddr, senderSockAddr)); if (!success) { qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first->objectName() << "::" << listener.second; } From 972c465bdb09292f8ce43ebca1b9ca218b6b1e60 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 12:25:01 -0700 Subject: [PATCH 281/582] Remove PacketReceiver copy ctor and = operator --- libraries/networking/src/PacketReceiver.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 609797cc26..403ac79864 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -26,6 +26,9 @@ class PacketReceiver : public QObject { Q_OBJECT public: PacketReceiver(QObject* parent = 0); + PacketReceiver(const PacketReceiver&) = delete; + + PacketReceiver& operator=(const PacketReceiver&) = delete; int getInPacketCount() const { return _inPacketCount; } int getOutPacketCount() const { return _outPacketCount; } From 2d1c3e27daecf61049a7d4699004bea663aefa1b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 10 Jul 2015 12:27:44 -0700 Subject: [PATCH 282/582] fix parameter matching in PacketReceiver --- libraries/networking/src/PacketReceiver.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index a0a5e0ca6f..02f948dc5f 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -34,10 +34,10 @@ void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* obj } // convert the const char* slot to a QMetaMethod - int methodIndex = object->indexOfSlot(slot); + int methodIndex = object->metaObject()->indexOfSlot(slot); Q_ASSERT(methodIndex >= 0); - QMetaMethod slotMethod = object->method(methodIndex); + QMetaMethod slotMethod = object->metaObject()->method(methodIndex); Q_ASSERT(method.isValid()); // compare the parameters we expect and the parameters the QMetaMethod has @@ -45,7 +45,7 @@ void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* obj if (NON_SOURCED_PACKETS.contains(type)) { const QList NON_SOURCED_PACKET_LISTENER_PARAMETERS = QList() - << QString("QSharedPointer"); + << QMetaObject::normalizedType("QSharedPointer"); parametersMatch = slotMethod.parameterTypes() == NON_SOURCED_PACKET_LISTENER_PARAMETERS; @@ -54,7 +54,8 @@ void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* obj << "but parameter method takes" << signalMethod.parameterTypes(); } else { const QList SOURCED_PACKET_LISTENER_PARAMETERS = QList() - << QString("QSharedPointer") << QString("QSharedPointer"); + << QMetaObject::normalizedType(("QSharedPointer") + << QMetaObject::normalizedType(("QSharedPointer"); parametersMatch = slotMethod.parameterTypes() == SOURCED_PACKET_LISTENER_PARAMETERS; From 74afbd7de725af29578a409af451999b2aa2a0a0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 14:22:46 -0700 Subject: [PATCH 283/582] Fix AudioMixer packetReceiver calls --- assignment-client/src/audio/AudioMixer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index abd43ba907..ec9998c881 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -97,12 +97,12 @@ AudioMixer::AudioMixer(const QByteArray& packet) : // SOON auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver->registerPacketListener(PacketType::MicrophoneAudioNoEcho, this, "handleMicrophoneAudioNoEchoPacket"); - packetReceiver->registerPacketListener(PacketType::MicrophoneAudioWithEcho, this, "handleMicrophoneAudioWithEchoPacket"); - packetReceiver->registerPacketListener(PacketType::InjectAudio, this, "handleInjectAudioPacket"); - packetReceiver->registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFramePacket"); - packetReceiver->registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioStreamStatsPacket"); - packetReceiver->registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); + packetReceiver.registerPacketListener(PacketType::MicrophoneAudioNoEcho, this, "handleMicrophoneAudioNoEchoPacket"); + packetReceiver.registerPacketListener(PacketType::MicrophoneAudioWithEcho, this, "handleMicrophoneAudioWithEchoPacket"); + packetReceiver.registerPacketListener(PacketType::InjectAudio, this, "handleInjectAudioPacket"); + packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFramePacket"); + packetReceiver.registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioStreamStatsPacket"); + packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } const float ATTENUATION_BEGINS_AT_DISTANCE = 1.0f; From 6e53a5ad978b408f6fefaaa512a79e4521810b6a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 14:23:09 -0700 Subject: [PATCH 284/582] Update OctreePacketProcessor to use SharedNodePointer --- .../src/octree/OctreePacketProcessor.cpp | 28 ++++++------------- interface/src/octree/OctreePacketProcessor.h | 10 +++---- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 4f3a4765ed..dba75b0c5f 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -26,32 +26,20 @@ OctreePacketProcessor::OctreePacketProcessor() { } // TODO implement packet processing in PacketType-specific methods -void OctreePacketProcessor::handleEntityDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (sendingNode) { - processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - } +void OctreePacketProcessor::handleEntityDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } -void OctreePacketProcessor::handleEntityErasePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (sendingNode) { - processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - } +void OctreePacketProcessor::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } -void OctreePacketProcessor::handleOctreeStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (sendingNode) { - processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - } +void OctreePacketProcessor::handleOctreeStatsPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } -void OctreePacketProcessor::handleEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - SharedNodePointer sendingNode = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (sendingNode) { - processPacket(sendingNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - } +void OctreePacketProcessor::handleEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 73d9161a74..5274353b83 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -16,7 +16,7 @@ /// 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 GenericThread { +class OctreePacketProcessor : public ReceivedPacketProcessor { Q_OBJECT public: OctreePacketProcessor(); @@ -30,9 +30,9 @@ protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); private slots: - void handleEntityDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleEntityErasePacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleOctreeStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleEntityDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreeStatsPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); }; #endif // hifi_OctreePacketProcessor_h From 99aaefbd0331922f921af44f8fbf8df010d510a5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 15:00:29 -0700 Subject: [PATCH 285/582] Fix and update signature of Application::handleDomainConnectionDeniedPacket --- interface/src/Application.cpp | 24 ++++++++++++------------ interface/src/Application.h | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 20878205a9..98d9325403 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3822,19 +3822,19 @@ void Application::domainConnectionDenied(const QString& reason) { } } -void handleDomainConnectionDeniedPacket(std::unique_ptr, HifiSockAddr senderSockAddr) { - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::DomainConnectionDenied); - QDataStream packetStream(QByteArray(incomingPacket.constData() + headerSize, - incomingPacket.size() - headerSize)); - QString reason; - packetStream >> reason; +void Application::handleDomainConnectionDeniedPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::DomainConnectionDenied); + QDataStream packetStream(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - // output to the log so the user knows they got a denied connection request - // and check and signal for an access token so that we can make sure they are logged in - qCDebug(interfaceapp) << "The domain-server denied a connection request: " << reason; - qCDebug(interfaceapp) << "You may need to re-log to generate a keypair so you can provide a username signature."; - domainConnectionDenied(reason); - AccountManager::getInstance().checkAndSignalForAccessToken(); + QString reason; + packetStream >> reason; + + // output to the log so the user knows they got a denied connection request + // and check and signal for an access token so that we can make sure they are logged in + qCDebug(interfaceapp) << "The domain-server denied a connection request: " << reason; + qCDebug(interfaceapp) << "You may need to re-log to generate a keypair so you can provide a username signature."; + domainConnectionDenied(reason); + AccountManager::getInstance().checkAndSignalForAccessToken(); } void Application::connectedToDomain(const QString& hostname) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 9653556da0..c3f31a107c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -444,7 +444,7 @@ public slots: void notifyPacketVersionMismatch(); void domainConnectionDenied(const QString& reason); - void handleDomainConnectionDeniedPacket(std::unique_ptr, HifiSockAddr senderSockAddr); + void handleDomainConnectionDeniedPacket(QSharedPointer, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); void cameraMenuChanged(); From dee117500bddb961b5d22bdc819fa6362b340806 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 15:00:46 -0700 Subject: [PATCH 286/582] Remove process() from OctreePacketProcessor --- interface/src/octree/OctreePacketProcessor.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 5274353b83..50d68fe713 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -21,8 +21,6 @@ class OctreePacketProcessor : public ReceivedPacketProcessor { public: OctreePacketProcessor(); - virtual bool process() override { }; - signals: void packetVersionMismatch(); From d74ce120986ed7ec024fdc4f9e47f93df0916a7a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 15:01:21 -0700 Subject: [PATCH 287/582] Remove declaration processAvatarMixerDatagram from AvatarHashMap --- libraries/avatars/src/AvatarHashMap.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 95f996dec3..3c979e35f8 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -34,7 +34,6 @@ public: int size() { return _avatarHash.size(); } public slots: - void processAvatarMixerDatagram(const QByteArray& datagram, const QWeakPointer& mixerWeakPointer); bool isAvatarInRange(const glm::vec3 & position, const float range); private slots: From 1c212ba1a18e74c8b992f5f9d1afc91e4f6702ea Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 15:01:45 -0700 Subject: [PATCH 288/582] Disable disabling of entity nack packet temporarily --- libraries/entities/src/EntityEditPacketSender.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 3b938b9f1d..a798b83412 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -23,9 +23,9 @@ EntityEditPacketSender::EntityEditPacketSender() { } void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { + // if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - } + // } } void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew) { From 1fb4c13b3c9d4740f3c07a1b39144f633c41ae3f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 15:51:12 -0700 Subject: [PATCH 289/582] Update AssignmentClient to use PacketReceiver --- assignment-client/src/AssignmentClient.cpp | 110 +++++++++------------ assignment-client/src/AssignmentClient.h | 5 +- 2 files changed, 48 insertions(+), 67 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index fd9e4f4f71..971da41df6 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -104,9 +104,6 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri connect(&_requestTimer, SIGNAL(timeout()), SLOT(sendAssignmentRequest())); _requestTimer.start(ASSIGNMENT_REQUEST_INTERVAL_MSECS); - // connect our readPendingDatagrams method to the readyRead() signal of the socket - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClient::readPendingDatagrams); - // connections to AccountManager for authentication connect(&AccountManager::getInstance(), &AccountManager::authRequired, this, &AssignmentClient::handleAuthenticationRequest); @@ -123,6 +120,9 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri // Hook up a timer to send this child's status to the Monitor once per second setUpStatsToMonitor(); } + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleCreateAssignmentPacket"); + packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleStopNodePacket"); } @@ -206,85 +206,63 @@ void AssignmentClient::sendAssignmentRequest() { } } -void AssignmentClient::readPendingDatagrams() { - auto nodeList = DependencyManager::get(); +void AssignmentClient::handleCreateAssignementPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + qDebug() << "Received a PacketType::CreateAssignment - attempting to unpack."; - QByteArray receivedPacket; - HifiSockAddr senderSockAddr; + // construct the deployed assignment from the packet data + _currentAssignment = AssignmentFactory::unpackAssignment(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - while (nodeList->getNodeSocket().hasPendingDatagrams()) { - receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); - nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); + if (_currentAssignment) { + qDebug() << "Received an assignment -" << *_currentAssignment; - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - if (packetTypeForPacket(receivedPacket) == PacketType::CreateAssignment) { + // switch our DomainHandler hostname and port to whoever sent us the assignment - qDebug() << "Received a PacketType::CreateAssignment - attempting to unpack."; + nodeList->getDomainHandler().setSockAddr(senderSockAddr, _assignmentServerHostname); + nodeList->getDomainHandler().setAssignmentUUID(_currentAssignment->getUUID()); - // construct the deployed assignment from the packet data - _currentAssignment = AssignmentFactory::unpackAssignment(receivedPacket); + qDebug() << "Destination IP for assignment is" << nodeList->getDomainHandler().getIP().toString(); - if (_currentAssignment) { - qDebug() << "Received an assignment -" << *_currentAssignment; + // start the deployed assignment + QThread* workerThread = new QThread; + workerThread->setObjectName("ThreadedAssignment Worker"); - // switch our DomainHandler hostname and port to whoever sent us the assignment + connect(workerThread, &QThread::started, _currentAssignment.data(), &ThreadedAssignment::run); - nodeList->getDomainHandler().setSockAddr(senderSockAddr, _assignmentServerHostname); - nodeList->getDomainHandler().setAssignmentUUID(_currentAssignment->getUUID()); + // Once the ThreadedAssignment says it is finished - we ask it to deleteLater + // This is a queued connection so that it is put into the event loop to be processed by the worker + // thread when it is ready. + connect(_currentAssignment.data(), &ThreadedAssignment::finished, _currentAssignment.data(), + &ThreadedAssignment::deleteLater, Qt::QueuedConnection); - qDebug() << "Destination IP for assignment is" << nodeList->getDomainHandler().getIP().toString(); + // once it is deleted, we quit the worker thread + connect(_currentAssignment.data(), &ThreadedAssignment::destroyed, workerThread, &QThread::quit); - // start the deployed assignment - QThread* workerThread = new QThread; - workerThread->setObjectName("ThreadedAssignment Worker"); + // have the worker thread remove itself once it is done + connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater); - connect(workerThread, &QThread::started, _currentAssignment.data(), &ThreadedAssignment::run); + // once the worker thread says it is done, we consider the assignment completed + connect(workerThread, &QThread::destroyed, this, &AssignmentClient::assignmentCompleted); - // Once the ThreadedAssignment says it is finished - we ask it to deleteLater - // This is a queued connection so that it is put into the event loop to be processed by the worker - // thread when it is ready. - connect(_currentAssignment.data(), &ThreadedAssignment::finished, _currentAssignment.data(), - &ThreadedAssignment::deleteLater, Qt::QueuedConnection); + _currentAssignment->moveToThread(workerThread); - // once it is deleted, we quit the worker thread - connect(_currentAssignment.data(), &ThreadedAssignment::destroyed, workerThread, &QThread::quit); + // move the NodeList to the thread used for the _current assignment + nodeList->moveToThread(workerThread); - // have the worker thread remove itself once it is done - connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater); + // Starts an event loop, and emits workerThread->started() + workerThread->start(); + } else { + qDebug() << "Received an assignment that could not be unpacked. Re-requesting."; + } +} - // once the worker thread says it is done, we consider the assignment completed - connect(workerThread, &QThread::destroyed, this, &AssignmentClient::assignmentCompleted); +void AssignmentClient::handleStopNodePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || + senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { + qDebug() << "AssignmentClientMonitor at" << senderSockAddr << "requested stop via PacketType::StopNode."; - _currentAssignment->moveToThread(workerThread); - - // move the NodeList to the thread used for the _current assignment - nodeList->moveToThread(workerThread); - - // let the assignment handle the incoming datagrams for its duration - disconnect(&nodeList->getNodeSocket(), 0, this, 0); - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, _currentAssignment.data(), - &ThreadedAssignment::readPendingDatagrams); - - // Starts an event loop, and emits workerThread->started() - workerThread->start(); - } else { - qDebug() << "Received an assignment that could not be unpacked. Re-requesting."; - } - } else if (packetTypeForPacket(receivedPacket) == PacketType::StopNode) { - if (senderSockAddr.getAddress() == QHostAddress::LocalHost || - senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - qDebug() << "AssignmentClientMonitor at" << senderSockAddr << "requested stop via PacketType::StopNode."; - - QCoreApplication::quit(); - } else { - qDebug() << "Got a stop packet from other than localhost."; - } - } else { - // have the NodeList attempt to handle it - nodeList->processNodeData(senderSockAddr, receivedPacket); - } - } + QCoreApplication::quit(); + } else { + qDebug() << "Got a stop packet from other than localhost."; } } diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 60e81a94eb..ba0a2e096e 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -28,7 +28,6 @@ public: quint16 assignmentMonitorPort); private slots: void sendAssignmentRequest(); - void readPendingDatagrams(); void assignmentCompleted(); void handleAuthenticationRequest(); void sendStatsPacketToACM(); @@ -37,6 +36,10 @@ private slots: public slots: void aboutToQuit(); +private slots: + void handleCreateAssignementPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleStopNodePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + private: void setUpStatsToMonitor(); From 5c831efe64e9ffe1bd90599970217d9553c6fd6f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 16:13:57 -0700 Subject: [PATCH 290/582] Remove avatar packet processing from Agent --- assignment-client/src/Agent.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0a4408cbf0..916e07d7e9 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -118,18 +118,6 @@ void Agent::readPendingDatagrams() { // let this continue through to the NodeList so it updates last heard timestamp // for the sending audio mixer DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); - } else if (datagramPacketType == PacketType::BulkAvatarData - || datagramPacketType == PacketType::AvatarIdentity - || datagramPacketType == PacketType::AvatarBillboard - || datagramPacketType == PacketType::KillAvatar) { - // let the avatar hash map process it - DependencyManager::get()->processAvatarMixerDatagram(receivedPacket, nodeList->sendingNodeForPacket(receivedPacket)); - - // let this continue through to the NodeList so it updates last heard timestamp - // for the sending avatar-mixer - DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); - } else { - DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); } } } From 0d920c7b7c4e9bf8c85bedc108b8e608b4748e31 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 16:14:23 -0700 Subject: [PATCH 291/582] Update method name in AssignmentClient --- assignment-client/src/AssignmentClient.cpp | 7 +++---- assignment-client/src/AssignmentClient.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 971da41df6..dda505429d 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -206,7 +206,7 @@ void AssignmentClient::sendAssignmentRequest() { } } -void AssignmentClient::handleCreateAssignementPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { qDebug() << "Received a PacketType::CreateAssignment - attempting to unpack."; // construct the deployed assignment from the packet data @@ -215,6 +215,8 @@ void AssignmentClient::handleCreateAssignementPacket(QSharedPointer pa if (_currentAssignment) { qDebug() << "Received an assignment -" << *_currentAssignment; + auto nodeList = DependencyManager::get(); + // switch our DomainHandler hostname and port to whoever sent us the assignment nodeList->getDomainHandler().setSockAddr(senderSockAddr, _assignmentServerHostname); @@ -305,9 +307,6 @@ void AssignmentClient::assignmentCompleted() { auto nodeList = DependencyManager::get(); - // have us handle incoming NodeList datagrams again, and make sure our ThreadedAssignment isn't handling them - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClient::readPendingDatagrams); - // reset our NodeList by switching back to unassigned and clearing the list nodeList->setOwnerType(NodeType::Unassigned); nodeList->reset(); diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index ba0a2e096e..268683fa3c 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -37,7 +37,7 @@ public slots: void aboutToQuit(); private slots: - void handleCreateAssignementPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleCreateAssignmentPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); void handleStopNodePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); private: From 910836fa5a830be203ff89e20903b2ab1af5bfa4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 16:14:40 -0700 Subject: [PATCH 292/582] Remove readPendingDatagrams from AudioMixer --- assignment-client/src/audio/AudioMixer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index a800ffbe68..c88c5a6242 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -35,7 +35,6 @@ public slots: /// threaded run of assignment void run(); - void readPendingDatagrams() { }; // this will not be called since our datagram processing thread will handle void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); void sendStatsPacket(); From fe5b17f061be489a3df9d5f8198525b8ad040e31 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 16:15:05 -0700 Subject: [PATCH 293/582] Remove readPendingDatagrams from ThreadedAssignment --- libraries/networking/src/ThreadedAssignment.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index e2e0aa0fed..daca2cfe00 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -30,7 +30,6 @@ public slots: /// threaded run of assignment virtual void run() = 0; Q_INVOKABLE virtual void stop() { setFinished(true); } - virtual void readPendingDatagrams() = 0; virtual void sendStatsPacket(); signals: From cc7bfd90f120a7f5e97b17775780c1ae4d631215 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 16:27:42 -0700 Subject: [PATCH 294/582] Move audio packet handling to listener in Agent --- assignment-client/src/Agent.cpp | 24 ++++++++++++------------ assignment-client/src/Agent.h | 3 +++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 916e07d7e9..0576a0d4f0 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -47,6 +47,10 @@ Agent::Agent(const QByteArray& packet) : DependencyManager::set(); DependencyManager::set(); + + auto& packetReceiver = DependencyManager::get()->getPackingReceiver(); + packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioPacket"); + packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleAudioPacket"); } void Agent::readPendingDatagrams() { @@ -106,23 +110,19 @@ void Agent::readPendingDatagrams() { if (datagramPacketType == PacketType::EntityData || datagramPacketType == PacketType::EntityErase) { _entityViewer.processDatagram(mutablePacket, sourceNode); } - - } else if (datagramPacketType == PacketType::MixedAudio || datagramPacketType == PacketType::SilentAudioFrame) { - - _receivedAudioStream.parseData(receivedPacket); - - _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); - - _receivedAudioStream.clearBuffer(); - - // let this continue through to the NodeList so it updates last heard timestamp - // for the sending audio mixer - DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); } } } } +void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + _receivedAudioStream.parseData(receivedPacket); + + _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); + + _receivedAudioStream.clearBuffer(); +} + const QString AGENT_LOGGING_NAME = "agent"; void Agent::run() { diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 415b14c0da..bee043f6f4 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -55,6 +55,9 @@ public slots: void readPendingDatagrams(); void playAvatarSound(Sound* avatarSound) { _scriptEngine.setAvatarSound(avatarSound); } +private slots: + void handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + private: ScriptEngine _scriptEngine; EntityEditPacketSender _entityEditSender; From 990f7b7332887565776f5b680e55a29d56c2eab3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 10 Jul 2015 16:45:44 -0700 Subject: [PATCH 295/582] changes for new packet receive API --- libraries/networking/src/LimitedNodeList.cpp | 93 +++---------- libraries/networking/src/LimitedNodeList.h | 15 +-- libraries/networking/src/NLPacket.cpp | 70 ++++++++-- libraries/networking/src/NLPacket.h | 19 ++- libraries/networking/src/NetworkPeer.h | 6 +- libraries/networking/src/Packet.cpp | 40 ++++-- libraries/networking/src/Packet.h | 16 ++- libraries/networking/src/PacketHeaders.cpp | 9 -- libraries/networking/src/PacketHeaders.h | 3 - libraries/networking/src/PacketReceiver.cpp | 134 ++++++++++++++----- libraries/networking/src/PacketReceiver.h | 18 ++- 11 files changed, 258 insertions(+), 165 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 9532a1a389..962f8dbc30 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -168,54 +168,33 @@ void LimitedNodeList::changeSocketBufferSizes(int numBytes) { } } -bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { - PacketType::Value checkType = packetTypeForPacket(packet); - int numPacketTypeBytes = numBytesArithmeticCodingFromBuffer(packet.data()); - - if (packet[numPacketTypeBytes] != versionForPacketType(checkType) - && checkType != PacketType::StunResponse) { - PacketType::Value mismatchType = packetTypeForPacket(packet); - - static QMultiMap versionDebugSuppressMap; - - QUuid senderUUID = uuidFromPacketHeader(packet); - if (!versionDebugSuppressMap.contains(senderUUID, checkType)) { - qCDebug(networking) << "Packet version mismatch on" << packetTypeForPacket(packet) << "- Sender" - << uuidFromPacketHeader(packet) << "sent" << qPrintable(QString::number(packet[numPacketTypeBytes])) << "but" - << qPrintable(QString::number(versionForPacketType(mismatchType))) << "expected."; - - emit packetVersionMismatch(); - - versionDebugSuppressMap.insert(senderUUID, checkType); - } - - return false; - } - - if (!NON_VERIFIED_PACKETS.contains(checkType)) { +bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNodePointer& matchingNode) { + + if (!NON_VERIFIED_PACKETS.contains(packet.getType()) && !NON_SOURCED_PACKETS.contains(packet.getType())) { // figure out which node this is from - SharedNodePointer sendingNode = sendingNodeForPacket(packet); - if (sendingNode) { + matchingNode = nodeWithUUID(packet.getSourceID()); + + if (matchingNode) { // check if the md5 hash in the header matches the hash we would expect - if (hashFromPacketHeader(packet) == hashForPacketAndConnectionUUID(packet, sendingNode->getConnectionSecret())) { + if (packet.getVerificationHash() == packet.payloadHashWithConnectionUUID(matchingNode->getConnectionSecret())) { return true; } else { static QMultiMap hashDebugSuppressMap; + + const QUuid& senderID = packet.getSourceID(); - QUuid senderUUID = uuidFromPacketHeader(packet); - if (!hashDebugSuppressMap.contains(senderUUID, checkType)) { - qCDebug(networking) << "Packet hash mismatch on" << checkType << "- Sender" - << uuidFromPacketHeader(packet); + if (!hashDebugSuppressMap.contains(senderID, packet.getType())) { + qCDebug(networking) << "Packet hash mismatch on" << packet.getType() << "- Sender" << senderID; - hashDebugSuppressMap.insert(senderUUID, checkType); + hashDebugSuppressMap.insert(senderID, packet.getType()); } } } else { static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ received from unknown node with UUID"); - qCDebug(networking) << "Packet of type" << checkType << "received from unknown node with UUID" - << qPrintable(uuidStringWithoutCurlyBraces(uuidFromPacketHeader(packet))); + qCDebug(networking) << "Packet of type" << packet.getType() << "received from unknown node with UUID" + << qPrintable(uuidStringWithoutCurlyBraces(packet.getSourceID())); } } else { return true; @@ -224,19 +203,6 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { return false; } -qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* address = 0, quint16* port = 0) { - qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); - - SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); - if (sendingNode) { - emit dataReceived(sendingNode->getType(), incomingPacket.size()); - } else { - emit dataReceived(NodeType::Unassigned, incomingPacket.size()); - } - - return result; -} - qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { // XXX can BandwidthRecorder be used for this? // stat collection for packets @@ -262,25 +228,13 @@ PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid return _packetSequenceNumbers[nodeUUID][packetType]++; } -void LimitedNodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) { - // the node decided not to do anything with this packet - // if it comes from a known source we should keep that node alive - SharedNodePointer matchingNode = sendingNodeForPacket(packet); - if (matchingNode) { - matchingNode->setLastHeardMicrostamp(usecTimestampNow()); - } -} - -int LimitedNodeList::updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray &packet) { +int LimitedNodeList::updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, QSharedPointer packet) { QMutexLocker locker(&matchingNode->getMutex()); - matchingNode->setLastHeardMicrostamp(usecTimestampNow()); - // if this was a sequence numbered packet we should store the last seq number for // a packet of this type for this node - PacketType::Value packetType = packetTypeForPacket(packet); - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { - matchingNode->setLastSequenceNumberForPacketType(sequenceNumberFromHeader(packet, packetType), packetType); + if (SEQUENCE_NUMBERED_PACKETS.contains(packet->getType())) { + matchingNode->setLastSequenceNumberForPacketType(packet->readSequenceNumber(), packet->getType()); } NodeData* linkedData = matchingNode->getLinkedData(); @@ -290,13 +244,13 @@ int LimitedNodeList::updateNodeWithDataFromPacket(const SharedNodePointer& match if (linkedData) { QMutexLocker linkedDataLocker(&linkedData->getMutex()); - return linkedData->parseData(packet); + return linkedData->parseData(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); } return 0; } -int LimitedNodeList::findNodeAndUpdateWithDataFromPacket(const QByteArray& packet) { - SharedNodePointer matchingNode = sendingNodeForPacket(packet); +int LimitedNodeList::findNodeAndUpdateWithDataFromPacket(QSharedPointer packet) { + SharedNodePointer matchingNode = nodeWithUUID(packet->getSourceID()); if (matchingNode) { return updateNodeWithDataFromPacket(matchingNode, packet); @@ -313,13 +267,6 @@ SharedNodePointer LimitedNodeList::nodeWithUUID(const QUuid& nodeUUID) { return it == _nodeHash.cend() ? SharedNodePointer() : it->second; } -SharedNodePointer LimitedNodeList::sendingNodeForPacket(const QByteArray& packet) { - QUuid nodeUUID = uuidFromPacketHeader(packet); - - // return the matching node, or NULL if there is no match - return nodeWithUUID(nodeUUID); -} - void LimitedNodeList::eraseAllNodes() { qCDebug(networking) << "Clearing the NodeList. Deleting all nodes in list."; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 5cb59364d6..b2dd95f71c 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -120,7 +120,8 @@ public: QUdpSocket& getNodeSocket() { return _nodeSocket; } QUdpSocket& getDTLSSocket(); - bool packetVersionAndHashMatch(const QByteArray& packet); + bool packetVersionMatch(const NLPacket& packet); + bool packetSourceAndHashMatch(const NLPacket& packet, SharedNodePointer& matchingNode); PacketReceiver& getPacketReceiver() { return _packetReceiver; } @@ -130,7 +131,6 @@ public: // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } // int populatePacketHeader(char* packet, PacketType::Value packetType) // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); qint64 sendUnreliablePacket(const NLPacket& packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { assert(false); return 0; } @@ -146,7 +146,6 @@ public: int size() const { return _nodeHash.size(); } SharedNodePointer nodeWithUUID(const QUuid& nodeUUID); - SharedNodePointer sendingNodeForPacket(const QByteArray& packet); SharedNodePointer addOrUpdateNode(const QUuid& uuid, NodeType_t nodeType, const HifiSockAddr& publicSocket, const HifiSockAddr& localSocket, @@ -158,11 +157,10 @@ public: const HifiSockAddr& getLocalSockAddr() const { return _localSockAddr; } const HifiSockAddr& getSTUNSockAddr() const { return _stunSockAddr; } - void processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet); void processKillNode(const QByteArray& datagram); - int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray& packet); - int findNodeAndUpdateWithDataFromPacket(const QByteArray& packet); + int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, QSharedPointer packet); + int findNodeAndUpdateWithDataFromPacket(const QSharedPointer packet); unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) { assert(false); return 0; } SharedNodePointer soloNodeOfType(char nodeType); @@ -256,11 +254,6 @@ signals: void canAdjustLocksChanged(bool canAdjustLocks); void canRezChanged(bool canRez); - void dataSent(const quint8 channel_type, const int bytes); - void dataReceived(const quint8 channel_type, const int bytes); - - void packetVersionMismatch(); - protected: LimitedNodeList(unsigned short socketListenPort = 0, unsigned short dtlsListenPort = 0); LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 1b1ac50eda..79d881c930 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -13,7 +13,7 @@ qint64 NLPacket::localHeaderSize(PacketType::Value type) { qint64 size = ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID) + - ((NON_VERIFIED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID); + ((NON_VERIFIED_PACKETS.contains(type) || NON_VERIFIED_PACKETS.contains(type)) ? 0 : NUM_BYTES_MD5_HASH); return size; } @@ -43,6 +43,19 @@ std::unique_ptr NLPacket::create(PacketType::Value type, qint64 size) return std::unique_ptr(new NLPacket(type, size)); } +std::unique_ptr NLPacket::fromReceivedPacket(std::unique_ptr data, qint64 size, + const HifiSockAddr& senderSockAddr) { + // Fail with null data + Q_ASSERT(data); + + // Fail with invalid size + Q_ASSERT(size >= 0); + + // allocate memory + return std::unique_ptr(new NLPacket(std::move(data), size, senderSockAddr)); + +} + std::unique_ptr NLPacket::createCopy(const NLPacket& other) { return std::unique_ptr(new NLPacket(other)); } @@ -53,15 +66,52 @@ NLPacket::NLPacket(PacketType::Value type, qint64 size) : Packet(type, localHead NLPacket::NLPacket(const NLPacket& other) : Packet(other) { } -void NLPacket::setSourceUuid(QUuid sourceUuid) { - Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type)); - auto offset = Packet::totalHeadersSize(); - memcpy(_packet.get() + offset, sourceUuid.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); +NLPacket::NLPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr) : + Packet(std::move(data), size, senderSockAddr) +{ + readSourceID(); + readVerificationHash(); } -void NLPacket::setConnectionUuid(QUuid connectionUuid) { - Q_ASSERT(!NON_VERIFIED_PACKETS.contains(_type)); - auto offset = Packet::totalHeadersSize() + - ((NON_SOURCED_PACKETS.contains(_type)) ? 0 : NUM_BYTES_RFC4122_UUID); - memcpy(_packet.get() + offset, connectionUuid.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); +void NLPacket::readSourceID() { + if (!NON_SOURCED_PACKETS.contains(_type)) { + auto offset = Packet::totalHeadersSize(); + _sourceID = QUuid::fromRfc4122(QByteArray::fromRawData(_packet.get() + offset, NUM_BYTES_RFC4122_UUID)); + } +} + +void NLPacket::readVerificationHash() { + if (!NON_SOURCED_PACKETS.contains(_type) && !NON_VERIFIED_PACKETS.contains(_type)) { + auto offset = Packet::totalHeadersSize() + NUM_BYTES_RFC4122_UUID; + _verificationHash = QByteArray(_packet.get() + offset, NUM_BYTES_MD5_HASH); + } +} + +void NLPacket::setSourceID(const QUuid& sourceID) { + Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type)); + + auto offset = Packet::totalHeadersSize(); + memcpy(_packet.get() + offset, sourceID.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); + + _sourceID = sourceID; +} + +void NLPacket::setVerificationHash(const QByteArray& verificationHash) { + Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type) && !NON_VERIFIED_PACKETS.contains(_type)); + + auto offset = Packet::totalHeadersSize() + NUM_BYTES_RFC4122_UUID; + memcpy(_packet.get() + offset, verificationHash.data(), verificationHash.size()); + + _verificationHash = verificationHash; +} + +QByteArray NLPacket::payloadHashWithConnectionUUID(const QUuid& connectionUUID) const { + QCryptographicHash hash(QCryptographicHash::Md5); + + // add the packet payload and the connection UUID + hash.addData(_payloadStart, _sizeUsed); + hash.addData(connectionUUID.toRfc4122()); + + // return the hash + return hash.result(); } diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index e3b1778c39..8652bb3371 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -18,6 +18,8 @@ class NLPacket : public Packet { Q_OBJECT public: static std::unique_ptr create(PacketType::Value type, qint64 size = -1); + static std::unique_ptr fromReceivedPacket(std::unique_ptr data, qint64 size, + const HifiSockAddr& senderSockAddr); // Provided for convenience, try to limit use static std::unique_ptr createCopy(const NLPacket& other); @@ -27,15 +29,24 @@ public: virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers virtual qint64 localHeaderSize() const; // Current level's header size - // TODO Implement this :) - QUuid getSourceID() const { return QUuid(); } + void readSourceID(); + void readVerificationHash(); + + const QUuid& getSourceID() const { return _sourceID; } + const QByteArray& getVerificationHash() const { return _verificationHash; } + + QByteArray payloadHashWithConnectionUUID(const QUuid& connectionUUID) const; protected: NLPacket(PacketType::Value type, qint64 size); + NLPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); NLPacket(const NLPacket& other); - void setSourceUuid(QUuid sourceUuid); - void setConnectionUuid(QUuid connectionUuid); + void setSourceID(const QUuid& sourceID); + void setVerificationHash(const QByteArray& verificationHash); + + QUuid _sourceID; + QByteArray _verificationHash; }; #endif // hifi_NLPacket_h diff --git a/libraries/networking/src/NetworkPeer.h b/libraries/networking/src/NetworkPeer.h index d2802a1308..1c39ad96e1 100644 --- a/libraries/networking/src/NetworkPeer.h +++ b/libraries/networking/src/NetworkPeer.h @@ -59,8 +59,8 @@ public: quint64 getWakeTimestamp() const { return _wakeTimestamp; } void setWakeTimestamp(quint64 wakeTimestamp) { _wakeTimestamp = wakeTimestamp; } - quint64 getLastHeardMicrostamp() const { return _lastHeardMicrostamp; } - void setLastHeardMicrostamp(quint64 lastHeardMicrostamp) { _lastHeardMicrostamp = lastHeardMicrostamp; } + quint64 getLastHeardMicrostamp() const { return _lastHeardMicrostamp.load(); } + void setLastHeardMicrostamp(quint64 lastHeardMicrostamp) { _lastHeardMicrostamp.store(lastHeardMicrostamp); } QByteArray toByteArray() const; @@ -92,7 +92,7 @@ protected: HifiSockAddr* _activeSocket; quint64 _wakeTimestamp; - quint64 _lastHeardMicrostamp; + std::atomic_ullong _lastHeardMicrostamp; QTimer* _pingTimer = NULL; diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/Packet.cpp index 876cd91962..1b40a704f6 100644 --- a/libraries/networking/src/Packet.cpp +++ b/libraries/networking/src/Packet.cpp @@ -37,6 +37,14 @@ std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { return std::unique_ptr(new Packet(type, size)); } +std::unique_ptr Packet::fromReceivedPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr) { + // Fail with invalid size + Q_ASSERT(size >= 0); + + // allocate memory + return std::unique_ptr(new Packet(std::move(data), size, senderSockAddr)); +} + std::unique_ptr Packet::createCopy(const Packet& other) { return std::unique_ptr(new Packet(other)); } @@ -51,20 +59,34 @@ qint64 Packet::localHeaderSize() const { Packet::Packet(PacketType::Value type, qint64 size) : _type(type), + _version(0), _packetSize(localHeaderSize(_type) + size), _packet(new char(_packetSize)), _payloadStart(_packet.get() + localHeaderSize(_type)), - _capacity(size) { - // Sanity check - Q_ASSERT(size <= maxPayloadSize(type)); + _capacity(size) +{ + // Sanity check + Q_ASSERT(size <= maxPayloadSize(type)); - // copy packet type and version in header - writePacketTypeAndVersion(type); + // copy packet type and version in header + writePacketTypeAndVersion(type); - // Set control bit and sequence number to 0 if necessary - if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { - writeSequenceNumber(0); - } + // Set control bit and sequence number to 0 if necessary + if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { + writeSequenceNumber(0); + } +} + +Packet::Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr) : + _packetSize(size), + _packet(std::move(data)), + _senderSockAddr(senderSockAddr) +{ + _type = readType(); + _version = readVersion(); + _capacity = _packetSize - localHeaderSize(_type); + _sizeUsed = _capacity; + _payloadStart = _packet.get() + (_packetSize - _capacity); } Packet::Packet(const Packet& other) { diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index c52fb88e49..4ad6ffa6f3 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -16,6 +16,7 @@ #include +#include "HifiSockAddr.h" #include "PacketHeaders.h" class Packet : public QIODevice { @@ -24,6 +25,8 @@ public: using SequenceNumber = uint16_t; static std::unique_ptr create(PacketType::Value type, qint64 size = -1); + static std::unique_ptr fromReceivedPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); + // Provided for convenience, try to limit use static std::unique_ptr createCopy(const Packet& other); @@ -43,7 +46,9 @@ public: PacketType::Value getType() const { return _type; } void setType(PacketType::Value type); - + + PacketVersion getVersion() const { return _version; } + qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } @@ -51,9 +56,6 @@ public: HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } - // Header readers - PacketType::Value readType() const; - PacketVersion readVersion() const; SequenceNumber readSequenceNumber() const; bool readIsControlPacket() const; @@ -68,11 +70,16 @@ public: protected: Packet(PacketType::Value type, int64_t size); + Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); Packet(const Packet& other); Packet& operator=(const Packet& other); Packet(Packet&& other); Packet& operator=(Packet&& other); + // Header readers + PacketType::Value readType() const; + PacketVersion readVersion() const; + // QIODevice virtual functions virtual qint64 writeData(const char* data, qint64 maxSize); virtual qint64 readData(char* data, qint64 maxSize); @@ -82,6 +89,7 @@ protected: void writeSequenceNumber(SequenceNumber seqNum); PacketType::Value _type; // Packet type + PacketVersion _version; // Packet version qint64 _packetSize = 0; // Total size of the allocated memory std::unique_ptr _packet; // Allocated memory diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index bea061ae74..03a7260315 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -208,15 +208,6 @@ int sequenceNumberOffsetForPacketType(PacketType::Value packetType) { return numBytesForPacketHeaderGivenPacketType(packetType) - sizeof(PacketSequenceNumber); } -QByteArray hashFromPacketHeader(const QByteArray& packet) { - return packet.mid(hashOffsetForPacketType(packetTypeForPacket(packet)), NUM_BYTES_MD5_HASH); -} - -QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& connectionUUID) { - return QCryptographicHash::hash(packet.mid(numBytesForPacketHeader(packet)) + connectionUUID.toRfc4122(), - QCryptographicHash::Md5); -} - PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType) { if (packetType == PacketType::Unknown) { packetType = packetTypeForPacket(packet); diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 0108e3e03a..2f7eac3a63 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -121,9 +121,6 @@ QUuid uuidFromPacketHeader(const QByteArray& packet); int hashOffsetForPacketType(PacketType::Value packetType); int sequenceNumberOffsetForPacketType(PacketType::Value packetType); -QByteArray hashFromPacketHeader(const QByteArray& packet); -QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& connectionUUID); - // NOTE: The following four methods accept a PacketType::Value which defaults to PacketType::Unknown. // If the caller has already looked at the packet type and can provide it then the methods below won't have to look it up. diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 02f948dc5f..7214915b30 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -13,8 +13,9 @@ #include "PacketReceiver.h" #include "DependencyManager.h" -#include "NLPacket.h" +#include "NetworkLogging.h" #include "NodeList.h" +#include "SharedUtil.h" PacketReceiver::PacketReceiver(QObject* parent) : QObject(parent), @@ -51,18 +52,18 @@ void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* obj qDebug() << "PacketReceiver::registerPacketListener expected a method that takes" << NON_SOURCED_PACKET_LISTENER_PARAMETERS - << "but parameter method takes" << signalMethod.parameterTypes(); + << "but parameter method takes" << slotMethod.parameterTypes(); } else { const QList SOURCED_PACKET_LISTENER_PARAMETERS = QList() - << QMetaObject::normalizedType(("QSharedPointer") - << QMetaObject::normalizedType(("QSharedPointer"); + << QMetaObject::normalizedType("QSharedPointer") + << QMetaObject::normalizedType("QSharedPointer"); parametersMatch = slotMethod.parameterTypes() == SOURCED_PACKET_LISTENER_PARAMETERS; if (!parametersMatch) { qDebug() << "PacketReceiver::registerPacketListener expected a method that takes" << SOURCED_PACKET_LISTENER_PARAMETERS - << "but parameter method takes" << signalMethod.parameterTypes(); + << "but parameter method takes" << slotMethod.parameterTypes(); } } @@ -70,11 +71,37 @@ void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* obj assert(parametersMatch); // add the mapping - _packetListenerMap[type] = ObjectMethodPair(object, slotMethod); + _packetListenerMap[type] = ObjectMethodPair(QPointer(object), slotMethod); _packetListenerLock.unlock(); } +bool PacketReceiver::packetVersionMatch(const NLPacket& packet) { + + if (packet.getVersion() != versionForPacketType(packet.getType()) + && packet.getType() != PacketType::StunResponse) { + + static QMultiMap versionDebugSuppressMap; + + const QUuid& senderID = packet.getSourceID(); + + if (!versionDebugSuppressMap.contains(senderID, packet.getType())) { + + qCDebug(networking) << "Packet version mismatch on" << packet.getType() << "- Sender" + << senderID << "sent" << qPrintable(QString::number(packet.getVersion())) << "but" + << qPrintable(QString::number(versionForPacketType(packet.getType()))) << "expected."; + + emit packetVersionMismatch(packet.getType()); + + versionDebugSuppressMap.insert(senderID, packet.getType()); + } + + return false; + } else { + return true; + } +} + void PacketReceiver::processDatagrams() { //PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), //"PacketReceiver::processDatagrams()"); @@ -83,42 +110,83 @@ void PacketReceiver::processDatagrams() { return; // bail early... we're shutting down. } - static QByteArray incomingPacket; - auto nodeList = DependencyManager::get(); while (DependencyManager::get()->getNodeSocket().hasPendingDatagrams()) { - incomingPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); + // setup a buffer to read the packet into + int packetSizeWithHeader = nodeList->getNodeSocket().pendingDatagramSize(); + std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); + + // setup a HifiSockAddr to read into HifiSockAddr senderSockAddr; - nodeList->readDatagram(incomingPacket, senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); + // pull the datagram + nodeList->getNodeSocket().readDatagram(buffer.get(), packetSizeWithHeader, + senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); + + // setup an NLPacket from the data we just read + auto packet = NLPacket::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, senderSockAddr); + _inPacketCount++; - _inByteCount += incomingPacket.size(); + _inByteCount += packetSizeWithHeader; - if (nodeList->packetVersionAndHashMatch(incomingPacket)) { - PacketType::Value incomingType = packetTypeForPacket(incomingPacket); - - // TODO What do we do about this? - //nodeList->processNodeData(senderSockAddr, incomingPacket); - - _packetListenerLock.lock(); - auto& listener = _packetListenerMap[incomingType]; - _packetListenerLock.unlock(); - - if (_packetListenerMap.contains(incomingType)) { - auto& listener = _packetListenerMap[incomingType]; - //TODO Update packet - QSharedPointer packet; - bool success = QMetaObject::invokeMethod(listener.first, listener.second, - Q_ARG(QSharedPointer, packet), - Q_ARG(HifiSockAddr, senderSockAddr)); - if (!success) { - qDebug() << "Error sending packet " << incomingType << " to listener: " << listener.first->objectName() << "::" << listener.second; + if (packetVersionMatch(*packet)) { + + SharedNodePointer matchingNode; + if (nodeList->packetSourceAndHashMatch(*packet, matchingNode)) { + + if (matchingNode) { + // No matter if this packet is handled or not, we update the timestamp for the last time we heard + // from this sending node + matchingNode->setLastHeardMicrostamp(usecTimestampNow()); } - } else { - qDebug() << "No listener found for packet type: " << incomingType; - } + _packetListenerLock.lock(); + + auto it = _packetListenerMap.find(packet->getType()); + + if (it != _packetListenerMap.end()) { + + auto listener = it.value(); + + if (!listener.first.isNull()) { + + if (matchingNode) { + emit dataReceived(matchingNode->getType(), packet->getSizeWithHeader()); + } else { + emit dataReceived(NodeType::Unassigned, packet->getSizeWithHeader()); + } + + bool success = false; + + if (matchingNode) { + success = listener.second.invoke(listener.first, + Q_ARG(QSharedPointer, QSharedPointer(packet.release()))); + } else { + success = listener.second.invoke(listener.first, + Q_ARG(QSharedPointer, QSharedPointer(packet.release())), + Q_ARG(SharedNodePointer, matchingNode)); + } + + if (!success) { + qDebug() << "Error delivering packet " << nameForPacketType(packet->getType()) << " to listener: " + << listener.first->objectName() << "::" << listener.second.name(); + } + + } else { + // we have a dead listener - remove this mapping from the _packetListenerMap + qDebug() << "Listener for packet type" << nameForPacketType(packet->getType()) + << "has been destroyed - removing mapping."; + _packetListenerMap.erase(it); + } + + _packetListenerLock.unlock(); + + } else { + _packetListenerLock.unlock(); + qDebug() << "No listener found for packet type " << nameForPacketType(packet->getType()); + } + } } } } diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 9e20a381e1..8c03af4b7b 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -14,12 +14,11 @@ #define hifi_PacketReceiver_h #include +#include #include #include -#include - -#include +#include "NLPacket.h" #include "PacketHeaders.h" class PacketReceiver : public QObject { @@ -36,16 +35,23 @@ public: void shutdown() { _isShuttingDown = true; } - bool registerPacketListener(PacketType::Value type, QObject* listener, const char* slot); + void registerPacketListener(PacketType::Value type, QObject* listener, const char* slot); public slots: void processDatagrams(); + +signals: + void dataSent(quint8 channel_type, int bytes); + void dataReceived(quint8 channel_type, int bytes); + void packetVersionMismatch(PacketType::Value type); private: - using ObjectMethodPair = QPair; + bool packetVersionMatch(const NLPacket& packet); + + using ObjectMethodPair = std::pair, QMetaMethod>; QMutex _packetListenerLock; - QMap _packetListenerMap; + QHash _packetListenerMap; int _inPacketCount = 0; int _outPacketCount = 0; int _inByteCount = 0; From e0d165bdd88236ae69566c41f9e5b279f39facb2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 16:48:28 -0700 Subject: [PATCH 296/582] Fix packet type in AssignmentClient for StopNode --- assignment-client/src/AssignmentClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index dda505429d..499ed93c89 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -122,7 +122,7 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri } auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleCreateAssignmentPacket"); - packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleStopNodePacket"); + packetReceiver.registerPacketListener(PacketType::StopNode, this, "handleStopNodePacket"); } From 8c04aafe67e25a4b5094fe051026d5924ecb5abd Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 17:08:07 -0700 Subject: [PATCH 297/582] Update Agent to use PacketReceiver --- assignment-client/src/Agent.cpp | 83 +++++++++++++++++++-------------- assignment-client/src/Agent.h | 2 + 2 files changed, 49 insertions(+), 36 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0576a0d4f0..6166923832 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -48,9 +48,36 @@ Agent::Agent(const QByteArray& packet) : DependencyManager::set(); DependencyManager::set(); - auto& packetReceiver = DependencyManager::get()->getPackingReceiver(); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioPacket"); packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleAudioPacket"); + packetReceiver.registerPacketListener(PacketType::OctreeStats, this, "handleOctreePacket"); + packetReceiver.registerPacketListener(PacketType::EntityData, this, "handleOctreePacket"); + packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleOctreePacket"); + packetReceiver.registerPacketListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); +} + +void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + QByteArray mutablePacket = QByteArray(packet->getData(), packet->getSizeWithHeader()); + int messageLength = mutablePacket.size(); + + auto packetType = packet->getType(); + + if (packetType == PacketType::OctreeStats) { + + int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(mutablePacket, senderNode); + if (messageLength > statsMessageLength) { + mutablePacket = mutablePacket.mid(statsMessageLength); + } else { + return; // bail since no piggyback data + } + + packetType = packetTypeForPacket(mutablePacket); + } // fall through to piggyback message + + if (packetType == PacketType::EntityData || packetType == PacketType::EntityErase) { + _entityViewer.processDatagram(mutablePacket, senderNode); + } } void Agent::readPendingDatagrams() { @@ -76,47 +103,31 @@ void Agent::readPendingDatagrams() { break; } } - - } else if (datagramPacketType == PacketType::OctreeStats - || datagramPacketType == PacketType::EntityData - || datagramPacketType == PacketType::EntityErase - ) { - // Make sure our Node and NodeList knows we've heard from this node. - SharedNodePointer sourceNode = nodeList->sendingNodeForPacket(receivedPacket); - sourceNode->setLastHeardMicrostamp(usecTimestampNow()); - - QByteArray mutablePacket = receivedPacket; - int messageLength = mutablePacket.size(); - - if (datagramPacketType == PacketType::OctreeStats) { - - int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(mutablePacket, sourceNode); - if (messageLength > statsMessageLength) { - mutablePacket = mutablePacket.mid(statsMessageLength); - - // TODO: this needs to be fixed, the goal is to test the packet version for the piggyback, but - // this is testing the version and hash of the original packet - // need to use numBytesArithmeticCodingFromBuffer()... - if (!DependencyManager::get()->packetVersionAndHashMatch(receivedPacket)) { - return; // bail since piggyback data doesn't match our versioning - } - } else { - return; // bail since no piggyback data - } - - datagramPacketType = packetTypeForPacket(mutablePacket); - } // fall through to piggyback message - - if (datagramPacketType == PacketType::EntityData || datagramPacketType == PacketType::EntityErase) { - _entityViewer.processDatagram(mutablePacket, sourceNode); - } } } } } +void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + QByteArray receivedPacket = QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader()); + int headerBytes = numBytesForPacketHeader(receivedPacket); + + auto nodeList = DependencyManager::get(); + SharedNodePointer matchedNode = nodeList->sendingNodeForPacket(receivedPacket); + + if (matchedNode) { + // PacketType_JURISDICTION, first byte is the node type... + switch (receivedPacket[headerBytes]) { + case NodeType::EntityServer: + DependencyManager::get()->getJurisdictionListener()-> + queueReceivedPacket(senderNode, receivedPacket); + break; + } + } +} + void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - _receivedAudioStream.parseData(receivedPacket); + _receivedAudioStream.parseData(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index bee043f6f4..70e1913b54 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -57,6 +57,8 @@ public slots: private slots: void handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); private: ScriptEngine _scriptEngine; From bfb878210f5b430153dcf7a9dc7952de41275bfc Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 17:27:45 -0700 Subject: [PATCH 298/582] Fix compilation errors in AudioMixer --- assignment-client/src/audio/AudioMixer.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index ec9998c881..dc790e99f4 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -544,28 +544,34 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { } void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { + auto nodeList = DependencyManager::get(); if (nodeList->packetVersionAndHashMatch(receivedPacket)) { nodeList->processNodeData(senderSockAddr, receivedPacket); } } void AudioMixer::handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + auto nodeList = DependencyManager::get(); nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); } void AudioMixer::handleMicrophoneAudioWithEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + auto nodeList = DependencyManager::get(); nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); } void AudioMixer::handleInjectAudioPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + auto nodeList = DependencyManager::get(); nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); } void AudioMixer::handleSilentAudioFramePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + auto nodeList = DependencyManager::get(); nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); } void AudioMixer::handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { + auto nodeList = DependencyManager::get(); nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); } @@ -573,14 +579,14 @@ void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, Hi auto nodeList = DependencyManager::get(); SharedNodePointer sendingNode = nodeList->nodeWithUUID(packet->getSourceID()); if (sendingNode->getCanAdjustLocks()) { - auto packet = NLPacket::create(PacketType::MuteEnvironment); + auto newPacket = NLPacket::create(PacketType::MuteEnvironment); // Copy payload - packet->write(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); + newPacket->write(newPacket->getPayload()); nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getType() == NodeType::Agent && node->getActiveSocket() && node->getLinkedData() && node != sendingNode) { - nodeList->sendPacket(std::move(packet), node); + nodeList->sendPacket(std::move(newPacket), node); } }); } From 28f6c4021bc181147039a740b56db8ea5f28fab5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 17:27:56 -0700 Subject: [PATCH 299/582] Fix compilation errors in EntityServer --- assignment-client/src/entities/EntityServer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index c09e068b21..b7e6fe3a29 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -42,19 +42,19 @@ EntityServer::~EntityServer() { void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, packet->getData()); } } void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, packet->getData()); } } void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, packet->getData()); } } From c86e481d4f380c5a0e6964bd3ef00356952d86a7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 17:28:27 -0700 Subject: [PATCH 300/582] Update OctreeServer packet receive handling --- assignment-client/src/octree/OctreeServer.cpp | 38 ++++++++----------- assignment-client/src/octree/OctreeServer.h | 6 +-- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 55d6f0be81..2488c92439 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -248,10 +248,10 @@ OctreeServer::OctreeServer(const QByteArray& packet) : AccountManager::getInstance().setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); - auto packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver->registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); - packetReceiver->registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); - packetReceiver->registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); + packetReceiver.registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); + packetReceiver.registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); } OctreeServer::~OctreeServer() { @@ -860,35 +860,29 @@ void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const H } } -void handleOctreeQueryPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { // If we got a query packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. - SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); - if (matchingNode) { - nodeList->updateNodeWithDataFromPacket(matchingNode, packet->getData()); + auto nodeList = DependencyManager::get(); + nodeList->updateNodeWithDataFromPacket(senderNode, packet->getData()); - OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); - if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - nodeData->initializeOctreeSendThread(this, matchingNode); - } + OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); + if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + nodeData->initializeOctreeSendThread(this, senderNode); } } -void handleOctreeDataNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { // If we got a nack packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. - SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); - if (matchingNode) { - OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); - if (nodeData) { - nodeData->parseNackPacket(packet->getData()); - } + OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); + if (nodeData) { + nodeData->parseNackPacket(packet->getData()); } } -void handleJurisdictionRequestPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); - _jurisdictionSender->queueReceivedPacket(matchingNode, packet->getData()); +void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + _jurisdictionSender->queueReceivedPacket(senderNode, packet->getData()); } void OctreeServer::setupDatagramProcessingThread() { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index d25ef3183b..df36580f57 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -129,9 +129,9 @@ public slots: void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); private slots: - void handleOctreeQueryPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleOctreeDataNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleJurisdictionRequestPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); protected: virtual Octree* createTree() = 0; From d85fbbfb745d790f74de50a013b418b6b4fc453c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 10 Jul 2015 17:45:23 -0700 Subject: [PATCH 301/582] update NodeList for new packet receive code --- domain-server/src/DomainServer.cpp | 10 +- libraries/networking/src/DomainHandler.cpp | 18 +- libraries/networking/src/DomainHandler.h | 5 +- libraries/networking/src/LimitedNodeList.cpp | 25 +- libraries/networking/src/LimitedNodeList.h | 6 +- libraries/networking/src/NodeList.cpp | 249 +++++++------------ libraries/networking/src/NodeList.h | 20 +- libraries/networking/src/PacketHeaders.cpp | 12 +- 8 files changed, 143 insertions(+), 202 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index a77156a8c9..00efd818a5 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -933,15 +933,17 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif // always send the node their own UUID back QDataStream domainListStream(&domainListPackets); - const int NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES = NUM_BYTES_RFC4122_UUID + 2; + const int NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES = NUM_BYTES_RFC4122_UUID + NUM_BYTES_RFC4122_UUID + 2; // setup the extended header for the domain list packets // this data is at the beginning of each of the domain list packets QByteArray extendedHeader(NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES, 0); - extendedHeader.replace(0, NUM_BYTES_RFC4122_UUID, node->getUUID().toRfc4122()); + QDataStream extendedHeaderStream(&extendedHeader, &QIODevice::Append); - extendedHeader[NUM_BYTES_RFC4122_UUID] = (char) node->getCanAdjustLocks(); - extendedHeader[NUM_BYTES_RFC4122_UUID + 1] = (char) node->getCanRez(); + extendedHeaderStream << limitedNodeList->getSessionUUID().toRfc4122(); + extendedHeaderStream << node->getUUID().toRfc4122(); + extendedHeaderStream << (quint8) node->getCanAdjustLocks(); + extendedHeaderStream << (quint8) node->getCanRez(); domainListPackets.setExtendedHeader(extendedHeader); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 38d1ade2ad..6d76e09028 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -281,12 +281,10 @@ void DomainHandler::settingsRequestFinished() { settingsReply->deleteLater(); } -void DomainHandler::parseDTLSRequirementPacket(const QByteArray& dtlsRequirementPacket) { +void DomainHandler::processDTLSRequirementPacket(QSharedPointer dtlsRequirementPacket) { // figure out the port that the DS wants us to use for us to talk to them with DTLS - int numBytesPacketHeader = numBytesForPacketHeader(dtlsRequirementPacket); - - unsigned short dtlsPort = 0; - memcpy(&dtlsPort, dtlsRequirementPacket.data() + numBytesPacketHeader, sizeof(dtlsPort)); + unsigned short dtlsPort; + dtlsRequirementPacket->readPrimitive(&dtlsPort); qCDebug(networking) << "domain-server DTLS port changed to" << dtlsPort << "- Enabling DTLS."; @@ -295,9 +293,13 @@ void DomainHandler::parseDTLSRequirementPacket(const QByteArray& dtlsRequirement // initializeDTLSSession(); } -void DomainHandler::processICEResponsePacket(const QByteArray& icePacket) { - QDataStream iceResponseStream(icePacket); - iceResponseStream.skipRawData(numBytesForPacketHeader(icePacket)); +void DomainHandler::processICEResponsePacket(QSharedPointer icePacket) { + if (!_icePeer.hasSockets()) { + // bail on processing this packet if our ice peer doesn't have sockets + return; + } + + QDataStream iceResponseStream(icePacket.data()); iceResponseStream >> _icePeer; diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 0c1698f5ec..716138a4f1 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -21,6 +21,7 @@ #include "HifiSockAddr.h" #include "NetworkPeer.h" +#include "NLPacket.h" const unsigned short DEFAULT_DOMAIN_SERVER_PORT = 40102; const unsigned short DEFAULT_DOMAIN_SERVER_DTLS_PORT = 40103; @@ -69,8 +70,8 @@ public: void requestDomainSettings(); const QJsonObject& getSettingsObject() const { return _settingsObject; } - void parseDTLSRequirementPacket(const QByteArray& dtlsRequirementPacket); - void processICEResponsePacket(const QByteArray& icePacket); + void processDTLSRequirementPacket(QSharedPointer dtlsRequirementPacket); + void processICEResponsePacket(QSharedPointer icePacket); void setPendingPath(const QString& pendingPath) { _pendingPath = pendingPath; } const QString& getPendingPath() { return _pendingPath; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 962f8dbc30..764a9eed7e 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -369,9 +369,8 @@ std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingTy return pingPacket; } -std::unique_ptr LimitedNodeList::constructPingReplyPacket(const QByteArray& pingPacket) { - QDataStream pingPacketStream(pingPacket); - pingPacketStream.skipRawData(numBytesForPacketHeader(pingPacket)); +std::unique_ptr LimitedNodeList::constructPingReplyPacket(QSharedPointer pingPacket) { + QDataStream pingPacketStream(pingPacket.data()); PingType_t typeFromOriginalPing; pingPacketStream >> typeFromOriginalPing; @@ -400,11 +399,11 @@ std::unique_ptr LimitedNodeList::constructICEPingPacket(PingType_t pin return icePingPacket; } -std::unique_ptr LimitedNodeList::constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID) { +std::unique_ptr LimitedNodeList::constructICEPingReplyPacket(QSharedPointer pingPacket, const QUuid& iceID) { // pull out the ping type so we can reply back with that PingType_t pingType; - memcpy(&pingType, pingPacket.data() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); + memcpy(&pingType, pingPacket->getPayload() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); auto icePingReplyPacket = NLPacket::create(PacketType::ICEPingReply, packetSize); @@ -514,7 +513,7 @@ void LimitedNodeList::rebindNodeSocket() { _nodeSocket.bind(QHostAddress::AnyIPv4, oldPort); } -bool LimitedNodeList::processSTUNResponse(const QByteArray& packet) { +bool LimitedNodeList::processSTUNResponse(QSharedPointer packet) { // check the cookie to make sure this is actually a STUN response // and read the first attribute and make sure it is a XOR_MAPPED_ADDRESS const int NUM_BYTES_MESSAGE_TYPE_AND_LENGTH = 4; @@ -524,13 +523,13 @@ bool LimitedNodeList::processSTUNResponse(const QByteArray& packet) { int attributeStartIndex = NUM_BYTES_STUN_HEADER; - if (memcmp(packet.data() + NUM_BYTES_MESSAGE_TYPE_AND_LENGTH, + if (memcmp(packet->getData() + NUM_BYTES_MESSAGE_TYPE_AND_LENGTH, &RFC_5389_MAGIC_COOKIE_NETWORK_ORDER, sizeof(RFC_5389_MAGIC_COOKIE_NETWORK_ORDER)) == 0) { // enumerate the attributes to find XOR_MAPPED_ADDRESS_TYPE - while (attributeStartIndex < packet.size()) { - if (memcmp(packet.data() + attributeStartIndex, &XOR_MAPPED_ADDRESS_TYPE, sizeof(XOR_MAPPED_ADDRESS_TYPE)) == 0) { + while (attributeStartIndex < packet->getSizeWithHeader()) { + if (memcmp(packet->getData() + attributeStartIndex, &XOR_MAPPED_ADDRESS_TYPE, sizeof(XOR_MAPPED_ADDRESS_TYPE)) == 0) { const int NUM_BYTES_STUN_ATTR_TYPE_AND_LENGTH = 4; const int NUM_BYTES_FAMILY_ALIGN = 1; const uint8_t IPV4_FAMILY_NETWORK_ORDER = htons(0x01) >> 8; @@ -538,14 +537,14 @@ bool LimitedNodeList::processSTUNResponse(const QByteArray& packet) { int byteIndex = attributeStartIndex + NUM_BYTES_STUN_ATTR_TYPE_AND_LENGTH + NUM_BYTES_FAMILY_ALIGN; uint8_t addressFamily = 0; - memcpy(&addressFamily, packet.data() + byteIndex, sizeof(addressFamily)); + memcpy(&addressFamily, packet->getData() + byteIndex, sizeof(addressFamily)); byteIndex += sizeof(addressFamily); if (addressFamily == IPV4_FAMILY_NETWORK_ORDER) { // grab the X-Port uint16_t xorMappedPort = 0; - memcpy(&xorMappedPort, packet.data() + byteIndex, sizeof(xorMappedPort)); + memcpy(&xorMappedPort, packet->getData() + byteIndex, sizeof(xorMappedPort)); uint16_t newPublicPort = ntohs(xorMappedPort) ^ (ntohl(RFC_5389_MAGIC_COOKIE_NETWORK_ORDER) >> 16); @@ -553,7 +552,7 @@ bool LimitedNodeList::processSTUNResponse(const QByteArray& packet) { // grab the X-Address uint32_t xorMappedAddress = 0; - memcpy(&xorMappedAddress, packet.data() + byteIndex, sizeof(xorMappedAddress)); + memcpy(&xorMappedAddress, packet->getData() + byteIndex, sizeof(xorMappedAddress)); uint32_t stunAddress = ntohl(xorMappedAddress) ^ ntohl(RFC_5389_MAGIC_COOKIE_NETWORK_ORDER); @@ -583,7 +582,7 @@ bool LimitedNodeList::processSTUNResponse(const QByteArray& packet) { const int NUM_BYTES_ATTRIBUTE_TYPE = 2; uint16_t attributeLength = 0; - memcpy(&attributeLength, packet.data() + attributeStartIndex + NUM_BYTES_ATTRIBUTE_TYPE, + memcpy(&attributeLength, packet->getData() + attributeStartIndex + NUM_BYTES_ATTRIBUTE_TYPE, sizeof(attributeLength)); attributeLength = ntohs(attributeLength); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index b2dd95f71c..f48f2aaa31 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -169,12 +169,12 @@ public: void resetPacketStats(); std::unique_ptr constructPingPacket(PingType_t pingType = PingType::Agnostic); - std::unique_ptr constructPingReplyPacket(const QByteArray& pingPacket); + std::unique_ptr constructPingReplyPacket(QSharedPointer pingPacket); std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUuid& iceID); - std::unique_ptr constructICEPingReplyPacket(const QByteArray& pingPacket, const QUuid& iceID); + std::unique_ptr constructICEPingReplyPacket(QSharedPointer pingPacket, const QUuid& iceID); - virtual bool processSTUNResponse(const QByteArray& packet); + virtual bool processSTUNResponse(QSharedPointer packet); void sendHeartbeatToIceServer(const HifiSockAddr& iceServerSockAddr); void sendPeerQueryToIceServer(const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerID); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 61c8e90b0d..8d897e82b5 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -92,16 +92,16 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned startSTUNPublicSocketUpdate(); auto& packetReceiver = getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::DomainList, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::DomainServerAddedNode, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::DomainServerRequireDTLS, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::ICEServerPeerInformation, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::Ping, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::PingReply, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::ICEPing, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::ICEPingReply, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::StunResponse, this, "processReceivedPacket"); - packetReceiver.registerPacketListener(PacketType::DomainServerPathResponse, this, "processReceivedPacket"); + packetReceiver.registerPacketListener(PacketType::DomainList, this, "processDomainServerList"); + packetReceiver.registerPacketListener(PacketType::DomainServerAddedNode, this, "processDomainServerAddedNode"); + packetReceiver.registerPacketListener(PacketType::DomainServerRequireDTLS, &_domainHandler, "processDTLSRequirementPacket"); + packetReceiver.registerPacketListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathQueryResponse"); + packetReceiver.registerPacketListener(PacketType::ICEServerPeerInformation, &_domainHandler, "processICEResponsePacket"); + packetReceiver.registerPacketListener(PacketType::Ping, this, "processPingPacket"); + packetReceiver.registerPacketListener(PacketType::PingReply, this, "processPingReplyPacket"); + packetReceiver.registerPacketListener(PacketType::ICEPing, this, "processICEPingPacket"); + packetReceiver.registerPacketListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); + packetReceiver.registerPacketListener(PacketType::StunResponse, this, "processSTUNResponse"); } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { @@ -128,9 +128,8 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) { return sendStats(statsObject, _domainHandler.getSockAddr()); } -void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode) { - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); +void NodeList::timePingReply(QSharedPointer packet, const SharedNodePointer& sendingNode) { + QDataStream packetStream(packet.data()); quint8 pingType; quint64 ourOriginalTime, othersReplyTime; @@ -164,108 +163,52 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& } } -// TODO: Break this out into individual packet types -void NodeList::processReceivedPacket(std::unique_ptr, HifiSockAddr senderSockAddr) { - qDebug() << "Got packet!"; +void NodeList::processPingPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + // send back a reply + auto replyPacket = constructPingReplyPacket(packet); + const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); + sendPacket(std::move(replyPacket), sendingNode, senderSockAddr); + + // If we don't have a symmetric socket for this node and this socket doesn't match + // what we have for public and local then set it as the symmetric. + // This allows a server on a reachable port to communicate with nodes on symmetric NATs + if (sendingNode->getSymmetricSocket().isNull()) { + if (senderSockAddr != sendingNode->getLocalSocket() && senderSockAddr != sendingNode->getPublicSocket()) { + sendingNode->setSymmetricSocket(senderSockAddr); + } + } } -void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) { - PacketType::Value packetType = packetTypeForPacket(packet); - switch (packetType) { - case PacketType::DomainList: - case PacketType::DomainServerAddedNode: { - if (!_domainHandler.getSockAddr().isNull()) { - // only process a packet from domain-server if we're talking to a domain - // TODO: how do we make sure this is actually the domain we want the list from (DTLS probably) - if (packetType == PacketType::DomainList) { - processDomainServerList(packet); - } else if (packetType == PacketType::DomainServerAddedNode) { - processDomainServerAddedNode(packet); - } - } - break; - } - case PacketType::DomainServerRequireDTLS: { - _domainHandler.parseDTLSRequirementPacket(packet); - break; - } - case PacketType::ICEServerPeerInformation: { - if (!_domainHandler.getICEPeer().hasSockets()) { - _domainHandler.processICEResponsePacket(packet); - } - break; - } - case PacketType::Ping: { - // send back a reply - SharedNodePointer matchingNode = sendingNodeForPacket(packet); - if (matchingNode) { - matchingNode->setLastHeardMicrostamp(usecTimestampNow()); - auto replyPacket = constructPingReplyPacket(packet); - sendPacket(std::move(replyPacket), matchingNode, senderSockAddr); +void NodeList::processPingReplyPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + // activate the appropriate socket for this node, if not yet updated + activateSocketFromNodeCommunication(packet, sendingNode); - // If we don't have a symmetric socket for this node and this socket doesn't match - // what we have for public and local then set it as the symmetric. - // This allows a server on a reachable port to communicate with nodes on symmetric NATs - if (matchingNode->getSymmetricSocket().isNull()) { - if (senderSockAddr != matchingNode->getLocalSocket() && senderSockAddr != matchingNode->getPublicSocket()) { - matchingNode->setSymmetricSocket(senderSockAddr); - } - } - } + // set the ping time for this node for stat collection + timePingReply(packet, sendingNode); +} - break; +void NodeList::processICEPingPacket(QSharedPointer packet) { + // send back a reply + auto replyPacket = constructICEPingReplyPacket(packet, _domainHandler.getICEClientID()); + sendPacket(std::move(replyPacket), packet->getSenderSockAddr()); +} + +void NodeList::processICEPingReplyPacket(QSharedPointer packet) { + const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); + qCDebug(networking) << "Received reply from domain-server on" << senderSockAddr; + + if (_domainHandler.getIP().isNull()) { + // for now we're unsafely assuming this came back from the domain + if (senderSockAddr == _domainHandler.getICEPeer().getLocalSocket()) { + qCDebug(networking) << "Connecting to domain using local socket"; + _domainHandler.activateICELocalSocket(); + } else if (senderSockAddr == _domainHandler.getICEPeer().getPublicSocket()) { + qCDebug(networking) << "Conecting to domain using public socket"; + _domainHandler.activateICEPublicSocket(); + } else { + qCDebug(networking) << "Reply does not match either local or public socket for domain. Will not connect."; } - case PacketType::PingReply: { - SharedNodePointer sendingNode = sendingNodeForPacket(packet); - if (sendingNode) { - sendingNode->setLastHeardMicrostamp(usecTimestampNow()); - - // activate the appropriate socket for this node, if not yet updated - activateSocketFromNodeCommunication(packet, sendingNode); - - // set the ping time for this node for stat collection - timePingReply(packet, sendingNode); - } - - break; - } - case PacketType::ICEPing: { - // send back a reply - auto replyPacket = constructICEPingReplyPacket(packet, _domainHandler.getICEClientID()); - sendPacket(std::move(replyPacket), senderSockAddr); - break; - } - case PacketType::ICEPingReply: { - qCDebug(networking) << "Received reply from domain-server on" << senderSockAddr; - - if (_domainHandler.getIP().isNull()) { - // for now we're unsafely assuming this came back from the domain - if (senderSockAddr == _domainHandler.getICEPeer().getLocalSocket()) { - qCDebug(networking) << "Connecting to domain using local socket"; - _domainHandler.activateICELocalSocket(); - } else if (senderSockAddr == _domainHandler.getICEPeer().getPublicSocket()) { - qCDebug(networking) << "Conecting to domain using public socket"; - _domainHandler.activateICEPublicSocket(); - } else { - qCDebug(networking) << "Reply does not match either local or public socket for domain. Will not connect."; - } - - } - } - case PacketType::StunResponse: { - // a STUN packet begins with 00, we've checked the second zero with packetVersionMatch - // pass it along so it can be processed into our public address and port - processSTUNResponse(packet); - break; - } - case PacketType::DomainServerPathResponse: { - handleDSPathQueryResponse(packet); - break; - } - default: - LimitedNodeList::processNodeData(senderSockAddr, packet); - break; } } @@ -436,43 +379,30 @@ void NodeList::sendDSPathQuery(const QString& newPath) { } } -void NodeList::handleDSPathQueryResponse(const QByteArray& packet) { +void NodeList::processDomainServerPathQueryResponse(QSharedPointer packet) { // This is a response to a path query we theoretically made. // In the future we may want to check that this was actually from our DS and for a query we actually made. - int numHeaderBytes = numBytesForPacketHeaderGivenPacketType(PacketType::DomainServerPathResponse); - const char* startPosition = packet.data() + numHeaderBytes; - const char* currentPosition = startPosition; - // figure out how many bytes the path query is qint16 numPathBytes; - memcpy(&numPathBytes, currentPosition, sizeof(numPathBytes)); - currentPosition += sizeof(numPathBytes); + packet->readPrimitive(&numPathBytes); - // make sure it is safe to pull the path - if (numPathBytes <= packet.size() - numHeaderBytes - (currentPosition - startPosition)) { - // pull the path from the packet - QString pathQuery = QString::fromUtf8(currentPosition, numPathBytes); - currentPosition += numPathBytes; + // pull the path from the packet + QString pathQuery = QString::fromUtf8(packet->read(numPathBytes)); - // figure out how many bytes the viewpoint is - qint16 numViewpointBytes; - memcpy(&numViewpointBytes, currentPosition, sizeof(numViewpointBytes)); - currentPosition += sizeof(numViewpointBytes); + // figure out how many bytes the viewpoint is + qint16 numViewpointBytes; + packet->readPrimitive(&numViewpointBytes); - // make sure it is safe to pull the viewpoint - if (numViewpointBytes <= packet.size() - numHeaderBytes - (currentPosition - startPosition)) { - // pull the viewpoint from the packet - QString viewpoint = QString::fromUtf8(currentPosition, numViewpointBytes); + // pull the viewpoint from the packet + QString viewpoint = QString::fromUtf8(packet->read(numViewpointBytes)); - // Hand it off to the AddressManager so it can handle it as a relative viewpoint - if (DependencyManager::get()->goToViewpointForPath(viewpoint, pathQuery)) { - qCDebug(networking) << "Going to viewpoint" << viewpoint << "which was the lookup result for path" << pathQuery; - } else { - qCDebug(networking) << "Could not go to viewpoint" << viewpoint - << "which was the lookup result for path" << pathQuery; - } - } + // Hand it off to the AddressManager so it can handle it as a relative viewpoint + if (DependencyManager::get()->goToViewpointForPath(viewpoint, pathQuery)) { + qCDebug(networking) << "Going to viewpoint" << viewpoint << "which was the lookup result for path" << pathQuery; + } else { + qCDebug(networking) << "Could not go to viewpoint" << viewpoint + << "which was the lookup result for path" << pathQuery; } } @@ -527,49 +457,51 @@ void NodeList::pingPunchForDomainServer() { } } -int NodeList::processDomainServerList(const QByteArray& packet) { +void NodeList::processDomainServerList(QSharedPointer packet) { + if (_domainHandler.getSockAddr().isNull()) { + // refuse to process this packet if we aren't currently connected to the DS + return; + } + // this is a packet from the domain server, reset the count of un-replied check-ins _numNoReplyDomainCheckIns = 0; DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveDSList); + QDataStream packetStream(packet.data()); + + // grab the domain's ID from the beginning of the packet + QUuid domainUUID; + packetStream >> domainUUID; + // if this was the first domain-server list from this domain, we've now connected if (!_domainHandler.isConnected()) { - _domainHandler.setUUID(uuidFromPacketHeader(packet)); + _domainHandler.setUUID(domainUUID); _domainHandler.setIsConnected(true); } - int readNodes = 0; - - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); - // pull our owner UUID from the packet, it's always the first thing QUuid newUUID; packetStream >> newUUID; setSessionUUID(newUUID); - // TODO: when fixing this read these are actually chars now, not bools - bool thisNodeCanAdjustLocks; + quint8 thisNodeCanAdjustLocks; packetStream >> thisNodeCanAdjustLocks; - setThisNodeCanAdjustLocks(thisNodeCanAdjustLocks); + setThisNodeCanAdjustLocks((bool) thisNodeCanAdjustLocks); - bool thisNodeCanRez; + quint8 thisNodeCanRez; packetStream >> thisNodeCanRez; - setThisNodeCanRez(thisNodeCanRez); + setThisNodeCanRez((bool) thisNodeCanRez); // pull each node in the packet - while (packetStream.device()->pos() < packet.size()) { + while (packetStream.device()->pos() < packet->getSizeUsed()) { parseNodeFromPacketStream(packetStream); } - - return readNodes; } -void NodeList::processDomainServerAddedNode(const QByteArray& packet) { - // setup a QDataStream, skip the header - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); +void NodeList::processDomainServerAddedNode(QSharedPointer packet) { + // setup a QDataStream + QDataStream packetStream(packet.data()); // use our shared method to pull out the new node parseNodeFromPacketStream(packetStream); @@ -663,10 +595,9 @@ void NodeList::handleNodePingTimeout() { } } -void NodeList::activateSocketFromNodeCommunication(const QByteArray& packet, const SharedNodePointer& sendingNode) { +void NodeList::activateSocketFromNodeCommunication(QSharedPointer packet, const SharedNodePointer& sendingNode) { // deconstruct this ping packet to see if it is a public or local reply - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); + QDataStream packetStream(packet.data()); quint8 pingType; packetStream >> pingType; diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 6ac08fcbd9..4749f9c5ce 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -71,6 +71,16 @@ public slots: void reset(); void sendDomainServerCheckIn(); void handleDSPathQuery(const QString& newPath); + + void processDomainServerList(QSharedPointer packet); + void processDomainServerAddedNode(QSharedPointer packet); + void processDomainServerPathQueryResponse(QSharedPointer packet); + + void processPingPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void processPingReplyPacket(QSharedPointer packet, SharedNodePointer sendingNode); + + void processICEPingPacket(QSharedPointer packet); + void processICEPingReplyPacket(QSharedPointer packet); signals: void limitOfSilentDomainCheckInsReached(); private slots: @@ -89,15 +99,11 @@ private: void processDomainServerAuthRequest(const QByteArray& packet); void requestAuthForDomainServer(); - void activateSocketFromNodeCommunication(const QByteArray& packet, const SharedNodePointer& sendingNode); - void timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode); - - void handleDSPathQueryResponse(const QByteArray& packet); + void activateSocketFromNodeCommunication(QSharedPointer packet, const SharedNodePointer& sendingNode); + void timePingReply(QSharedPointer packet, const SharedNodePointer& sendingNode); void sendDSPathQuery(const QString& newPath); - - int processDomainServerList(const QByteArray& packet); - void processDomainServerAddedNode(const QByteArray& packet); + void parseNodeFromPacketStream(QDataStream& packetStream); void pingPunchForInactiveNode(const SharedNodePointer& node); diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 03a7260315..f6001711c0 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -18,21 +18,21 @@ using namespace PacketType; const QSet NON_VERIFIED_PACKETS = QSet() - << DomainServerRequireDTLS << DomainConnectRequest - << DomainList << DomainListRequest << DomainConnectionDenied << CreateAssignment << RequestAssignment << StunResponse << NodeJsonStats << EntityQuery << OctreeDataNack << EntityEditNack << Ping - << PingReply << StopNode - << DomainServerPathQuery << DomainServerPathResponse - << DomainServerAddedNode; + << PingReply << StopNode; const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; const QSet NON_SOURCED_PACKETS = QSet() + << DomainServerRequireDTLS << DomainConnectRequest + << DomainList << DomainListRequest << DomainConnectionDenied + << DomainServerPathQuery << DomainServerPathResponse + << DomainServerAddedNode << ICEServerPeerInformation << ICEServerQuery << ICEServerHeartbeat - << ICEPing << ICEPingReply << DomainConnectRequest; + << ICEPing << ICEPingReply; int arithmeticCodingValueFromBuffer(const char* checkValue) { if (((uchar) *checkValue) < 255) { From 9ee62a8a383bcd80599462ab52ad275e265c0cf0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 10 Jul 2015 17:52:51 -0700 Subject: [PATCH 302/582] fix for connection denied packet in Application --- interface/src/Application.cpp | 19 ++++++++----------- interface/src/Application.h | 3 +-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 98d9325403..4698ff4993 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3815,16 +3815,8 @@ void Application::domainChanged(const QString& domainHostname) { _domainConnectionRefusals.clear(); } -void Application::domainConnectionDenied(const QString& reason) { - if (!_domainConnectionRefusals.contains(reason)) { - _domainConnectionRefusals.append(reason); - emit domainConnectionRefused(reason); - } -} - -void Application::handleDomainConnectionDeniedPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::DomainConnectionDenied); - QDataStream packetStream(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); +void Application::handleDomainConnectionDeniedPacket(QSharedPointer packet, SharedNodePointer senderNode) { + QDataStream packetStream(packet.data()); QString reason; packetStream >> reason; @@ -3833,7 +3825,12 @@ void Application::handleDomainConnectionDeniedPacket(QSharedPointer pa // and check and signal for an access token so that we can make sure they are logged in qCDebug(interfaceapp) << "The domain-server denied a connection request: " << reason; qCDebug(interfaceapp) << "You may need to re-log to generate a keypair so you can provide a username signature."; - domainConnectionDenied(reason); + + if (!_domainConnectionRefusals.contains(reason)) { + _domainConnectionRefusals.append(reason); + emit domainConnectionRefused(reason); + } + AccountManager::getInstance().checkAndSignalForAccessToken(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index c3f31a107c..ae3661579b 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -443,8 +443,7 @@ public slots: void notifyPacketVersionMismatch(); - void domainConnectionDenied(const QString& reason); - void handleDomainConnectionDeniedPacket(QSharedPointer, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleDomainConnectionDeniedPacket(QSharedPointer, SharedNodePointer senderNode); void cameraMenuChanged(); From ffcd8e1613c5e691d8b2f8778fd31c0a0935594d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 10 Jul 2015 17:54:07 -0700 Subject: [PATCH 303/582] update connection for packet version mismatch --- interface/src/Application.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4698ff4993..64ef4ef743 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -462,7 +462,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : connect(nodeList.data(), &NodeList::uuidChanged, _myAvatar, &MyAvatar::setSessionUUID); connect(nodeList.data(), &NodeList::uuidChanged, this, &Application::setSessionUUID); connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); - connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); + connect(&nodeList->getPacketReceiver(), &PacketReceiver::packetVersionMismatch, + this, &Application::notifyPacketVersionMismatch); // connect to appropriate slots on AccountManager AccountManager& accountManager = AccountManager::getInstance(); From ed3b8afbd9f044e4d781241b41aaeec6df1fd54c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 10 Jul 2015 18:09:08 -0700 Subject: [PATCH 304/582] Update AssignmentClientMonitor to use PacketReceiver --- .../src/AssignmentClientMonitor.cpp | 84 +++++++------------ .../src/AssignmentClientMonitor.h | 3 +- 2 files changed, 32 insertions(+), 55 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 6796c122dc..954cf84df9 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -53,7 +53,9 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto addressManager = DependencyManager::set(); auto nodeList = DependencyManager::set(); - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClientMonitor::readPendingDatagrams); + auto packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); + packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { @@ -201,63 +203,37 @@ void AssignmentClientMonitor::checkSpares() { } } +void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode) { + // update our records about how to reach this child + senderNode->setLocalSocket(senderSockAddr); -void AssignmentClientMonitor::readPendingDatagrams() { - auto nodeList = DependencyManager::get(); + QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload()); + QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); - QByteArray receivedPacket; - HifiSockAddr senderSockAddr; + // get child's assignment type out of the decoded json + QString childType = unpackedStatsJSON["assignment_type"].toString(); + AssignmentClientChildData *childData = + static_cast(matchingNode->getLinkedData()); + childData->setChildType(childType); + // note when this child talked + matchingNode->setLastHeardMicrostamp(usecTimestampNow()); +} - while (nodeList->getNodeSocket().hasPendingDatagrams()) { - receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); - nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); +void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode) { + // The parent only expects to be talking with prorams running on this same machine. + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || + senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { + if (!packetUUID.isNull()) { + matchingNode = DependencyManager::get()->addOrUpdateNode + (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); + AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); + matchingNode->setLinkedData(childData); + } else { + // tell unknown assignment-client child to exit. + qDebug() << "asking unknown child to exit."; - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - if (packetTypeForPacket(receivedPacket) == PacketType::NodeJsonStats) { - QUuid packetUUID = uuidFromPacketHeader(receivedPacket); - SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); - if (!matchingNode) { - // The parent only expects to be talking with prorams running on this same machine. - if (senderSockAddr.getAddress() == QHostAddress::LocalHost || - senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - if (!packetUUID.isNull()) { - matchingNode = DependencyManager::get()->addOrUpdateNode - (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); - AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); - matchingNode->setLinkedData(childData); - } else { - // tell unknown assignment-client child to exit. - qDebug() << "asking unknown child to exit."; - - auto diePacket = NLPacket::create(PacketType::StopNode, 0); - nodeList->sendPacket(std::move(diePacket), senderSockAddr); - } - } - } - - if (matchingNode) { - // update our records about how to reach this child - matchingNode->setLocalSocket(senderSockAddr); - - QVariantMap packetVariantMap = - JSONBreakableMarshal::fromStringBuffer(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); - QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); - - // get child's assignment type out of the decoded json - QString childType = unpackedStatsJSON["assignment_type"].toString(); - AssignmentClientChildData *childData = - static_cast(matchingNode->getLinkedData()); - childData->setChildType(childType); - // note when this child talked - matchingNode->setLastHeardMicrostamp(usecTimestampNow()); - } - } else { - // have the NodeList attempt to handle it - nodeList->processNodeData(senderSockAddr, receivedPacket); - } + auto diePacket = NLPacket::create(PacketType::StopNode, 0); + nodeList->sendPacket(std::move(diePacket), senderSockAddr); } } } - - diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index f05ed3e661..0c2b958f5c 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -35,9 +35,10 @@ public: void stopChildProcesses(); private slots: - void readPendingDatagrams(); void checkSpares(); void childProcessFinished(); + void handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode); public slots: void aboutToQuit(); From 879b880254f235d42687a397a9b0679de2b3a182 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 08:30:13 -0700 Subject: [PATCH 305/582] Fix non-ref var to PacketReceiver --- assignment-client/src/AssignmentClientMonitor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 954cf84df9..4d892923e4 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -53,7 +53,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto addressManager = DependencyManager::set(); auto nodeList = DependencyManager::set(); - auto packetReceiver = DependencyManager::get()->getPacketReceiver(); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); From 582de1491736a68a02ab7d6751fbaf1ded53385d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 09:25:57 -0700 Subject: [PATCH 306/582] Fix compilation errors in AssignmentClientMonitor --- .../src/AssignmentClientMonitor.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 4d892923e4..5498322f58 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -54,8 +54,8 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto nodeList = DependencyManager::set(); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); - packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); + packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); + packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { @@ -204,6 +204,8 @@ void AssignmentClientMonitor::checkSpares() { } void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode) { + auto senderSockAddr = packet->getSenderSockAddr(); + // update our records about how to reach this child senderNode->setLocalSocket(senderSockAddr); @@ -213,26 +215,30 @@ void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer // get child's assignment type out of the decoded json QString childType = unpackedStatsJSON["assignment_type"].toString(); AssignmentClientChildData *childData = - static_cast(matchingNode->getLinkedData()); + static_cast(senderNode->getLinkedData()); childData->setChildType(childType); // note when this child talked - matchingNode->setLastHeardMicrostamp(usecTimestampNow()); + senderNode->setLastHeardMicrostamp(usecTimestampNow()); } void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode) { + auto senderSockAddr = packet->getSenderSockAddr(); + // The parent only expects to be talking with prorams running on this same machine. if (senderSockAddr.getAddress() == QHostAddress::LocalHost || senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { + QUuid packetUUID = uuidFromPacketHeader(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); if (!packetUUID.isNull()) { - matchingNode = DependencyManager::get()->addOrUpdateNode + senderNode = DependencyManager::get()->addOrUpdateNode (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); - matchingNode->setLinkedData(childData); + senderNode->setLinkedData(childData); } else { // tell unknown assignment-client child to exit. qDebug() << "asking unknown child to exit."; auto diePacket = NLPacket::create(PacketType::StopNode, 0); + auto nodeList = DependencyManager::get(); nodeList->sendPacket(std::move(diePacket), senderSockAddr); } } From 3d62162812b6a45b49fa6f6a106c0e73d50eec84 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 09:40:26 -0700 Subject: [PATCH 307/582] cleanup octree networking code to use new API --- domain-server/src/DomainServer.cpp | 2 +- interface/src/Application.cpp | 110 +++++++-------- interface/src/Application.h | 2 +- .../src/octree/OctreePacketProcessor.cpp | 82 +++++------- interface/src/octree/OctreePacketProcessor.h | 9 +- libraries/networking/src/NodeList.h | 1 + libraries/networking/src/PacketReceiver.cpp | 6 + libraries/networking/src/PacketReceiver.h | 4 +- .../src/ReceivedPacketProcessor.cpp | 15 +-- .../networking/src/ReceivedPacketProcessor.h | 6 +- libraries/octree/src/JurisdictionListener.cpp | 9 +- libraries/octree/src/JurisdictionListener.h | 2 +- libraries/octree/src/JurisdictionMap.cpp | 40 ++---- libraries/octree/src/JurisdictionMap.h | 4 +- libraries/octree/src/JurisdictionSender.cpp | 14 +- libraries/octree/src/JurisdictionSender.h | 2 +- libraries/octree/src/OctreeHeadlessViewer.cpp | 4 +- libraries/octree/src/OctreeHeadlessViewer.h | 2 +- libraries/octree/src/OctreeSceneStats.cpp | 125 ++++++------------ libraries/octree/src/OctreeSceneStats.h | 4 +- 20 files changed, 186 insertions(+), 257 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 00efd818a5..5e16949688 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -938,7 +938,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif // setup the extended header for the domain list packets // this data is at the beginning of each of the domain list packets QByteArray extendedHeader(NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES, 0); - QDataStream extendedHeaderStream(&extendedHeader, &QIODevice::Append); + QDataStream extendedHeaderStream(&extendedHeader, QIODevice::Append); extendedHeaderStream << limitedNodeList->getSessionUUID().toRfc4122(); extendedHeaderStream << node->getUUID().toRfc4122(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 64ef4ef743..8562e54ad0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3925,70 +3925,70 @@ void Application::trackIncomingOctreePacket(const QByteArray& packet, const Shar } } -int Application::parseOctreeStats(const QByteArray& packet, const SharedNodePointer& sendingNode) { +int Application::processOctreeStats(QSharedPointer packet, SharedNodePointer sendingNode) { // But, also identify the sender, and keep track of the contained jurisdiction root for this server // parse the incoming stats datas stick it in a temporary object for now, while we // determine which server it belongs to - OctreeSceneStats temp; - int statsMessageLength = temp.unpackFromMessage(reinterpret_cast(packet.data()), packet.size()); + int statsMessageLength = 0; - // quick fix for crash... why would voxelServer be NULL? - if (sendingNode) { - QUuid nodeUUID = sendingNode->getUUID(); + const QUuid& nodeUUID = sendingNode->getUUID(); + OctreeSceneStats* octreeStats; - // now that we know the node ID, let's add these stats to the stats for that node... - _octreeSceneStatsLock.lockForWrite(); - if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { - _octreeServerSceneStats[nodeUUID].unpackFromMessage(reinterpret_cast(packet.data()), - packet.size()); - } else { - _octreeServerSceneStats[nodeUUID] = temp; + // now that we know the node ID, let's add these stats to the stats for that node... + _octreeSceneStatsLock.lockForWrite(); + if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { + octreeStats = &_octreeServerSceneStats[nodeUUID]; + statsMessageLength = octreeStats->unpackFromPacket(*packet); + } else { + OctreeSceneStats temp; + statsMessageLength = temp.unpackFromPacket(*packet); + octreeStats = &temp; + } + _octreeSceneStatsLock.unlock(); + + VoxelPositionSize rootDetails; + voxelDetailsForCode(octreeStats->getJurisdictionRoot(), rootDetails); + + // see if this is the first we've heard of this node... + NodeToJurisdictionMap* jurisdiction = NULL; + QString serverType; + if (sendingNode->getType() == NodeType::EntityServer) { + jurisdiction = &_entityServerJurisdictions; + serverType = "Entity"; + } + + jurisdiction->lockForRead(); + if (jurisdiction->find(nodeUUID) == jurisdiction->end()) { + jurisdiction->unlock(); + + qCDebug(interfaceapp, "stats from new %s server... [%f, %f, %f, %f]", + qPrintable(serverType), + (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); + + // Add the jurisditionDetails object to the list of "fade outs" + if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnOctreeServerChanges)) { + OctreeFade fade(OctreeFade::FADE_OUT, NODE_ADDED_RED, NODE_ADDED_GREEN, NODE_ADDED_BLUE); + fade.voxelDetails = rootDetails; + const float slightly_smaller = 0.99f; + fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller; + _octreeFadesLock.lockForWrite(); + _octreeFades.push_back(fade); + _octreeFadesLock.unlock(); } - _octreeSceneStatsLock.unlock(); - - VoxelPositionSize rootDetails; - voxelDetailsForCode(temp.getJurisdictionRoot(), rootDetails); - - // see if this is the first we've heard of this node... - NodeToJurisdictionMap* jurisdiction = NULL; - QString serverType; - if (sendingNode->getType() == NodeType::EntityServer) { - jurisdiction = &_entityServerJurisdictions; - serverType = "Entity"; - } - - jurisdiction->lockForRead(); - if (jurisdiction->find(nodeUUID) == jurisdiction->end()) { - jurisdiction->unlock(); - - qCDebug(interfaceapp, "stats from new %s server... [%f, %f, %f, %f]", - qPrintable(serverType), - (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); - - // Add the jurisditionDetails object to the list of "fade outs" - if (!Menu::getInstance()->isOptionChecked(MenuOption::DontFadeOnOctreeServerChanges)) { - OctreeFade fade(OctreeFade::FADE_OUT, NODE_ADDED_RED, NODE_ADDED_GREEN, NODE_ADDED_BLUE); - fade.voxelDetails = rootDetails; - const float slightly_smaller = 0.99f; - fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller; - _octreeFadesLock.lockForWrite(); - _octreeFades.push_back(fade); - _octreeFadesLock.unlock(); - } - } else { - jurisdiction->unlock(); - } - // store jurisdiction details for later use - // This is bit of fiddling is because JurisdictionMap assumes it is the owner of the values used to construct it - // but OctreeSceneStats thinks it's just returning a reference to its contents. So we need to make a copy of the - // details from the OctreeSceneStats to construct the JurisdictionMap - JurisdictionMap jurisdictionMap; - jurisdictionMap.copyContents(temp.getJurisdictionRoot(), temp.getJurisdictionEndNodes()); - jurisdiction->lockForWrite(); - (*jurisdiction)[nodeUUID] = jurisdictionMap; + } else { jurisdiction->unlock(); } + // store jurisdiction details for later use + // This is bit of fiddling is because JurisdictionMap assumes it is the owner of the values used to construct it + // but OctreeSceneStats thinks it's just returning a reference to its contents. So we need to make a copy of the + // details from the OctreeSceneStats to construct the JurisdictionMap + JurisdictionMap jurisdictionMap; + jurisdictionMap.copyContents(octreeStats->getJurisdictionRoot(), octreeStats->getJurisdictionEndNodes()); + jurisdiction->lockForWrite(); + (*jurisdiction)[nodeUUID] = jurisdictionMap; + jurisdiction->unlock(); + return statsMessageLength; } diff --git a/interface/src/Application.h b/interface/src/Application.h index ae3661579b..dd27080952 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -612,7 +612,7 @@ private: StDev _idleLoopStdev; float _idleLoopMeasuredJitter; - int parseOctreeStats(const QByteArray& packet, const SharedNodePointer& sendingNode); + int processOctreeStats(QSharedPointer packet, SharedNodePointer sendingNode); void trackIncomingOctreePacket(const QByteArray& packet, const SharedNodePointer& sendingNode, bool wasStatsPacket); NodeToJurisdictionMap _entityServerJurisdictions; diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index dba75b0c5f..0595bfbbc2 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -1,4 +1,4 @@ -//Merge branch 'master' of ssh://github.com/highfidelity/hifi into isentropic/ +// // OctreePacketProcessor.cpp // interface/src/octree // @@ -18,54 +18,41 @@ OctreePacketProcessor::OctreePacketProcessor() { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::OctreeStats, this, "handleEntityDataPacket"); - packetReceiver.registerPacketListener(PacketType::EntityData, this, "handleEntityDataPacket"); - packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleEntityErasePacket"); - packetReceiver.registerPacketListener(PacketType::OctreeStats, this, "handleOctreeStatsPacket"); - packetReceiver.registerPacketListener(PacketType::EnvironmentData, this, "handleEnvironmentDataPacket"); + + QSet types { + PacketType::OctreeStats, PacketType::EntityData, + PacketType::EntityErase, PacketType::OctreeStats, PacketType::EnvironmentData + } + + packetReceiver.registerPacketListeners(types, this, "handleOctreePacket"); } -// TODO implement packet processing in PacketType-specific methods -void OctreePacketProcessor::handleEntityDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); +void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { + queueReceivedPacket(senderNode, packet); } -void OctreePacketProcessor::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); -} - -void OctreePacketProcessor::handleOctreeStatsPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); -} - -void OctreePacketProcessor::handleEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - queueReceivedPacket(senderNode, QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); -} - -void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { +void OctreePacketProcessor::processPacket(QSharedPointer packet, SharedNodePointer sendingNode) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "OctreePacketProcessor::processPacket()"); - QByteArray mutablePacket = packet; - const int WAY_BEHIND = 300; if (packetsToProcessCount() > WAY_BEHIND && Application::getInstance()->getLogger()->extraDebugging()) { qDebug("OctreePacketProcessor::processPacket() packets to process=%d", packetsToProcessCount()); } - int messageLength = mutablePacket.size(); + + int messageLength = packet->getSizeUsed(); Application* app = Application::getInstance(); bool wasStatsPacket = false; - - PacketType::Value voxelPacketType = packetTypeForPacket(mutablePacket); + PacketType::Value octreePacketType = packet->getType(); // note: PacketType_OCTREE_STATS can have PacketType_VOXEL_DATA // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first // then process any remaining bytes as if it was another packet - if (voxelPacketType == PacketType::OctreeStats) { - int statsMessageLength = app->parseOctreeStats(mutablePacket, sendingNode); + if (octreePacketType == PacketType::OctreeStats) { + int statsMessageLength = app->processOctreeStats(packet, sendingNode); wasStatsPacket = true; if (messageLength > statsMessageLength) { mutablePacket = mutablePacket.mid(statsMessageLength); @@ -104,29 +91,26 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, app->trackIncomingOctreePacket(mutablePacket, sendingNode, wasStatsPacket); - if (sendingNode) { + switch(voxelPacketType) { + case PacketType::EntityErase: { + if (DependencyManager::get()->shouldRenderEntities()) { + app->_entities.processEraseMessage(mutablePacket, sendingNode); + } + } break; - switch(voxelPacketType) { - case PacketType::EntityErase: { - if (DependencyManager::get()->shouldRenderEntities()) { - app->_entities.processEraseMessage(mutablePacket, sendingNode); - } - } break; + case PacketType::EntityData: { + if (DependencyManager::get()->shouldRenderEntities()) { + app->_entities.processDatagram(mutablePacket, sendingNode); + } + } break; - case PacketType::EntityData: { - if (DependencyManager::get()->shouldRenderEntities()) { - app->_entities.processDatagram(mutablePacket, sendingNode); - } - } break; + case PacketType::EnvironmentData: { + app->_environment.parseData(*sendingNode->getActiveSocket(), mutablePacket); + } break; - case PacketType::EnvironmentData: { - app->_environment.parseData(*sendingNode->getActiveSocket(), mutablePacket); - } break; - - default: { - // nothing to do - } break; - } + default: { + // nothing to do + } break; } } diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 50d68fe713..47ebdc73bc 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -14,7 +14,7 @@ #include -/// Handles processing of incoming voxel packets for the interface application. As with other ReceivedPacketProcessor classes +/// 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 { Q_OBJECT @@ -25,12 +25,9 @@ signals: void packetVersionMismatch(); protected: - virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); + virtual void processPacket(QSharedPointer packet, SharedNodePointer sendingNode); private slots: - void handleEntityDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleOctreeStatsPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode); }; #endif // hifi_OctreePacketProcessor_h diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 4749f9c5ce..6578326f4a 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -38,6 +38,7 @@ const quint64 DOMAIN_SERVER_CHECK_IN_MSECS = 1 * 1000; const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5; using NodePacketPair = std::pair>; +using NodeSharedPacketPair = std::pair>; class Application; class Assignment; diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 7214915b30..f410fe69c3 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -24,6 +24,12 @@ PacketReceiver::PacketReceiver(QObject* parent) : } +void PacketReceiver::registerPacketListeners(const QSet& types, QObject* object, const char* slot) { + foreach(PacketType::Value type, types) { + registerPacketListener(type, object, slot); + } +} + void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* object, const char* slot) { Q_ASSERT(object); diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 9f397c5c41..990d8fc19d 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -17,6 +17,7 @@ #include #include #include +#include #include "NLPacket.h" #include "PacketHeaders.h" @@ -37,7 +38,8 @@ public: void resetCounters() { _inPacketCount = 0; _outPacketCount = 0; _inByteCount = 0; _outByteCount = 0; } void shutdown() { _isShuttingDown = true; } - + + void registerPacketListeners(const QSet& types, QObject* listener, const char* slot); void registerPacketListener(PacketType::Value type, QObject* listener, const char* slot); public slots: diff --git a/libraries/networking/src/ReceivedPacketProcessor.cpp b/libraries/networking/src/ReceivedPacketProcessor.cpp index 826968ae32..15b46cdf8f 100644 --- a/libraries/networking/src/ReceivedPacketProcessor.cpp +++ b/libraries/networking/src/ReceivedPacketProcessor.cpp @@ -24,15 +24,9 @@ void ReceivedPacketProcessor::terminating() { _hasPackets.wakeAll(); } -void ReceivedPacketProcessor::queueReceivedPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { - // Make sure our Node and NodeList knows we've heard from this node. - sendingNode->setLastHeardMicrostamp(usecTimestampNow()); - - // TODO: fix the NodePacketPair once we've figured out receive API - NodePacketPair networkPacket(sendingNode, NLPacket::create(PacketType::OctreeStats)); - +void ReceivedPacketProcessor::queueReceivedPacket(QSharedPointer packet, SharedNodePointer sendingNode) { lock(); - _packets.push_back(std::move(networkPacket)); + _packets.push_back({ sendingNode, packet }); _nodePacketCounts[sendingNode->getUUID()]++; _lastWindowIncomingPackets++; unlock(); @@ -73,13 +67,12 @@ bool ReceivedPacketProcessor::process() { } lock(); - std::list currentPackets; + std::list currentPackets; currentPackets.swap(_packets); unlock(); for(auto& packetPair : currentPackets) { - // TODO: Replace QByteArray() once NLPacket is coming through on receive side - processPacket(packetPair.first, QByteArray()); + processPacket(packetPair.second, packetPair.first); _lastWindowProcessedPackets++; midProcess(); } diff --git a/libraries/networking/src/ReceivedPacketProcessor.h b/libraries/networking/src/ReceivedPacketProcessor.h index a833ca5a8b..db75c9c4d1 100644 --- a/libraries/networking/src/ReceivedPacketProcessor.h +++ b/libraries/networking/src/ReceivedPacketProcessor.h @@ -23,7 +23,7 @@ public: ReceivedPacketProcessor(); /// Add packet from network receive thread to the processing queue. - void queueReceivedPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); + void queueReceivedPacket(QSharedPointer packet, SharedNodePointer sendingNode); /// Are there received packets waiting to be processed bool hasPacketsToProcess() const { return _packets.size() > 0; } @@ -58,7 +58,7 @@ protected: /// Callback for processing of recieved packets. Implement this to process the incoming packets. /// \param SharedNodePointer& sendingNode the node that sent this packet /// \param QByteArray& the packet to be processed - virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) = 0; + virtual void processPacket(QSharedPointer packet, SharedNodePointer sendingNode) = 0; /// Implements generic processing behavior for this thread. virtual bool process(); @@ -76,7 +76,7 @@ protected: virtual void postProcess() { } protected: - std::list _packets; + std::list _packets; QHash _nodePacketCounts; QWaitCondition _hasPackets; diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index d725ce3555..7f4cb2d474 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -56,12 +56,11 @@ bool JurisdictionListener::queueJurisdictionRequest() { return isStillRunning(); } -void JurisdictionListener::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { - if (packetTypeForPacket(packet) == PacketType::Jurisdiction && sendingNode) { - QUuid nodeUUID = sendingNode->getUUID(); +void JurisdictionListener::processPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + if (packet->getType() == PacketType::Jurisdiction && sendingNode) { JurisdictionMap map; - map.unpackFromMessage(reinterpret_cast(packet.data()), packet.size()); - _jurisdictions[nodeUUID] = map; + map.unpackFromPacket(*packet); + _jurisdictions[sendingNode->getUUID()] = map; } } diff --git a/libraries/octree/src/JurisdictionListener.h b/libraries/octree/src/JurisdictionListener.h index 72e4b5faf7..02fce896f5 100644 --- a/libraries/octree/src/JurisdictionListener.h +++ b/libraries/octree/src/JurisdictionListener.h @@ -47,7 +47,7 @@ public slots: protected: /// Callback for processing of received packets. Will process any queued PacketType::_JURISDICTION and update the /// jurisdiction map member variable - virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); + virtual void processPacket(QSharedPointer packet, SharedNodePointer sendingNode); private: NodeToJurisdictionMap _jurisdictions; diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index d6e4ad8003..2a9b43f20a 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -280,7 +280,7 @@ std::unique_ptr JurisdictionMap::packEmptyJurisdictionIntoMessage(Node return std::move(packet); // includes header! } -std::unique_ptr JurisdictionMap::packIntoMessage() { +std::unique_ptr JurisdictionMap::packIntoPacket() { auto packet = NLPacket::create(PacketType::Jurisdiction); // Pack the Node Type in first byte @@ -315,42 +315,28 @@ std::unique_ptr JurisdictionMap::packIntoMessage() { return std::move(packet); } -int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes) { +int JurisdictionMap::unpackFromPacket(NLPacket& packet) { clear(); - const unsigned char* startPosition = sourceBuffer; - - // increment to push past the packet header - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(sourceBuffer)); - sourceBuffer += numBytesPacketHeader; - int remainingBytes = availableBytes - numBytesPacketHeader; - + // read the root jurisdiction int bytes = 0; - memcpy(&bytes, sourceBuffer, sizeof(bytes)); - sourceBuffer += sizeof(bytes); - remainingBytes -= sizeof(bytes); + packet.readPrimitive(&bytes); - if (bytes > 0 && bytes <= remainingBytes) { + if (bytes > 0 && bytes <= packet.bytesAvailable()) { _rootOctalCode = new unsigned char[bytes]; - memcpy(_rootOctalCode, sourceBuffer, bytes); - sourceBuffer += bytes; - remainingBytes -= bytes; + packet.read(reinterpret_cast(_rootOctalCode), bytes); // if and only if there's a root jurisdiction, also include the end nodes int endNodeCount = 0; - memcpy(&endNodeCount, sourceBuffer, sizeof(endNodeCount)); - sourceBuffer += sizeof(endNodeCount); - for (int i=0; i < endNodeCount; i++) { + packet.readPrimitive(&endNodeCount); + + for (int i = 0; i < endNodeCount; i++) { int bytes = 0; - memcpy(&bytes, sourceBuffer, sizeof(bytes)); - sourceBuffer += sizeof(bytes); - remainingBytes -= sizeof(bytes); + packet.readPrimitive(&bytes); - if (bytes <= remainingBytes) { + if (bytes <= packet.bytesAvailable()) { unsigned char* endNodeCode = new unsigned char[bytes]; - memcpy(endNodeCode, sourceBuffer, bytes); - sourceBuffer += bytes; - remainingBytes -= bytes; + packet.read(reinterpret_cast(endNodeCode), bytes); // if the endNodeCode was 0 length then don't add it if (bytes > 0) { @@ -360,5 +346,5 @@ int JurisdictionMap::unpackFromMessage(const unsigned char* sourceBuffer, int av } } - return sourceBuffer - startPosition; // includes header! + return packet.pos(); // excludes header } diff --git a/libraries/octree/src/JurisdictionMap.h b/libraries/octree/src/JurisdictionMap.h index eccaef0a60..49a6f5a166 100644 --- a/libraries/octree/src/JurisdictionMap.h +++ b/libraries/octree/src/JurisdictionMap.h @@ -61,8 +61,8 @@ public: void copyContents(unsigned char* rootCodeIn, const std::vector& endNodesIn); - int unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes); - std::unique_ptr packIntoMessage(); + int unpackFromPacket(NLPacket& packet); + std::unique_ptr packIntoPacket(); /// Available to pack an empty or unknown jurisdiction into a network packet, used when no JurisdictionMap is available static std::unique_ptr packEmptyJurisdictionIntoMessage(NodeType_t type); diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index 1ade2412b8..cc620d87c1 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -28,13 +28,11 @@ JurisdictionSender::JurisdictionSender(JurisdictionMap* map, NodeType_t type) : JurisdictionSender::~JurisdictionSender() { } -void JurisdictionSender::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { - if (packetTypeForPacket(packet) == PacketType::JurisdictionRequest) { - if (sendingNode) { - lockRequestingNodes(); - _nodesRequestingJurisdictions.push(sendingNode->getUUID()); - unlockRequestingNodes(); - } +void JurisdictionSender::processPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + if (packet->getType() == PacketType::JurisdictionRequest) { + lockRequestingNodes(); + _nodesRequestingJurisdictions.push(sendingNode->getUUID()); + unlockRequestingNodes(); } } @@ -43,7 +41,7 @@ bool JurisdictionSender::process() { // call our ReceivedPacketProcessor base class process so we'll get any pending packets if (continueProcessing && (continueProcessing = ReceivedPacketProcessor::process())) { - auto packet = (_jurisdictionMap) ? _jurisdictionMap->packIntoMessage() + auto packet = (_jurisdictionMap) ? _jurisdictionMap->packIntoPacket() : JurisdictionMap::packEmptyJurisdictionIntoMessage(getNodeType()); int nodeCount = 0; diff --git a/libraries/octree/src/JurisdictionSender.h b/libraries/octree/src/JurisdictionSender.h index bc40f92a2c..a9b6fb03b5 100644 --- a/libraries/octree/src/JurisdictionSender.h +++ b/libraries/octree/src/JurisdictionSender.h @@ -38,7 +38,7 @@ public: void setNodeType(NodeType_t type) { _nodeType = type; } protected: - virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); + virtual void processPacket(QSharedPointer pack, SharedNodePointer sendingNode); /// Locks all the resources of the thread. void lockRequestingNodes() { _requestingNodeMutex.lock(); } diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index 2a9dd1dd33..950d676886 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -225,10 +225,10 @@ void OctreeHeadlessViewer::queryOctree() { } -int OctreeHeadlessViewer::parseOctreeStats(const QByteArray& packet, const SharedNodePointer& sourceNode) { +int OctreeHeadlessViewer::parseOctreeStats(QSharedPointer packet, SharedNodePointer sourceNode) { OctreeSceneStats temp; - int statsMessageLength = temp.unpackFromMessage(reinterpret_cast(packet.data()), packet.size()); + int statsMessageLength = temp.unpackFromPacket(*packet); // TODO: actually do something with these stats, like expose them to JS... diff --git a/libraries/octree/src/OctreeHeadlessViewer.h b/libraries/octree/src/OctreeHeadlessViewer.h index 70ee43be35..399b5de69b 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.h +++ b/libraries/octree/src/OctreeHeadlessViewer.h @@ -37,7 +37,7 @@ public: void setJurisdictionListener(JurisdictionListener* jurisdictionListener) { _jurisdictionListener = jurisdictionListener; } - static int parseOctreeStats(const QByteArray& packet, const SharedNodePointer& sourceNode); + static int parseOctreeStats(QSharedPointer packet, SharedNodePointer sourceNode); static void trackIncomingOctreePacket(const QByteArray& packet, const SharedNodePointer& sendingNode, bool wasStatsPacket); public slots: diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index c4367b43d8..a3799c2f36 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -442,30 +442,16 @@ int OctreeSceneStats::packIntoPacket() { return _statsPacket->getSizeUsed(); } -int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes) { - const unsigned char* startPosition = sourceBuffer; +int OctreeSceneStats::unpackFromPacket(NLPacket& packet) { + packet.readPrimitive(&_start); + packet.readPrimitive(&_end); + packet.readPrimitive(&_elapsed); + packet.readPrimitive(&_totalEncodeTime); - // increment to push past the packet header - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(sourceBuffer)); - sourceBuffer += numBytesPacketHeader; - - memcpy(&_start, sourceBuffer, sizeof(_start)); - sourceBuffer += sizeof(_start); - memcpy(&_end, sourceBuffer, sizeof(_end)); - sourceBuffer += sizeof(_end); - memcpy(&_elapsed, sourceBuffer, sizeof(_elapsed)); - sourceBuffer += sizeof(_elapsed); - memcpy(&_totalEncodeTime, sourceBuffer, sizeof(_totalEncodeTime)); - sourceBuffer += sizeof(_totalEncodeTime); - - memcpy(&_isFullScene, sourceBuffer, sizeof(_isFullScene)); - sourceBuffer += sizeof(_isFullScene); - memcpy(&_isMoving, sourceBuffer, sizeof(_isMoving)); - sourceBuffer += sizeof(_isMoving); - memcpy(&_packets, sourceBuffer, sizeof(_packets)); - sourceBuffer += sizeof(_packets); - memcpy(&_bytes, sourceBuffer, sizeof(_bytes)); - sourceBuffer += sizeof(_bytes); + packet.readPrimitive(&_isFullScene); + packet.readPrimitive(&_isMoving); + packet.readPrimitive(&_packets); + packet.readPrimitive(&_bytes); if (_isFullScene) { _lastFullElapsed = _elapsed; @@ -474,75 +460,52 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a _lastFullTotalBytes = _bytes; } - memcpy(&_totalInternal, sourceBuffer, sizeof(_totalInternal)); - sourceBuffer += sizeof(_totalInternal); - memcpy(&_totalLeaves, sourceBuffer, sizeof(_totalLeaves)); - sourceBuffer += sizeof(_totalLeaves); + packet.readPrimitive(&_totalInternal); + packet.readPrimitive(&_totalLeaves); _totalElements = _totalInternal + _totalLeaves; - memcpy(&_internal, sourceBuffer, sizeof(_internal)); - sourceBuffer += sizeof(_internal); - memcpy(&_leaves, sourceBuffer, sizeof(_leaves)); - sourceBuffer += sizeof(_leaves); + packet.readPrimitive(&_internal); + packet.readPrimitive(&_leaves); _traversed = _internal + _leaves; - memcpy(&_internalSkippedDistance, sourceBuffer, sizeof(_internalSkippedDistance)); - sourceBuffer += sizeof(_internalSkippedDistance); - memcpy(&_leavesSkippedDistance, sourceBuffer, sizeof(_leavesSkippedDistance)); - sourceBuffer += sizeof(_leavesSkippedDistance); + packet.readPrimitive(&_internalSkippedDistance); + packet.readPrimitive(&_leavesSkippedDistance); _skippedDistance = _internalSkippedDistance + _leavesSkippedDistance; - memcpy(&_internalSkippedOutOfView, sourceBuffer, sizeof(_internalSkippedOutOfView)); - sourceBuffer += sizeof(_internalSkippedOutOfView); - memcpy(&_leavesSkippedOutOfView, sourceBuffer, sizeof(_leavesSkippedOutOfView)); - sourceBuffer += sizeof(_leavesSkippedOutOfView); + packet.readPrimitive(&_internalSkippedOutOfView); + packet.readPrimitive(&_leavesSkippedOutOfView); _skippedOutOfView = _internalSkippedOutOfView + _leavesSkippedOutOfView; - memcpy(&_internalSkippedWasInView, sourceBuffer, sizeof(_internalSkippedWasInView)); - sourceBuffer += sizeof(_internalSkippedWasInView); - memcpy(&_leavesSkippedWasInView, sourceBuffer, sizeof(_leavesSkippedWasInView)); - sourceBuffer += sizeof(_leavesSkippedWasInView); + packet.readPrimitive(&_internalSkippedWasInView); + packet.readPrimitive(&_leavesSkippedWasInView); _skippedWasInView = _internalSkippedWasInView + _leavesSkippedWasInView; - memcpy(&_internalSkippedNoChange, sourceBuffer, sizeof(_internalSkippedNoChange)); - sourceBuffer += sizeof(_internalSkippedNoChange); - memcpy(&_leavesSkippedNoChange, sourceBuffer, sizeof(_leavesSkippedNoChange)); - sourceBuffer += sizeof(_leavesSkippedNoChange); + packet.readPrimitive(&_internalSkippedNoChange); + packet.readPrimitive(&_leavesSkippedNoChange); _skippedNoChange = _internalSkippedNoChange + _leavesSkippedNoChange; - memcpy(&_internalSkippedOccluded, sourceBuffer, sizeof(_internalSkippedOccluded)); - sourceBuffer += sizeof(_internalSkippedOccluded); - memcpy(&_leavesSkippedOccluded, sourceBuffer, sizeof(_leavesSkippedOccluded)); - sourceBuffer += sizeof(_leavesSkippedOccluded); + packet.readPrimitive(&_internalSkippedOccluded); + packet.readPrimitive(&_leavesSkippedOccluded); _skippedOccluded = _internalSkippedOccluded + _leavesSkippedOccluded; - memcpy(&_internalColorSent, sourceBuffer, sizeof(_internalColorSent)); - sourceBuffer += sizeof(_internalColorSent); - memcpy(&_leavesColorSent, sourceBuffer, sizeof(_leavesColorSent)); - sourceBuffer += sizeof(_leavesColorSent); + packet.readPrimitive(&_internalColorSent); + packet.readPrimitive(&_leavesColorSent); _colorSent = _internalColorSent + _leavesColorSent; - memcpy(&_internalDidntFit, sourceBuffer, sizeof(_internalDidntFit)); - sourceBuffer += sizeof(_internalDidntFit); - memcpy(&_leavesDidntFit, sourceBuffer, sizeof(_leavesDidntFit)); - sourceBuffer += sizeof(_leavesDidntFit); + packet.readPrimitive(&_internalDidntFit); + packet.readPrimitive(&_leavesDidntFit); _didntFit = _internalDidntFit + _leavesDidntFit; - memcpy(&_colorBitsWritten, sourceBuffer, sizeof(_colorBitsWritten)); - sourceBuffer += sizeof(_colorBitsWritten); - memcpy(&_existsBitsWritten, sourceBuffer, sizeof(_existsBitsWritten)); - sourceBuffer += sizeof(_existsBitsWritten); - memcpy(&_existsInPacketBitsWritten, sourceBuffer, sizeof(_existsInPacketBitsWritten)); - sourceBuffer += sizeof(_existsInPacketBitsWritten); - memcpy(&_treesRemoved, sourceBuffer, sizeof(_treesRemoved)); - sourceBuffer += sizeof(_treesRemoved); - + packet.readPrimitive(&_colorBitsWritten); + packet.readPrimitive(&_existsBitsWritten); + packet.readPrimitive(&_existsInPacketBitsWritten); + packet.readPrimitive(&_treesRemoved); // before allocating new juridiction, clean up existing ones if (_jurisdictionRoot) { delete[] _jurisdictionRoot; _jurisdictionRoot = NULL; } - + // clear existing endNodes before copying new ones... for (size_t i = 0; i < _jurisdictionEndNodes.size(); i++) { if (_jurisdictionEndNodes[i]) { @@ -553,28 +516,29 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a // read the root jurisdiction int bytes = 0; - memcpy(&bytes, sourceBuffer, sizeof(bytes)); - sourceBuffer += sizeof(bytes); + packet.readPrimitive(&bytes); if (bytes == 0) { _jurisdictionRoot = NULL; _jurisdictionEndNodes.clear(); } else { _jurisdictionRoot = new unsigned char[bytes]; - memcpy(_jurisdictionRoot, sourceBuffer, bytes); - sourceBuffer += bytes; + packet.read(reinterpret_cast(_jurisdictionRoot), bytes); + // if and only if there's a root jurisdiction, also include the end elements _jurisdictionEndNodes.clear(); + int endNodeCount = 0; - memcpy(&endNodeCount, sourceBuffer, sizeof(endNodeCount)); - sourceBuffer += sizeof(endNodeCount); + packet.readPrimitive(&endNodeCount); + for (int i=0; i < endNodeCount; i++) { int bytes = 0; - memcpy(&bytes, sourceBuffer, sizeof(bytes)); - sourceBuffer += sizeof(bytes); + + packet.readPrimitive(&bytes); + unsigned char* endNodeCode = new unsigned char[bytes]; - memcpy(endNodeCode, sourceBuffer, bytes); - sourceBuffer += bytes; + packet.read(reinterpret_cast(endNodeCode), bytes); + _jurisdictionEndNodes.push_back(endNodeCode); } } @@ -585,8 +549,7 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total; _bitsPerOctreeAverage.updateAverage(calculatedBPV); - - return sourceBuffer - startPosition; // includes header! + return packet.pos(); // excludes header! } diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index 280f0e2a35..a71360a4cf 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -93,8 +93,8 @@ public: /// Pack the details of the statistics into a buffer for sending as a network packet int packIntoPacket(); - /// Unpack the details of the statistics from a buffer typically received as a network packet - int unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes); + /// Unpack the details of the statistics from a network packet + int unpackFromPacket(NLPacket& packet); /// Indicates that a scene has been completed and the statistics are ready to be sent bool isReadyToSend() const { return _isReadyToSend; } From 26e78a79c065a61107e34320b85e5db5a1d525f3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 09:42:52 -0700 Subject: [PATCH 308/582] Add Packet::getSenderSockAddr --- libraries/networking/src/Packet.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index e9483ca1f1..6bb39d20b8 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -16,6 +16,7 @@ #include +#include "HifiSockAddr.h" #include "PacketHeaders.h" class Packet : public QIODevice { @@ -48,6 +49,8 @@ public: qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } + HifiSockAddr getSenderSockAddr() const { return HifiSockAddr(); } + // Header readers PacketType::Value readType() const; PacketVersion readVersion() const; From c23899aec2ed833e02dbe95ddf828e696e8204ae Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 10:02:53 -0700 Subject: [PATCH 309/582] repairs to packet listener registration --- libraries/networking/src/PacketReceiver.cpp | 104 +++++++++++++------- libraries/networking/src/PacketReceiver.h | 2 + 2 files changed, 68 insertions(+), 38 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index f410fe69c3..bfb98ff25e 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -25,61 +25,89 @@ PacketReceiver::PacketReceiver(QObject* parent) : } void PacketReceiver::registerPacketListeners(const QSet& types, QObject* object, const char* slot) { + QSet nonSourcedTypes; + QSet sourceTypes; + foreach(PacketType::Value type, types) { - registerPacketListener(type, object, slot); + if (NON_SOURCED_PACKETS.contains(type)) { + nonSourcedTypes << type; + } else { + sourceTypes << type; + } + } + + if (nonSourcedTypes.size() > 0) { + QMetaMethod nonSourcedMethod = matchingMethodForListener(nonSourcedTypes[0], object, slot); + foreach(PacketType::Value type, nonSourcedTypes) { + registerVerifiedListener(type, object, nonSourcedMethod); + } + } + + if (sourceTypes.size() > 0) { + QMetaMethod sourcedMethod = matchingMethodForListener(sourcedTypes[0], object, slot); + foreach(PacketType::Value type, sourcedTypes) { + registerVerifiedListener(type, object, sourcedMethod); + } } } void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* object, const char* slot) { + QMetaMethod matchingMethod = matchingMethodForListener(type, object, slot); + if (matchingMethod.isValid()) { + registerVerifiedListener(type, object, slotMethod); + } +} + +QMetaMethod PacketReciever::matchingMethodForListener(PacketType::Value type, QObject* object, const char* slot) { Q_ASSERT(object); + + // normalize the slot with the expected parameters + QString normalizedSlot; + + if (NON_SOURCED_PACKETS.contains(type)) { + const QString NON_SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer"; + + normalizedSlot = + QMetaObject::normalizedSignature(QString("%1(%2)").arg(slot).arg(NON_SOURCED_PACKET_LISTENER_PARAMETERS)); + } else { + const QList SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; + + normalizedSlot = QMetaObject::normalizedSignature(QString("%1(%2)").arg(slot).arg(SOURCED_PACKET_LISTENER_PARAMETERS)); + } + + // does the constructed normalized method exist? + int methodIndex = object->metaObject()->indexOfSlot(normalizedSlot.data()); + if (methodIndex < 0) { + qDebug() << "PacketReceiver::registerPacketListener expected a method with a normalized signature of" + << normalizedSlot << "but such a method was not found."; + } + + Q_ASSERT(methodIndex >= 0); + + // return the converted QMetaMethod + if (methodIndex >= 0) { + return object->metaObject()->method(methodIndex); + } else { + // if somehow (scripting?) something bad gets in here at runtime that doesn't hit the asserts above + // return a non-valid QMetaMethod + return QMetaMethod(); + } +} + +void PacketReceiver::registerVerifiedListener(PacketType::Value type, QObject* object, const QMetaMethod& slot) { _packetListenerLock.lock(); if (_packetListenerMap.contains(type)) { qDebug() << "Warning: Registering a packet listener for packet type " << type << "that will remove a previously registered listener"; } - - // convert the const char* slot to a QMetaMethod - int methodIndex = object->metaObject()->indexOfSlot(slot); - Q_ASSERT(methodIndex >= 0); - - QMetaMethod slotMethod = object->metaObject()->method(methodIndex); - Q_ASSERT(method.isValid()); - - // compare the parameters we expect and the parameters the QMetaMethod has - bool parametersMatch = false; - - if (NON_SOURCED_PACKETS.contains(type)) { - const QList NON_SOURCED_PACKET_LISTENER_PARAMETERS = QList() - << QMetaObject::normalizedType("QSharedPointer"); - - parametersMatch = slotMethod.parameterTypes() == NON_SOURCED_PACKET_LISTENER_PARAMETERS; - - qDebug() << "PacketReceiver::registerPacketListener expected a method that takes" - << NON_SOURCED_PACKET_LISTENER_PARAMETERS - << "but parameter method takes" << slotMethod.parameterTypes(); - } else { - const QList SOURCED_PACKET_LISTENER_PARAMETERS = QList() - << QMetaObject::normalizedType("QSharedPointer") - << QMetaObject::normalizedType("QSharedPointer"); - - parametersMatch = slotMethod.parameterTypes() == SOURCED_PACKET_LISTENER_PARAMETERS; - - if (!parametersMatch) { - qDebug() << "PacketReceiver::registerPacketListener expected a method that takes" - << SOURCED_PACKET_LISTENER_PARAMETERS - << "but parameter method takes" << slotMethod.parameterTypes(); - } - } - - // make sure the parameters match - assert(parametersMatch); // add the mapping - _packetListenerMap[type] = ObjectMethodPair(QPointer(object), slotMethod); + _packetListenerMap[type] = ObjectMethodPair(QPointer(object), slot); _packetListenerLock.unlock(); + } bool PacketReceiver::packetVersionMatch(const NLPacket& packet) { diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 990d8fc19d..0a8ddba8d9 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -52,6 +52,8 @@ signals: private: bool packetVersionMatch(const NLPacket& packet); + + void registerVerifiedListener(PacketType::Value type, QObject* listener, const QMetaMethod& slot); using ObjectMethodPair = std::pair, QMetaMethod>; From 1dccc144e792cec77204c36df7347b81b9838fd8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 10:10:22 -0700 Subject: [PATCH 310/582] fix compile errors after PacketReceiver changes --- libraries/networking/src/PacketReceiver.cpp | 27 ++++++++++++--------- libraries/networking/src/PacketReceiver.h | 1 + 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index bfb98ff25e..6511185fa4 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -26,25 +26,25 @@ PacketReceiver::PacketReceiver(QObject* parent) : void PacketReceiver::registerPacketListeners(const QSet& types, QObject* object, const char* slot) { QSet nonSourcedTypes; - QSet sourceTypes; + QSet sourcedTypes; foreach(PacketType::Value type, types) { if (NON_SOURCED_PACKETS.contains(type)) { nonSourcedTypes << type; } else { - sourceTypes << type; + sourcedTypes << type; } } if (nonSourcedTypes.size() > 0) { - QMetaMethod nonSourcedMethod = matchingMethodForListener(nonSourcedTypes[0], object, slot); + QMetaMethod nonSourcedMethod = matchingMethodForListener(*nonSourcedTypes.begin(), object, slot); foreach(PacketType::Value type, nonSourcedTypes) { registerVerifiedListener(type, object, nonSourcedMethod); } } - if (sourceTypes.size() > 0) { - QMetaMethod sourcedMethod = matchingMethodForListener(sourcedTypes[0], object, slot); + if (sourcedTypes.size() > 0) { + QMetaMethod sourcedMethod = matchingMethodForListener(*sourcedTypes.begin(), object, slot); foreach(PacketType::Value type, sourcedTypes) { registerVerifiedListener(type, object, sourcedMethod); } @@ -54,11 +54,11 @@ void PacketReceiver::registerPacketListeners(const QSet& type void PacketReceiver::registerPacketListener(PacketType::Value type, QObject* object, const char* slot) { QMetaMethod matchingMethod = matchingMethodForListener(type, object, slot); if (matchingMethod.isValid()) { - registerVerifiedListener(type, object, slotMethod); + registerVerifiedListener(type, object, matchingMethod); } } -QMetaMethod PacketReciever::matchingMethodForListener(PacketType::Value type, QObject* object, const char* slot) { +QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QObject* object, const char* slot) const { Q_ASSERT(object); // normalize the slot with the expected parameters @@ -67,16 +67,19 @@ QMetaMethod PacketReciever::matchingMethodForListener(PacketType::Value type, QO if (NON_SOURCED_PACKETS.contains(type)) { const QString NON_SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer"; + QString nonNormalizedSignature = QString("%1(%2)").arg(slot).arg(NON_SOURCED_PACKET_LISTENER_PARAMETERS); normalizedSlot = - QMetaObject::normalizedSignature(QString("%1(%2)").arg(slot).arg(NON_SOURCED_PACKET_LISTENER_PARAMETERS)); + QMetaObject::normalizedSignature(nonNormalizedSignature.toStdString().c_str()); } else { - const QList SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; - - normalizedSlot = QMetaObject::normalizedSignature(QString("%1(%2)").arg(slot).arg(SOURCED_PACKET_LISTENER_PARAMETERS)); + const QString SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; + + QString nonNormalizedSignature = QString("%1(%2)").arg(slot).arg(SOURCED_PACKET_LISTENER_PARAMETERS); + normalizedSlot = + QMetaObject::normalizedSignature(nonNormalizedSignature.toStdString().c_str()); } // does the constructed normalized method exist? - int methodIndex = object->metaObject()->indexOfSlot(normalizedSlot.data()); + int methodIndex = object->metaObject()->indexOfSlot(normalizedSlot.toStdString().c_str()); if (methodIndex < 0) { qDebug() << "PacketReceiver::registerPacketListener expected a method with a normalized signature of" diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 0a8ddba8d9..e5b6693fe4 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -53,6 +53,7 @@ signals: private: 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, QMetaMethod>; From e5d8a39ddea284ce11ca3bd9158490e4fa1f5f97 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 11:11:52 -0700 Subject: [PATCH 311/582] update DomainServer to new packet receive API --- domain-server/src/DomainServer.cpp | 287 +++++++----------- domain-server/src/DomainServer.h | 24 +- domain-server/src/DomainServerNodeData.cpp | 4 +- domain-server/src/DomainServerNodeData.h | 3 +- libraries/networking/src/Assignment.cpp | 13 +- libraries/networking/src/Assignment.h | 7 +- libraries/networking/src/LimitedNodeList.cpp | 3 + libraries/networking/src/LimitedNodeList.h | 1 + libraries/networking/src/NodeList.cpp | 1 - libraries/networking/src/PacketHeaders.cpp | 3 +- .../networking/src/ThreadedAssignment.cpp | 2 +- libraries/networking/src/ThreadedAssignment.h | 2 +- 12 files changed, 149 insertions(+), 201 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 5e16949688..d6d6956a12 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -278,7 +278,16 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { connect(nodeList.data(), &LimitedNodeList::nodeAdded, this, &DomainServer::nodeAdded); connect(nodeList.data(), &LimitedNodeList::nodeKilled, this, &DomainServer::nodeKilled); - connect(&nodeList->getNodeSocket(), SIGNAL(readyRead()), SLOT(readAvailableDatagrams())); + // register as the packet receiver for the types we want + PacketReceiver& packetReceiver = nodeList->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::RequestAssignment, this, "processRequestAssignmentPacket"); + packetReceiver.registerPacketListener(PacketType::DomainConnectRequest, this, "processConnectRequestPackets"); + packetReceiver.registerPacketListener(PacketType::DomainListRequest, this, "processListRequestPacket"); + packetReceiver.registerPacketListener(PacketType::DomainServerPathQuery, this, "processPathQueryPacket"); + packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket"); + packetReceiver.registerPacketListener(PacketType::ICEPing, this, "processICEPingPacket"); + packetReceiver.registerPacketListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); + packetReceiver.registerPacketListener(PacketType::ICEServerPeerInformation, this, "processICEPeerInformationPacket"); // add whatever static assignments that have been parsed to the queue addStaticAssignmentsToQueue(); @@ -566,17 +575,18 @@ void DomainServer::populateDefaultStaticAssignmentsExcludingTypes(const QSet packet) { NodeType_t nodeType; HifiSockAddr publicSockAddr, localSockAddr; - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); + QDataStream packetStream(packet.data()); QUuid connectUUID; packetStream >> connectUUID; - parseNodeDataFromByteArray(packetStream, nodeType, publicSockAddr, localSockAddr, senderSockAddr); + const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); + + parseNodeData(packetStream, nodeType, publicSockAddr, localSockAddr, senderSockAddr); // check if this connect request matches an assignment in the queue bool isAssignment = _pendingAssignedNodes.contains(connectUUID); @@ -715,6 +725,33 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock } } +void DomainServer::processListRequestPacket(QSharedPointer packet) { + QDataStream packetStream(packet.data()); + + const QUuid& nodeUUID = packet->getSourceID(); + + auto limitedNodeList = DependencyManager::get(); + + SharedNodePointer checkInNode = limitedNodeList->nodeWithUUID(nodeUUID); + + if (!nodeUUID.isNull() && checkInNode) { + NodeType_t throwawayNodeType; + HifiSockAddr nodePublicAddress, nodeLocalAddress; + + QDataStream packetStream(packet.data()); + + parseNodeData(packetStream, throwawayNodeType, nodePublicAddress, nodeLocalAddress, packet->getSenderSockAddr()); + + checkInNode->setPublicSocket(nodePublicAddress); + checkInNode->setLocalSocket(nodeLocalAddress); + + QList nodeInterestList; + packetStream >> nodeInterestList; + + sendDomainListToNode(checkInNode, packet->getSenderSockAddr(), nodeInterestList.toSet()); + } +} + unsigned int DomainServer::countConnectedUsers() { unsigned int result = 0; auto nodeList = DependencyManager::get(); @@ -902,9 +939,9 @@ QUrl DomainServer::oauthAuthorizationURL(const QUuid& stateUUID) { return authorizationURL; } -int DomainServer::parseNodeDataFromByteArray(QDataStream& packetStream, NodeType_t& nodeType, - HifiSockAddr& publicSockAddr, HifiSockAddr& localSockAddr, - const HifiSockAddr& senderSockAddr) { +int DomainServer::parseNodeData(QDataStream& packetStream, NodeType_t& nodeType, + HifiSockAddr& publicSockAddr, HifiSockAddr& localSockAddr, + const HifiSockAddr& senderSockAddr) { packetStream >> nodeType; packetStream >> publicSockAddr >> localSockAddr; @@ -1037,97 +1074,68 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) { ); } -void DomainServer::readAvailableDatagrams() { - auto limitedNodeList = DependencyManager::get(); +void DomainServer::processRequestAssignmentPacket(QSharedPointer packet) { + // construct the requested assignment from the packet data + Assignment requestAssignment(*packet); - HifiSockAddr senderSockAddr; - QByteArray receivedPacket; + // Suppress these for Assignment::AgentType to once per 5 seconds + static QElapsedTimer noisyMessageTimer; + static bool wasNoisyTimerStarted = false; - while (limitedNodeList->getNodeSocket().hasPendingDatagrams()) { - receivedPacket.resize(limitedNodeList->getNodeSocket().pendingDatagramSize()); - limitedNodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - if (packetTypeForPacket(receivedPacket) == PacketType::RequestAssignment - && limitedNodeList->packetVersionAndHashMatch(receivedPacket)) { + if (!wasNoisyTimerStarted) { + noisyMessageTimer.start(); + wasNoisyTimerStarted = true; + } - // construct the requested assignment from the packet data - Assignment requestAssignment(receivedPacket); + const qint64 NOISY_MESSAGE_INTERVAL_MSECS = 5 * 1000; - // Suppress these for Assignment::AgentType to once per 5 seconds - static QElapsedTimer noisyMessageTimer; - static bool wasNoisyTimerStarted = false; + if (requestAssignment.getType() != Assignment::AgentType + || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { + static QString repeatedMessage = LogHandler::getInstance().addOnlyOnceMessageRegex + ("Received a request for assignment type [^ ]+ from [^ ]+"); + qDebug() << "Received a request for assignment type" << requestAssignment.getType() + << "from" << packet->getSenderSockAddr(); + noisyMessageTimer.restart(); + } - if (!wasNoisyTimerStarted) { - noisyMessageTimer.start(); - wasNoisyTimerStarted = true; - } + SharedAssignmentPointer assignmentToDeploy = deployableAssignmentForRequest(requestAssignment); - const qint64 NOISY_MESSAGE_INTERVAL_MSECS = 5 * 1000; + if (assignmentToDeploy) { + qDebug() << "Deploying assignment -" << *assignmentToDeploy.data() << "- to" << packet->getSenderSockAddr(); - if (requestAssignment.getType() != Assignment::AgentType - || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { - static QString repeatedMessage = LogHandler::getInstance().addOnlyOnceMessageRegex - ("Received a request for assignment type [^ ]+ from [^ ]+"); - qDebug() << "Received a request for assignment type" << requestAssignment.getType() - << "from" << senderSockAddr; - noisyMessageTimer.restart(); - } + // give this assignment out, either the type matches or the requestor said they will take any + static std::unique_ptr assignmentPacket; - SharedAssignmentPointer assignmentToDeploy = deployableAssignmentForRequest(requestAssignment); + if (!assignmentPacket) { + assignmentPacket = NLPacket::create(PacketType::CreateAssignment); + } - if (assignmentToDeploy) { - qDebug() << "Deploying assignment -" << *assignmentToDeploy.data() << "- to" << senderSockAddr; + // setup a copy of this assignment that will have a unique UUID, for packaging purposes + Assignment uniqueAssignment(*assignmentToDeploy.data()); + uniqueAssignment.setUUID(QUuid::createUuid()); - // give this assignment out, either the type matches or the requestor said they will take any - static std::unique_ptr assignmentPacket; + // reset the assignmentPacket + assignmentPacket->reset(); - if (!assignmentPacket) { - assignmentPacket = NLPacket::create(PacketType::CreateAssignment); - } + QDataStream assignmentStream(assignmentPacket.get()); - // setup a copy of this assignment that will have a unique UUID, for packaging purposes - Assignment uniqueAssignment(*assignmentToDeploy.data()); - uniqueAssignment.setUUID(QUuid::createUuid()); + assignmentStream << uniqueAssignment; - // reset the assignmentPacket - assignmentPacket->reset(); + auto limitedNodeList = DependencyManager::get(); + limitedNodeList->sendUnreliablePacket(*assignmentPacket, packet->getSenderSockAddr()); - QDataStream assignmentStream(assignmentPacket.get()); - - assignmentStream << uniqueAssignment; - - limitedNodeList->sendUnreliablePacket(*assignmentPacket, senderSockAddr); - - // add the information for that deployed assignment to the hash of pending assigned nodes - PendingAssignedNodeData* pendingNodeData = new PendingAssignedNodeData(assignmentToDeploy->getUUID(), - requestAssignment.getWalletUUID()); - _pendingAssignedNodes.insert(uniqueAssignment.getUUID(), pendingNodeData); - } else { - if (requestAssignment.getType() != Assignment::AgentType - || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { - static QString repeatedMessage = LogHandler::getInstance().addOnlyOnceMessageRegex - ("Unable to fulfill assignment request of type [^ ]+ from [^ ]+"); - qDebug() << "Unable to fulfill assignment request of type" << requestAssignment.getType() - << "from" << senderSockAddr; - noisyMessageTimer.restart(); - } - } - } else if (!_isUsingDTLS) { - // not using DTLS, process datagram normally - processDatagram(receivedPacket, senderSockAddr); - } else { - // we're using DTLS, so tell the sender to get back to us using DTLS - static std::unique_ptr dtlsRequiredPacket; - - if (!dtlsRequiredPacket) { - dtlsRequiredPacket = NLPacket::create(PacketType::DomainServerRequireDTLS, sizeof(unsigned short)); - - // pack the port that we accept DTLS traffic on - unsigned short dtlsPort = limitedNodeList->getDTLSSocket().localPort(); - dtlsRequiredPacket->writePrimitive(dtlsPort); - } - - limitedNodeList->sendUnreliablePacket(*dtlsRequiredPacket, senderSockAddr); + // add the information for that deployed assignment to the hash of pending assigned nodes + PendingAssignedNodeData* pendingNodeData = new PendingAssignedNodeData(assignmentToDeploy->getUUID(), + requestAssignment.getWalletUUID()); + _pendingAssignedNodes.insert(uniqueAssignment.getUUID(), pendingNodeData); + } else { + if (requestAssignment.getType() != Assignment::AgentType + || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { + static QString repeatedMessage = LogHandler::getInstance().addOnlyOnceMessageRegex + ("Unable to fulfill assignment request of type [^ ]+ from [^ ]+"); + qDebug() << "Unable to fulfill assignment request of type" << requestAssignment.getType() + << "from" << packet->getSenderSockAddr(); + noisyMessageTimer.restart(); } } } @@ -1355,11 +1363,10 @@ void DomainServer::handlePeerPingTimeout() { } } -void DomainServer::processICEPeerInformation(const QByteArray& packet) { +void DomainServer::processICEPeerInformationPacket(QSharedPointer packet) { // loop through the packet and pull out network peers // any peer we don't have we add to the hash, otherwise we update - QDataStream iceResponseStream(packet); - iceResponseStream.skipRawData(numBytesForPacketHeader(packet)); + QDataStream iceResponseStream(packet.data()); NetworkPeer* receivedPeer = new NetworkPeer; iceResponseStream >> *receivedPeer; @@ -1384,86 +1391,30 @@ void DomainServer::processICEPeerInformation(const QByteArray& packet) { } } -void DomainServer::processICEPingReply(const QByteArray& packet, const HifiSockAddr& senderSockAddr) { - QUuid nodeUUID = uuidFromPacketHeader(packet); +void DomainServer::processICEPingPacket(QSharedPointer packet) { + auto limitedNodeList = DependencyManager::get(); + auto pingReplyPacket = limitedNodeList->constructICEPingReplyPacket(packet, limitedNodeList->getSessionUUID()); + + limitedNodeList->sendPacket(std::move(pingReplyPacket), packet->getSenderSockAddr()); +} + +void DomainServer::processICEPingReplyPacket(QSharedPointer packet) { + QDataStream packetStream(packet.data()); + + QUuid nodeUUID; + packetStream >> nodeUUID; + SharedNetworkPeer sendingPeer = _icePeers.value(nodeUUID); if (sendingPeer) { // we had this NetworkPeer in our connecting list - add the right sock addr to our connected list - sendingPeer->activateMatchingOrNewSymmetricSocket(senderSockAddr); + sendingPeer->activateMatchingOrNewSymmetricSocket(packet->getSenderSockAddr()); } } -void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { - auto nodeList = DependencyManager::get(); - - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType::Value requestType = packetTypeForPacket(receivedPacket); - switch (requestType) { - case PacketType::DomainConnectRequest: - handleConnectRequest(receivedPacket, senderSockAddr); - break; - case PacketType::DomainListRequest: { - QUuid nodeUUID = uuidFromPacketHeader(receivedPacket); - - if (!nodeUUID.isNull() && nodeList->nodeWithUUID(nodeUUID)) { - NodeType_t throwawayNodeType; - HifiSockAddr nodePublicAddress, nodeLocalAddress; - - QDataStream packetStream(receivedPacket); - packetStream.skipRawData(numBytesForPacketHeader(receivedPacket)); - - parseNodeDataFromByteArray(packetStream, throwawayNodeType, nodePublicAddress, nodeLocalAddress, - senderSockAddr); - - SharedNodePointer checkInNode = nodeList->nodeWithUUID(nodeUUID); - checkInNode->setPublicSocket(nodePublicAddress); - checkInNode->setLocalSocket(nodeLocalAddress); - - // update last receive to now - quint64 timeNow = usecTimestampNow(); - checkInNode->setLastHeardMicrostamp(timeNow); - - QList nodeInterestList; - packetStream >> nodeInterestList; - - sendDomainListToNode(checkInNode, senderSockAddr, nodeInterestList.toSet()); - } - - break; - } - case PacketType::DomainServerPathQuery: { - // have our private method attempt to respond to this path query - respondToPathQuery(receivedPacket, senderSockAddr); - break; - } - case PacketType::NodeJsonStats: { - SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); - if (matchingNode) { - reinterpret_cast(matchingNode->getLinkedData())->parseJSONStatsPacket(receivedPacket); - } - - break; - } - case PacketType::StunResponse: - nodeList->processSTUNResponse(receivedPacket); - break; - case PacketType::ICEPing: { - auto pingReplyPacket = nodeList->constructPingReplyPacket(receivedPacket); - nodeList->sendPacket(std::move(pingReplyPacket), senderSockAddr); - - break; - } - case PacketType::ICEPingReply: { - processICEPingReply(receivedPacket, senderSockAddr); - break; - } - case PacketType::ICEServerPeerInformation: - processICEPeerInformation(receivedPacket); - break; - default: - break; - } +void DomainServer::processNodeJSONStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + if (sendingNode->getLinkedData()) { + reinterpret_cast(sendingNode->getLinkedData())->processJSONStatsPacket(*packet); } } @@ -2231,19 +2182,17 @@ void DomainServer::addStaticAssignmentsToQueue() { } } -void DomainServer::respondToPathQuery(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { +void DomainServer::processPathQueryPacket(QSharedPointer packet) { // this is a query for the viewpoint resulting from a path // first pull the query path from the packet - int numHeaderBytes = 0; - const char* packetDataStart = receivedPacket.data() + numHeaderBytes; - // figure out how many bytes the sender said this path is - quint16 numPathBytes = *packetDataStart; + quint16 numPathBytes; + packet->readPrimitive(&numPathBytes); - if (numPathBytes <= receivedPacket.size() - numHeaderBytes - sizeof(numPathBytes)) { + if (numPathBytes <= packet->bytesAvailable()) { // the number of path bytes makes sense for the sent packet - pull out the path - QString pathQuery = QString::fromUtf8(packetDataStart + sizeof(numPathBytes), numPathBytes); + QString pathQuery = QString::fromUtf8(packet->getPayload() + packet->pos(), numPathBytes); // our settings contain paths that start with a leading slash, so make sure this query has that if (!pathQuery.startsWith("/")) { @@ -2291,7 +2240,7 @@ void DomainServer::respondToPathQuery(const QByteArray& receivedPacket, const Hi // send off the packet - see if we can associate this outbound data to a particular node // TODO: does this senderSockAddr always work for a punched DS client? - nodeList->sendPacket(std::move(pathResponsePacket), senderSockAddr); + nodeList->sendPacket(std::move(pathResponsePacket), packet->getSenderSockAddr()); } } diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index b46ccf3884..0c287c4c55 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -55,11 +55,19 @@ public slots: void restart(); + void processRequestAssignmentPacket(QSharedPointer packet); + void processConnectRequestPacket(QSharedPointer packet); + void processListRequestPacket(QSharedPointer packet); + void processNodeJSONStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void processPathQueryPacket(QSharedPointer packet); + void processICEPingPacket(QSharedPointer packet); + void processICEPingReplyPacket(QSharedPointer packet); + void processICEPeerInformationPacket(QSharedPointer packet); + private slots: void aboutToQuit(); void loginFailed(); - void readAvailableDatagrams(); void setupPendingAssignmentCredits(); void sendPendingTransactionsToServer(); @@ -78,14 +86,9 @@ private: void setupAutomaticNetworking(); void sendHeartbeatToDataServer(const QString& networkAddress); - void processICEPingReply(const QByteArray& packet, const HifiSockAddr& senderSockAddr); - void processICEPeerInformation(const QByteArray& packet); void pingPunchForConnectingPeer(const SharedNetworkPeer& peer); - void processDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); - - void handleConnectRequest(const QByteArray& packet, const HifiSockAddr& senderSockAddr); unsigned int countConnectedUsers(); bool verifyUsersKey (const QString& username, const QByteArray& usernameSignature, QString& reasonReturn); bool shouldAllowConnectionFromNode(const QString& username, const QByteArray& usernameSignature, @@ -94,11 +97,8 @@ private: void preloadAllowedUserPublicKeys(); void requestUserPublicKey(const QString& username); - int parseNodeDataFromByteArray(QDataStream& packetStream, - NodeType_t& nodeType, - HifiSockAddr& publicSockAddr, - HifiSockAddr& localSockAddr, - const HifiSockAddr& senderSockAddr); + int parseNodeData(QDataStream& packetStream, NodeType_t& nodeType, + HifiSockAddr& publicSockAddr, HifiSockAddr& localSockAddr, const HifiSockAddr& senderSockAddr); void sendDomainListToNode(const SharedNodePointer& node, const HifiSockAddr& senderSockAddr, const NodeSet& nodeInterestSet); @@ -117,8 +117,6 @@ private: void refreshStaticAssignmentAndAddToQueue(SharedAssignmentPointer& assignment); void addStaticAssignmentsToQueue(); - void respondToPathQuery(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); - QUrl oauthRedirectURL(); QUrl oauthAuthorizationURL(const QUuid& stateUUID = QUuid::createUuid()); diff --git a/domain-server/src/DomainServerNodeData.cpp b/domain-server/src/DomainServerNodeData.cpp index 0d7efa064c..02528cc70e 100644 --- a/domain-server/src/DomainServerNodeData.cpp +++ b/domain-server/src/DomainServerNodeData.cpp @@ -31,8 +31,8 @@ DomainServerNodeData::DomainServerNodeData() : _paymentIntervalTimer.start(); } -void DomainServerNodeData::parseJSONStatsPacket(const QByteArray& statsPacket) { - QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(statsPacket.mid(numBytesForPacketHeader(statsPacket))); +void DomainServerNodeData::processJSONStatsPacket(NLPacket& statsPacket) { + QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(statsPacket.readAll()); _statsJSONObject = mergeJSONStatsFromNewObject(QJsonObject::fromVariantMap(packetVariantMap), _statsJSONObject); } diff --git a/domain-server/src/DomainServerNodeData.h b/domain-server/src/DomainServerNodeData.h index a91a7e0b9c..d2efced1ef 100644 --- a/domain-server/src/DomainServerNodeData.h +++ b/domain-server/src/DomainServerNodeData.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -27,7 +28,7 @@ public: const QJsonObject& getStatsJSONObject() const { return _statsJSONObject; } - void parseJSONStatsPacket(const QByteArray& statsPacket); + void processJSONStatsPacket(NLPacket& packet); void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; } const QUuid& getAssignmentUUID() const { return _assignmentUUID; } diff --git a/libraries/networking/src/Assignment.cpp b/libraries/networking/src/Assignment.cpp index 3da1fb9a41..bd28361eb7 100644 --- a/libraries/networking/src/Assignment.cpp +++ b/libraries/networking/src/Assignment.cpp @@ -60,28 +60,25 @@ Assignment::Assignment(Assignment::Command command, Assignment::Type type, const } } -Assignment::Assignment(const QByteArray& packet) : +Assignment::Assignment(NLPacket& packet) : _pool(), _location(GlobalLocation), _payload(), _walletUUID() { - PacketType::Value packetType = packetTypeForPacket(packet); - - if (packetType == PacketType::RequestAssignment) { + if (packet.getType() == PacketType::RequestAssignment) { _command = Assignment::RequestCommand; - } else if (packetType == PacketType::CreateAssignment) { + } else if (packet.getType() == PacketType::CreateAssignment) { _command = Assignment::CreateCommand; } - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); + QDataStream packetStream(&packet); packetStream >> *this; } #ifdef WIN32 -#pragma warning(default:4351) +#pragma warning(default:4351) #endif diff --git a/libraries/networking/src/Assignment.h b/libraries/networking/src/Assignment.h index 26b38914ba..a8338a7b5a 100644 --- a/libraries/networking/src/Assignment.h +++ b/libraries/networking/src/Assignment.h @@ -59,10 +59,9 @@ public: void swap(Assignment& otherAssignment); - /// Constructs an Assignment from the data in the buffer - /// \param dataBuffer the source buffer to un-pack the assignment from - /// \param numBytes the number of bytes left to read in the source buffer - Assignment(const QByteArray& packet); + /// Constructs an Assignment from a network packet + /// \param packet the packet to un-pack the assignment from + Assignment(NLPacket& packet); void setUUID(const QUuid& uuid) { _uuid = uuid; } const QUuid& getUUID() const { return _uuid; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 764a9eed7e..47a7a4b99b 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -98,6 +98,9 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short connect(&_nodeSocket, &QUdpSocket::readyRead, &_packetReceiver, &PacketReceiver::processDatagrams); _packetStatTimer.start(); + + // make sure we handle STUN response packets + _packetReceiver.registerPacketListener(PacketType::StunResponse, this, "processSTUNResponse"); } void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index f48f2aaa31..2e0bb5b6b7 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -243,6 +243,7 @@ public slots: virtual void sendSTUNRequest(); void killNodeWithUUID(const QUuid& nodeUUID); + signals: void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID); void nodeAdded(SharedNodePointer); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 8d897e82b5..1daf8a1c02 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -101,7 +101,6 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned packetReceiver.registerPacketListener(PacketType::PingReply, this, "processPingReplyPacket"); packetReceiver.registerPacketListener(PacketType::ICEPing, this, "processICEPingPacket"); packetReceiver.registerPacketListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); - packetReceiver.registerPacketListener(PacketType::StunResponse, this, "processSTUNResponse"); } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index f6001711c0..6fdd421ea0 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -21,6 +21,7 @@ const QSet NON_VERIFIED_PACKETS = QSet() << CreateAssignment << RequestAssignment << StunResponse << NodeJsonStats << EntityQuery << OctreeDataNack << EntityEditNack + << DomainListRequest << Ping << PingReply << StopNode; @@ -28,7 +29,7 @@ const QSet SEQUENCE_NUMBERED_PACKETS = QSet NON_SOURCED_PACKETS = QSet() << DomainServerRequireDTLS << DomainConnectRequest - << DomainList << DomainListRequest << DomainConnectionDenied + << DomainList << DomainConnectionDenied << DomainServerPathQuery << DomainServerPathResponse << DomainServerAddedNode << ICEServerPeerInformation << ICEServerQuery << ICEServerHeartbeat diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 2406df4602..b1c4bdbc7f 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -18,7 +18,7 @@ #include "ThreadedAssignment.h" -ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : +ThreadedAssignment::ThreadedAssignment(NLPacket& packet) : Assignment(packet), _isFinished(false), _datagramProcessingThread(NULL) diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index daca2cfe00..c4c6127b7b 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -19,7 +19,7 @@ class ThreadedAssignment : public Assignment { Q_OBJECT public: - ThreadedAssignment(const QByteArray& packet); + ThreadedAssignment(NLPacket& packet); ~ThreadedAssignment() { stop(); } void setFinished(bool isFinished); From f3d5b8f7c6c47117883afae4e0ccf3dc9a7662e3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 11:18:20 -0700 Subject: [PATCH 312/582] add a missing semicolon --- interface/src/octree/OctreePacketProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 0595bfbbc2..7574f88753 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -22,7 +22,7 @@ OctreePacketProcessor::OctreePacketProcessor() { QSet types { PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase, PacketType::OctreeStats, PacketType::EnvironmentData - } + }; packetReceiver.registerPacketListeners(types, this, "handleOctreePacket"); } From 957e6394a9465e20057629502e08737875f9b36f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 11:57:20 -0700 Subject: [PATCH 313/582] sendPacket function take Node& not a pointer --- assignment-client/src/AssignmentClientMonitor.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 8 ++++---- assignment-client/src/audio/AudioMixerClientData.cpp | 2 +- assignment-client/src/avatars/AvatarMixer.cpp | 4 ++-- assignment-client/src/entities/EntityServer.cpp | 2 +- assignment-client/src/octree/OctreeSendThread.cpp | 10 +++++----- domain-server/src/DomainServer.cpp | 6 +++--- interface/src/Application.cpp | 6 +++--- libraries/audio-client/src/AudioClient.cpp | 4 ++-- libraries/audio-client/src/AudioIOStats.cpp | 2 +- libraries/audio/src/AudioInjector.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 12 ++++++------ libraries/networking/src/PacketSender.cpp | 2 +- libraries/octree/src/OctreeHeadlessViewer.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 15 files changed, 33 insertions(+), 33 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 6796c122dc..7855956763 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -196,7 +196,7 @@ void AssignmentClientMonitor::checkSpares() { childNode->activateLocalSocket(); auto diePacket = NLPacket::create(PacketType::StopNode, 0); - nodeList->sendPacket(std::move(diePacket), childNode); + nodeList->sendPacket(std::move(diePacket), *childNode); } } } diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index e81f4c66f8..40c1a9d7ab 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -528,7 +528,7 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { envPacket->writePrimitive(reverbTime); envPacket->writePrimitive(wetLevel); } - nodeList->sendPacket(std::move(envPacket), node); + nodeList->sendPacket(std::move(envPacket), *node); } } @@ -555,7 +555,7 @@ void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const Hif nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getType() == NodeType::Agent && node->getActiveSocket() && node->getLinkedData() && node != sendingNode) { - nodeList->sendPacket(std::move(packet), node); + nodeList->sendPacket(std::move(packet), *node); } }); } @@ -793,7 +793,7 @@ void AudioMixer::run() { if (nodeData->getAvatarAudioStream() && shouldMute(nodeData->getAvatarAudioStream()->getQuietestFrameLoudness())) { auto mutePacket = NLPacket::create(PacketType::NoisyMute, 0); - nodeList->sendPacket(std::move(mutePacket), node); + nodeList->sendPacket(std::move(mutePacket), *node); } if (node->getType() == NodeType::Agent && node->getActiveSocket() @@ -831,7 +831,7 @@ void AudioMixer::run() { sendAudioEnvironmentPacket(node); // send mixed audio packet - nodeList->sendPacket(std::move(mixPacket), node); + nodeList->sendPacket(std::move(mixPacket), *node); nodeData->incrementOutgoingMixedAudioSequenceNumber(); // send an audio stream stats packet if it's time diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 13cfe4d1a0..0060b45f6e 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -190,7 +190,7 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& numStreamStatsRemaining -= numStreamStatsToPack; // send the current packet - nodeList->sendPacket(std::move(statsPacket), destinationNode); + nodeList->sendPacket(std::move(statsPacket), *destinationNode); } } diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 0d4e5b5934..487db1b380 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -312,7 +312,7 @@ void AvatarMixer::broadcastAvatarData() { billboardPacket->write(rfcUUID); billboardPacket->write(billboard); - nodeList->sendPacket(std::move(billboardPacket), node); + nodeList->sendPacket(std::move(billboardPacket), *node); ++_sumBillboardPackets; } @@ -330,7 +330,7 @@ void AvatarMixer::broadcastAvatarData() { identityPacket->write(individualData); - nodeList->sendPacket(std::move(identityPacket), node); + nodeList->sendPacket(std::move(identityPacket), *node); ++_sumIdentityPackets; } diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 08907380fb..8ec2a82afe 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -101,7 +101,7 @@ int EntityServer::sendSpecialPackets(const SharedNodePointer& node, OctreeQueryN totalBytes += specialPacket->getSizeWithHeader(); packetsSent++; - DependencyManager::get()->sendPacket(std::move(specialPacket), node); + DependencyManager::get()->sendPacket(std::move(specialPacket), *node); } nodeData->setLastDeletedEntitiesSentAt(deletePacketSentAt); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index a9619034d9..520b796e47 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -179,12 +179,12 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // actually send it OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->sendUnreliablePacket(statsPacket, _node); + DependencyManager::get()->sendUnreliablePacket(statsPacket, *_node); packetSent = true; } else { // not enough room in the packet, send two packets OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->sendUnreliablePacket(statsPacket, _node); + DependencyManager::get()->sendUnreliablePacket(statsPacket, *_node); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. @@ -215,7 +215,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes packetsSent++; OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), _node); + DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), *_node); packetSent = true; int packetSizeWithHeader = nodeData->getPacket().getSizeWithHeader(); @@ -247,7 +247,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) { // just send the octree packet OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), _node); + DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), *_node); packetSent = true; int packetSizeWithHeader = nodeData->getPacket().getSizeWithHeader(); @@ -592,7 +592,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus while (nodeData->hasNextNackedPacket() && packetsSentThisInterval < maxPacketsPerInterval) { const NLPacket* packet = nodeData->getNextNackedPacket(); if (packet) { - DependencyManager::get()->sendUnreliablePacket(*packet, _node); + DependencyManager::get()->sendUnreliablePacket(*packet, *_node); truePacketsSent++; packetsSentThisInterval++; diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index a77156a8c9..bb98bb1186 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1030,7 +1030,7 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) { addNodePacket->write(rfcConnectionSecret); // send off this packet to the node - limitedNodeList->sendUnreliablePacket(*addNodePacket, node); + limitedNodeList->sendUnreliablePacket(*addNodePacket, *node); } ); } @@ -1094,7 +1094,7 @@ void DomainServer::readAvailableDatagrams() { assignmentStream << uniqueAssignment; - limitedNodeList->sendUnreliablePacket(*assignmentPacket, senderSockAddr); + limitedNodeList->sendUnreliablePacket(*assignmentPacket, *senderSockAddr); // add the information for that deployed assignment to the hash of pending assigned nodes PendingAssignedNodeData* pendingNodeData = new PendingAssignedNodeData(assignmentToDeploy->getUUID(), @@ -1125,7 +1125,7 @@ void DomainServer::readAvailableDatagrams() { dtlsRequiredPacket->writePrimitive(dtlsPort); } - limitedNodeList->sendUnreliablePacket(*dtlsRequiredPacket, senderSockAddr); + limitedNodeList->sendUnreliablePacket(*dtlsRequiredPacket, *senderSockAddr); } } } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 04ffe64d8d..09f8e111ba 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1769,7 +1769,7 @@ void Application::sendPingPackets() { return false; } }, [nodeList](const SharedNodePointer& node) { - nodeList->sendPacket(std::move(nodeList->constructPingPacket()), node); + nodeList->sendPacket(std::move(nodeList->constructPingPacket()), *node); }); } @@ -2710,7 +2710,7 @@ int Application::sendNackPackets() { packetsSent += nackPacketList.getNumPackets(); // send the packet list - nodeList->sendPacketList(nackPacketList, node); + nodeList->sendPacketList(nackPacketList, *node); } } }); @@ -2891,7 +2891,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp queryPacket->setSizeUsed(packetSize); // make sure we still have an active socket - nodeList->sendUnreliablePacket(*queryPacket, node); + nodeList->sendUnreliablePacket(*queryPacket, *node); } }); } diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 73a785bb7b..918e5e23db 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -882,7 +882,7 @@ void AudioClient::handleAudioInput() { nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendAudioPacket); - nodeList->sendUnreliablePacket(*_audioPacket, audioMixer); + nodeList->sendUnreliablePacket(*_audioPacket, *audioMixer); _outgoingAvatarAudioSequenceNumber++; } @@ -924,7 +924,7 @@ void AudioClient::sendMuteEnvironmentPacket() { if (audioMixer) { // send off this mute packet - nodeList->sendPacket(std::move(mutePacket), audioMixer); + nodeList->sendPacket(std::move(mutePacket), *audioMixer); } } diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index 8f7ab2ecaa..d29f976da5 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -124,5 +124,5 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { // send packet SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); - nodeList->sendPacket(std::move(statsPacket), audioMixer); + nodeList->sendPacket(std::move(statsPacket), *audioMixer); } diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index c8744ace42..ac11d8f8ca 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -238,7 +238,7 @@ void AudioInjector::injectToMixer() { SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); // send off this audio packet - nodeList->sendUnreliablePacket(*audioPacket, audioMixer); + nodeList->sendUnreliablePacket(*audioPacket, *audioMixer); outgoingInjectedAudioSequenceNumber++; _currentSendPosition += bytesToCopy; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 5298eec042..715eedc33b 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -123,14 +123,14 @@ public: qint64 readDatagram(QByteArray& incomingPacket, QHostAddress* address, quint16 * port); - qint64 sendUnreliablePacket(const NLPacket& packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } - qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { assert(false); return 0; } + qint64 sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode); + qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr); - qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } - qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) { assert(false); return 0; } + qint64 sendPacket(std::unique_ptr packet, const Node& destinationNode); + qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr); - qint64 sendPacketList(NLPacketList& packetList, const SharedNodePointer& destinationNode) { assert(false); return 0; } - qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) { assert(false); return 0; } + qint64 sendPacketList(NLPacketList& packetList, const Node& destinationNode); + qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr); void (*linkedDataCreateCallback)(Node *); diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index de3ee7dc98..3313403033 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -272,7 +272,7 @@ bool PacketSender::nonThreadedProcess() { unlock(); // send the packet through the NodeList... - DependencyManager::get()->sendUnreliablePacket(*(packetPair.second), packetPair.first); + DependencyManager::get()->sendUnreliablePacket(*packetPair.second, *packetPair.first); packetsSentThisCall++; _packetsOverCheckInterval++; diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index 2a9dd1dd33..168d08082f 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -219,7 +219,7 @@ void OctreeHeadlessViewer::queryOctree() { _octreeQuery.getBroadcastData(reinterpret_cast(queryPacket->getPayload())); // ask the NodeList to send it - nodeList->sendPacket(std::move(queryPacket), node); + nodeList->sendPacket(std::move(queryPacket), *node); } }); } diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index be959b9f0c..134766fb6b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -675,7 +675,7 @@ void ScriptEngine::run() { audioPacket->writePrimitive(sequence); // send audio packet - nodeList->sendUnreliablePacket(*audioPacket, node); + nodeList->sendUnreliablePacket(*audioPacket, *node); } }); } From 77bff0c4f278103b6927e1a511f1e962ff9a167a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 11:57:56 -0700 Subject: [PATCH 314/582] First draft at sendPacket type method impl --- libraries/networking/src/LimitedNodeList.cpp | 52 ++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index dc08f6d200..b668e91590 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -248,6 +248,58 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSock return bytesWritten; } +qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode) { + if (!destinationNode.getActiveSocket()) { + // we don't have a socket to send to, return 0 + return 0; + } + + // use the node's active socket as the destination socket + auto destinationSockAddr = destinationNode.getActiveSocket(); + + return sendUnreliablePacket(packet, *destinationSockAddr); +} + +qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { + return writeDatagram(packet.getData(), sockAddr); +} + +qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& destinationNode) { + if (!destinationNode.getActiveSocket()) { + // we don't have a socket to send to, return 0 + return 0; + } + + // use the node's active socket as the destination socket + auto destinationSockAddr = destinationNode.getActiveSocket(); + + return sendPacket(std::move(packet), *destinationSockAddr); +} + +qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) { + return writeDatagram(packet->getData(), sockAddr); +} + +qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { + if (!destinationNode.getActiveSocket()) { + // we don't have a socket to send to, return 0 + return 0; + } + + // use the node's active socket as the destination socket + auto destinationSockAddr = destinationNode.getActiveSocket(); + + return sendPacketList(packetList, *destinationSockAddr); +} + +qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) { + // for (auto packet : packetList) { + // + // } + + assert(false); return 0; +} + PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType) { // Thanks to std::map and std::unordered_map this line either default constructs the // PacketType::SequenceMap and the PacketSequenceNumber or returns the existing value. From cdbcaf0f7f4668f2b54c2e676166825211f2c83d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 12:06:12 -0700 Subject: [PATCH 315/582] Fix AudioMixer compilation errors --- assignment-client/src/Agent.cpp | 47 ++++------------------ assignment-client/src/Agent.h | 1 - assignment-client/src/audio/AudioMixer.cpp | 14 +++---- 3 files changed, 13 insertions(+), 49 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 6166923832..0037f989ef 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -65,7 +65,7 @@ void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointe if (packetType == PacketType::OctreeStats) { - int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(mutablePacket, senderNode); + int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(packet, senderNode); if (messageLength > statsMessageLength) { mutablePacket = mutablePacket.mid(statsMessageLength); } else { @@ -80,49 +80,16 @@ void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointe } } -void Agent::readPendingDatagrams() { - QByteArray receivedPacket; - HifiSockAddr senderSockAddr; - auto nodeList = DependencyManager::get(); - - while (readAvailableDatagram(receivedPacket, senderSockAddr)) { - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType::Value datagramPacketType = packetTypeForPacket(receivedPacket); - - if (datagramPacketType == PacketType::Jurisdiction) { - int headerBytes = numBytesForPacketHeader(receivedPacket); - - SharedNodePointer matchedNode = nodeList->sendingNodeForPacket(receivedPacket); - - if (matchedNode) { - // PacketType_JURISDICTION, first byte is the node type... - switch (receivedPacket[headerBytes]) { - case NodeType::EntityServer: - DependencyManager::get()->getJurisdictionListener()-> - queueReceivedPacket(matchedNode, receivedPacket); - break; - } - } - } - } - } -} - void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { QByteArray receivedPacket = QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader()); int headerBytes = numBytesForPacketHeader(receivedPacket); - auto nodeList = DependencyManager::get(); - SharedNodePointer matchedNode = nodeList->sendingNodeForPacket(receivedPacket); - - if (matchedNode) { - // PacketType_JURISDICTION, first byte is the node type... - switch (receivedPacket[headerBytes]) { - case NodeType::EntityServer: - DependencyManager::get()->getJurisdictionListener()-> - queueReceivedPacket(senderNode, receivedPacket); - break; - } + // PacketType_JURISDICTION, first byte is the node type... + switch (receivedPacket[headerBytes]) { + case NodeType::EntityServer: + DependencyManager::get()->getJurisdictionListener()-> + queueReceivedPacket(packet, senderNode); + break; } } diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 70e1913b54..3e202f2d0d 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -52,7 +52,6 @@ public: public slots: void run(); - void readPendingDatagrams(); void playAvatarSound(Sound* avatarSound) { _scriptEngine.setAvatarSound(avatarSound); } private slots: diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index dc790e99f4..d8c01dafcd 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -545,34 +545,32 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { auto nodeList = DependencyManager::get(); - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - nodeList->processNodeData(senderSockAddr, receivedPacket); - } + nodeList->processNodeData(senderSockAddr, receivedPacket); } void AudioMixer::handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleMicrophoneAudioWithEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleInjectAudioPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleSilentAudioFramePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { From 9a977149a4652a425fb8e016f26192646212c6c2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 12:06:32 -0700 Subject: [PATCH 316/582] Update AvatarMixer to use packetReceiver --- assignment-client/src/avatars/AvatarMixer.cpp | 88 ++++++++----------- assignment-client/src/avatars/AvatarMixer.h | 8 +- 2 files changed, 42 insertions(+), 54 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 0d4e5b5934..3559793ff5 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -46,6 +46,12 @@ AvatarMixer::AvatarMixer(const QByteArray& packet) : { // make sure we hear about node kills so we can tell the other nodes connect(DependencyManager::get().data(), &NodeList::nodeKilled, this, &AvatarMixer::nodeKilled); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::AvatarData, this, "handleAvatarDataPacket"); + packetReceiver.registerPacketListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket"); + packetReceiver.registerPacketListener(PacketType::AvatarBillboard, this, "handleAvatarBillboardPacket"); + packetReceiver.registerPacketListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); } AvatarMixer::~AvatarMixer() { @@ -394,65 +400,43 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { } } -void AvatarMixer::readPendingDatagrams() { - QByteArray receivedPacket; - HifiSockAddr senderSockAddr; - +void AvatarMixer::handleAvatarDataPacket(QSharedPointer packet, SharedNodePointer senderNode) { auto nodeList = DependencyManager::get(); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); +} - while (readAvailableDatagram(receivedPacket, senderSockAddr)) { - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - switch (packetTypeForPacket(receivedPacket)) { - case PacketType::AvatarData: { - nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket); - break; - } - case PacketType::AvatarIdentity: { - // check if we have a matching node in our list - SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); +void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer senderNode) { + if (senderNode->getLinkedData()) { + AvatarMixerClientData* nodeData = reinterpret_cast(senderNode->getLinkedData()); + AvatarData& avatar = nodeData->getAvatar(); - if (avatarNode && avatarNode->getLinkedData()) { - AvatarMixerClientData* nodeData = reinterpret_cast(avatarNode->getLinkedData()); - AvatarData& avatar = nodeData->getAvatar(); - - // parse the identity packet and update the change timestamp if appropriate - if (avatar.hasIdentityChangedAfterParsing(receivedPacket)) { - QMutexLocker nodeDataLocker(&nodeData->getMutex()); - nodeData->setIdentityChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); - } - } - break; - } - case PacketType::AvatarBillboard: { - // check if we have a matching node in our list - SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); - - if (avatarNode && avatarNode->getLinkedData()) { - AvatarMixerClientData* nodeData = static_cast(avatarNode->getLinkedData()); - AvatarData& avatar = nodeData->getAvatar(); - - // parse the billboard packet and update the change timestamp if appropriate - if (avatar.hasBillboardChangedAfterParsing(receivedPacket)) { - QMutexLocker nodeDataLocker(&nodeData->getMutex()); - nodeData->setBillboardChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); - } - - } - break; - } - case PacketType::KillAvatar: { - nodeList->processKillNode(receivedPacket); - break; - } - default: - // hand this off to the NodeList - nodeList->processNodeData(senderSockAddr, receivedPacket); - break; - } + // parse the identity packet and update the change timestamp if appropriate + if (avatar.hasIdentityChangedAfterParsing(*packet)) { + QMutexLocker nodeDataLocker(&nodeData->getMutex()); + nodeData->setIdentityChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); } } } +void AvatarMixer::handleAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer senderNode) { + if (senderNode->getLinkedData()) { + AvatarMixerClientData* nodeData = static_cast(senderNode->getLinkedData()); + AvatarData& avatar = nodeData->getAvatar(); + + // parse the billboard packet and update the change timestamp if appropriate + if (avatar.hasBillboardChangedAfterParsing(*packet)) { + QMutexLocker nodeDataLocker(&nodeData->getMutex()); + nodeData->setBillboardChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); + } + + } +} + +void AvatarMixer::handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer senderNode) { + auto nodeList = DependencyManager::get(); + nodeList->processKillNode(*packet); +} + void AvatarMixer::sendStatsPacket() { QJsonObject statsObject; statsObject["average_listeners_last_second"] = (float) _sumListeners / (float) _numStatFrames; diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 7505c4324e..90473f754f 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -29,9 +29,13 @@ public slots: void nodeAdded(SharedNodePointer nodeAdded); void nodeKilled(SharedNodePointer killedNode); - void readPendingDatagrams(); - void sendStatsPacket(); + +private slots: + void handleAvatarDataPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer senderNode); private: void broadcastAvatarData(); From 591c5d4b6084607f1b8218d14edcbae0077e5c4e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 12:06:43 -0700 Subject: [PATCH 317/582] Fix EntityServer compilation errors --- assignment-client/src/entities/EntityServer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index b7e6fe3a29..bdd619ccf1 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -42,19 +42,19 @@ EntityServer::~EntityServer() { void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, packet->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, packet->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, packet->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } From 6a7cd7417c8aa3eb37346e42aa28308c78a24f1c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 12:07:01 -0700 Subject: [PATCH 318/582] Update AvatarData packet processing to work with NLPacket --- libraries/avatars/src/AvatarData.cpp | 9 ++++----- libraries/avatars/src/AvatarData.h | 5 +++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 5ea3b4c669..1afb92ef9a 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -867,9 +867,8 @@ void AvatarData::clearJointsData() { } } -bool AvatarData::hasIdentityChangedAfterParsing(const QByteArray &packet) { - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); +bool AvatarData::hasIdentityChangedAfterParsing(NLPacket& packet) { + QDataStream packetStream(&packet); QUuid avatarUUID; QUrl faceModelURL, skeletonModelURL; @@ -911,8 +910,8 @@ QByteArray AvatarData::identityByteArray() { return identityData; } -bool AvatarData::hasBillboardChangedAfterParsing(const QByteArray& packet) { - QByteArray newBillboard = packet.mid(numBytesForPacketHeader(packet)); +bool AvatarData::hasBillboardChangedAfterParsing(NLPacket& packet) { + QByteArray newBillboard = QByteArray(packet.getPayload()); if (newBillboard == _billboard) { return false; } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index c482f52bf1..c826fd9f0e 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -47,6 +47,7 @@ typedef unsigned long long quint64; #include #include +#include #include #include #include @@ -260,10 +261,10 @@ public: return false; } - bool hasIdentityChangedAfterParsing(const QByteArray& packet); + bool hasIdentityChangedAfterParsing(NLPacket& packet); QByteArray identityByteArray(); - bool hasBillboardChangedAfterParsing(const QByteArray& packet); + bool hasBillboardChangedAfterParsing(NLPacket& packet); const QUrl& getFaceModelURL() const { return _faceModelURL; } QString getFaceModelURLString() const { return _faceModelURL.toString(); } From 2efa2877dacce6ecccb98a9fadfe75956200ea9c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 12:07:21 -0700 Subject: [PATCH 319/582] Update LimitedNodeList::processKillNode to work with NLPacket --- libraries/networking/src/LimitedNodeList.cpp | 4 ++++ libraries/networking/src/LimitedNodeList.h | 1 + 2 files changed, 5 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 764a9eed7e..20b62a490e 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -308,6 +308,10 @@ void LimitedNodeList::killNodeWithUUID(const QUuid& nodeUUID) { } } +void LimitedNodeList::processKillNode(NLPacket& packet) { + processKillNode(QByteArray::fromRawData(packet.getData(), packet.getSizeWithHeader())); +} + void LimitedNodeList::processKillNode(const QByteArray& dataByteArray) { // read the node id QUuid nodeUUID = QUuid::fromRfc4122(dataByteArray.mid(numBytesForPacketHeader(dataByteArray), NUM_BYTES_RFC4122_UUID)); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index f48f2aaa31..770da8f876 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -157,6 +157,7 @@ public: const HifiSockAddr& getLocalSockAddr() const { return _localSockAddr; } const HifiSockAddr& getSTUNSockAddr() const { return _stunSockAddr; } + void processKillNode(NLPacket& packet); void processKillNode(const QByteArray& datagram); int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, QSharedPointer packet); From 7a160db8dd54df9e34e548afa040b1c2e2439139 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 12:58:26 -0700 Subject: [PATCH 320/582] sendPacketList first implementation --- libraries/networking/src/LimitedNodeList.cpp | 33 +++++++++++--------- libraries/networking/src/LimitedNodeList.h | 5 ++- libraries/networking/src/NLPacketList.h | 2 ++ 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index b668e91590..8895f09675 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -255,9 +255,7 @@ qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& } // use the node's active socket as the destination socket - auto destinationSockAddr = destinationNode.getActiveSocket(); - - return sendUnreliablePacket(packet, *destinationSockAddr); + return sendUnreliablePacket(packet, *destinationNode.getActiveSocket()); } qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { @@ -271,9 +269,7 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& } // use the node's active socket as the destination socket - auto destinationSockAddr = destinationNode.getActiveSocket(); - - return sendPacket(std::move(packet), *destinationSockAddr); + return sendPacket(std::move(packet), *destinationNode.getActiveSocket()); } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) { @@ -285,19 +281,26 @@ qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& des // we don't have a socket to send to, return 0 return 0; } - - // use the node's active socket as the destination socket - auto destinationSockAddr = destinationNode.getActiveSocket(); - - return sendPacketList(packetList, *destinationSockAddr); + return sendPacketList(packetList, *destinationNode.getActiveSocket()); } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) { - // for (auto packet : packetList) { - // - // } + qint64 bytesSent{ 0 }; + auto& packets = packetList._packets; + while (!packets.empty()) { + bytesSent += sendPacket(std::move(packets.front()), sockAddr); + packets.pop_front(); + } - assert(false); return 0; + return bytesSent; +} + +qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& destinationNode, + const HifiSockAddr& overridenSockAddr) { + // use the node's active socket as the destination socket if there is no overriden socket address + auto& destinationSockAddr = (overridenSockAddr.isNull()) ? *destinationNode.getActiveSocket() + : overridenSockAddr; + return sendPacket(std::move(packet), destinationSockAddr); } PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 715eedc33b..33f9ac9fd3 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -270,9 +270,8 @@ protected: void sendPacketToIceServer(PacketType::Value packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerRequestID = QUuid()); - qint64 sendPacket(std::unique_ptr packet, const SharedNodePointer& destinationNode, - const HifiSockAddr& overridenSockAddr) - { assert(false); return 0; } + qint64 sendPacket(std::unique_ptr packet, const Node& destinationNode, + const HifiSockAddr& overridenSockAddr); QUuid _sessionUUID; diff --git a/libraries/networking/src/NLPacketList.h b/libraries/networking/src/NLPacketList.h index a0a6cdd5eb..3b8150730f 100644 --- a/libraries/networking/src/NLPacketList.h +++ b/libraries/networking/src/NLPacketList.h @@ -41,6 +41,8 @@ protected: virtual qint64 readData(char* data, qint64 maxSize) { return 0; } private: + friend class LimitedNodeList; + NLPacketList(const NLPacketList& other) = delete; NLPacketList& operator=(const NLPacketList& other) = delete; From d990420565c898ba243a4e9cea3668cd1e92b7d8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 13:10:57 -0700 Subject: [PATCH 321/582] repairs to octree packet receiving in interface --- interface/src/Application.cpp | 12 +-- interface/src/Application.h | 4 +- .../src/octree/OctreePacketProcessor.cpp | 53 +++++++------ .../src/EntityTreeRenderer.cpp | 50 ++++++------ .../src/EntityTreeRenderer.h | 8 +- .../entities/src/EntityItemProperties.cpp | 11 ++- libraries/entities/src/EntityItemProperties.h | 4 +- libraries/entities/src/EntityTree.cpp | 61 +++++---------- libraries/entities/src/EntityTree.h | 12 +-- .../entities/src/EntityTreeHeadlessViewer.cpp | 4 +- .../entities/src/EntityTreeHeadlessViewer.h | 2 +- libraries/octree/src/Octree.h | 20 ++--- libraries/octree/src/OctreeRenderer.cpp | 76 +++++++++---------- libraries/octree/src/OctreeRenderer.h | 2 +- libraries/octree/src/OctreeSceneStats.cpp | 23 +++--- libraries/octree/src/OctreeSceneStats.h | 2 +- libraries/render-utils/src/Environment.cpp | 44 ++++------- libraries/render-utils/src/Environment.h | 9 +-- 18 files changed, 179 insertions(+), 218 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dfae996e49..80a4e7bcca 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3910,12 +3910,12 @@ void Application::nodeKilled(SharedNodePointer node) { DependencyManager::get()->clearOtherAvatars(); } } - -void Application::trackIncomingOctreePacket(const QByteArray& packet, const SharedNodePointer& sendingNode, bool wasStatsPacket) { + +void Application::trackIncomingOctreePacket(NLPacket& packet, SharedNodePointer sendingNode, bool wasStatsPacket) { // Attempt to identify the sender from its address. if (sendingNode) { - QUuid nodeUUID = sendingNode->getUUID(); + const QUuid& nodeUUID = sendingNode->getUUID(); // now that we know the node ID, let's add these stats to the stats for that node... _octreeSceneStatsLock.lockForWrite(); @@ -3927,7 +3927,7 @@ void Application::trackIncomingOctreePacket(const QByteArray& packet, const Shar } } -int Application::processOctreeStats(QSharedPointer packet, SharedNodePointer sendingNode) { +int Application::processOctreeStats(NLPacket& packet, SharedNodePointer sendingNode) { // But, also identify the sender, and keep track of the contained jurisdiction root for this server // parse the incoming stats datas stick it in a temporary object for now, while we @@ -3941,10 +3941,10 @@ int Application::processOctreeStats(QSharedPointer packet, SharedNodeP _octreeSceneStatsLock.lockForWrite(); if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { octreeStats = &_octreeServerSceneStats[nodeUUID]; - statsMessageLength = octreeStats->unpackFromPacket(*packet); + statsMessageLength = octreeStats->unpackFromPacket(packet); } else { OctreeSceneStats temp; - statsMessageLength = temp.unpackFromPacket(*packet); + statsMessageLength = temp.unpackFromPacket(packet); octreeStats = &temp; } _octreeSceneStatsLock.unlock(); diff --git a/interface/src/Application.h b/interface/src/Application.h index dd27080952..1326ac5180 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -612,8 +612,8 @@ private: StDev _idleLoopStdev; float _idleLoopMeasuredJitter; - int processOctreeStats(QSharedPointer packet, SharedNodePointer sendingNode); - void trackIncomingOctreePacket(const QByteArray& packet, const SharedNodePointer& sendingNode, bool wasStatsPacket); + int processOctreeStats(NLPacket& packet, SharedNodePointer sendingNode); + void trackIncomingOctreePacket(NLPacket& packet, SharedNodePointer sendingNode, bool wasStatsPacket); NodeToJurisdictionMap _entityServerJurisdictions; NodeToOctreeSceneStats _octreeServerSceneStats; diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 7574f88753..b9a111aa3f 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -28,7 +28,7 @@ OctreePacketProcessor::OctreePacketProcessor() { } void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { - queueReceivedPacket(senderNode, packet); + queueReceivedPacket(packet, senderNode); } void OctreePacketProcessor::processPacket(QSharedPointer packet, SharedNodePointer sendingNode) { @@ -41,8 +41,6 @@ void OctreePacketProcessor::processPacket(QSharedPointer packet, Share qDebug("OctreePacketProcessor::processPacket() packets to process=%d", packetsToProcessCount()); } - int messageLength = packet->getSizeUsed(); - Application* app = Application::getInstance(); bool wasStatsPacket = false; @@ -52,60 +50,61 @@ void OctreePacketProcessor::processPacket(QSharedPointer packet, Share // immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first // then process any remaining bytes as if it was another packet if (octreePacketType == PacketType::OctreeStats) { - int statsMessageLength = app->processOctreeStats(packet, sendingNode); - wasStatsPacket = true; - if (messageLength > statsMessageLength) { - mutablePacket = mutablePacket.mid(statsMessageLength); + int statsMessageLength = app->processOctreeStats(*packet, sendingNode); - // TODO: this does not look correct, the goal is to test the packet version for the piggyback, but - // this is testing the version and hash of the original packet - if (!DependencyManager::get()->packetVersionAndHashMatch(packet)) { - return; // bail since piggyback data doesn't match our versioning - } + wasStatsPacket = true; + int piggybackBytes = packet->getSizeUsed() - statsMessageLength; + + if (piggybackBytes) { + // construct a new packet from the piggybacked one + std::unique_ptr buffer = std::unique_ptr(new char[piggybackBytes]); + memcpy(buffer.get(), packet->getPayload() + statsMessageLength, piggybackBytes); + + auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), piggybackBytes, packet->getSenderSockAddr()); + packet = QSharedPointer(newPacket.release()); } else { // Note... stats packets don't have sequence numbers, so we don't want to send those to trackIncomingVoxelPacket() return; // bail since no piggyback data } } // fall through to piggyback message - voxelPacketType = packetTypeForPacket(mutablePacket); - PacketVersion packetVersion = mutablePacket[1]; - PacketVersion expectedVersion = versionForPacketType(voxelPacketType); + PacketType::Value packetType = packet->getType(); // check version of piggyback packet against expected version - if (packetVersion != expectedVersion) { + if (packetType != versionForPacketType(packet->getType())) { static QMultiMap versionDebugSuppressMap; - QUuid senderUUID = uuidFromPacketHeader(packet); - if (!versionDebugSuppressMap.contains(senderUUID, voxelPacketType)) { - qDebug() << "Packet version mismatch on" << voxelPacketType << "- Sender" - << senderUUID << "sent" << (int)packetVersion << "but" - << (int)expectedVersion << "expected."; + const QUuid& senderUUID = packet->getSourceID(); + if (!versionDebugSuppressMap.contains(senderUUID, packet->getType())) { + + qDebug() << "Packet version mismatch on" << packetType << "- Sender" + << senderUUID << "sent" << (int) packetType << "but" + << (int) versionForPacketType(packetType) << "expected."; emit packetVersionMismatch(); - versionDebugSuppressMap.insert(senderUUID, voxelPacketType); + versionDebugSuppressMap.insert(senderUUID, packetType); } return; // bail since piggyback version doesn't match } - app->trackIncomingOctreePacket(mutablePacket, sendingNode, wasStatsPacket); + app->trackIncomingOctreePacket(*packet, sendingNode, wasStatsPacket); - switch(voxelPacketType) { + switch(packetType) { case PacketType::EntityErase: { if (DependencyManager::get()->shouldRenderEntities()) { - app->_entities.processEraseMessage(mutablePacket, sendingNode); + app->_entities.processEraseMessage(*packet, sendingNode); } } break; case PacketType::EntityData: { if (DependencyManager::get()->shouldRenderEntities()) { - app->_entities.processDatagram(mutablePacket, sendingNode); + app->_entities.processDatagram(*packet, sendingNode); } } break; case PacketType::EnvironmentData: { - app->_environment.parseData(*sendingNode->getActiveSocket(), mutablePacket); + app->_environment.processPacket(*packet); } break; default: { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 11d24c6d9d..650eb97e21 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -45,7 +45,7 @@ #include "EntitiesRendererLogging.h" #include "AddressManager.h" -EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterface* viewState, +EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterface* viewState, AbstractScriptingServicesInterface* scriptingServices) : OctreeRenderer(), _wantScripts(wantScripts), @@ -75,13 +75,13 @@ EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterf } EntityTreeRenderer::~EntityTreeRenderer() { - // NOTE: we don't need to delete _entitiesScriptEngine because it is registered with the application and has a + // NOTE: we don't need to delete _entitiesScriptEngine because it is registered with the application and has a // signal tied to call it's deleteLater on doneRunning if (_sandboxScriptEngine) { // TODO: consider reworking how _sandboxScriptEngine is managed. It's treated differently than _entitiesScriptEngine - // because we don't call registerScriptEngineWithApplicationServices() for it. This implementation is confusing and - // potentially error prone because it's not a full fledged ScriptEngine that has been fully connected to the - // application. We did this so that scripts that were ill-formed could be evaluated but not execute against the + // because we don't call registerScriptEngineWithApplicationServices() for it. This implementation is confusing and + // potentially error prone because it's not a full fledged ScriptEngine that has been fully connected to the + // application. We did this so that scripts that were ill-formed could be evaluated but not execute against the // application services. But this means it's shutdown behavior is different from other ScriptEngines delete _sandboxScriptEngine; _sandboxScriptEngine = NULL; @@ -119,7 +119,7 @@ void EntityTreeRenderer::init() { } // make sure our "last avatar position" is something other than our current position, so that on our - // first chance, we'll check for enter/leave entity events. + // first chance, we'll check for enter/leave entity events. _lastAvatarPosition = _viewState->getAvatarPosition() + glm::vec3((float)TREE_SCALE); connect(entityTree, &EntityTree::deletingEntity, this, &EntityTreeRenderer::deletingEntity, Qt::QueuedConnection); @@ -138,7 +138,7 @@ void EntityTreeRenderer::scriptContentsAvailable(const QUrl& url, const QString& _waitingOnPreload.remove(url); foreach(EntityItemID entityID, entityIDs) { checkAndCallPreload(entityID); - } + } } } @@ -154,7 +154,7 @@ QScriptValue EntityTreeRenderer::loadEntityScript(const EntityItemID& entityItem } -QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorText, bool& isURL, bool& isPending, QUrl& urlOut, +QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorText, bool& isURL, bool& isPending, QUrl& urlOut, bool& reload) { isPending = false; QUrl url(scriptMaybeURLorText); @@ -353,7 +353,7 @@ void EntityTreeRenderer::checkEnterLeaveEntities() { // Note: at this point we don't need to worry about the tree being locked, because we only deal with // EntityItemIDs from here. The loadEntityScript() method is robust against attempting to load scripts - // for entity IDs that no longer exist. + // for entity IDs that no longer exist. // for all of our previous containing entities, if they are no longer containing then send them a leave event foreach(const EntityItemID& entityID, _currentEntitiesInside) { @@ -400,7 +400,7 @@ void EntityTreeRenderer::leaveAllEntities() { _currentEntitiesInside.clear(); // make sure our "last avatar position" is something other than our current position, so that on our - // first chance, we'll check for enter/leave entity events. + // first chance, we'll check for enter/leave entity events. _lastAvatarPosition = _viewState->getAvatarPosition() + glm::vec3((float)TREE_SCALE); } } @@ -513,7 +513,7 @@ const FBXGeometry* EntityTreeRenderer::getGeometryForEntity(EntityItemPointer en const FBXGeometry* result = NULL; if (entityItem->getType() == EntityTypes::Model) { - std::shared_ptr modelEntityItem = + std::shared_ptr modelEntityItem = std::dynamic_pointer_cast(entityItem); assert(modelEntityItem); // we need this!!! Model* model = modelEntityItem->getModel(this); @@ -527,7 +527,7 @@ const FBXGeometry* EntityTreeRenderer::getGeometryForEntity(EntityItemPointer en const Model* EntityTreeRenderer::getModelForEntityItem(EntityItemPointer entityItem) { const Model* result = NULL; if (entityItem->getType() == EntityTypes::Model) { - std::shared_ptr modelEntityItem = + std::shared_ptr modelEntityItem = std::dynamic_pointer_cast(entityItem); result = modelEntityItem->getModel(this); } @@ -538,7 +538,7 @@ const FBXGeometry* EntityTreeRenderer::getCollisionGeometryForEntity(EntityItemP const FBXGeometry* result = NULL; if (entityItem->getType() == EntityTypes::Model) { - std::shared_ptr modelEntityItem = + std::shared_ptr modelEntityItem = std::dynamic_pointer_cast(entityItem); if (modelEntityItem->hasCompoundShapeURL()) { Model* model = modelEntityItem->getModel(this); @@ -678,20 +678,20 @@ float EntityTreeRenderer::getSizeScale() const { return _viewState->getSizeScale(); } -int EntityTreeRenderer::getBoundaryLevelAdjust() const { +int EntityTreeRenderer::getBoundaryLevelAdjust() const { return _viewState->getBoundaryLevelAdjust(); } -void EntityTreeRenderer::processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode) { - static_cast(_tree)->processEraseMessage(dataByteArray, sourceNode); +void EntityTreeRenderer::processEraseMessage(NLPacket& packet, const SharedNodePointer& sourceNode) { + static_cast(_tree)->processEraseMessage(packet, sourceNode); } Model* EntityTreeRenderer::allocateModel(const QString& url, const QString& collisionUrl) { Model* model = NULL; // Make sure we only create and delete models on the thread that owns the EntityTreeRenderer if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "allocateModel", Qt::BlockingQueuedConnection, + QMetaObject::invokeMethod(this, "allocateModel", Qt::BlockingQueuedConnection, Q_RETURN_ARG(Model*, model), Q_ARG(const QString&, url)); @@ -715,7 +715,7 @@ Model* EntityTreeRenderer::updateModel(Model* original, const QString& newUrl, c // Before we do any creating or deleting, make sure we're on our renderer thread if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "updateModel", Qt::BlockingQueuedConnection, + QMetaObject::invokeMethod(this, "updateModel", Qt::BlockingQueuedConnection, Q_RETURN_ARG(Model*, model), Q_ARG(Model*, original), Q_ARG(const QString&, newUrl)); @@ -756,7 +756,7 @@ void EntityTreeRenderer::deleteReleasedModels() { } } -RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, +RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, bool precisionPicking) { RayToEntityIntersectionResult result; if (_tree) { @@ -764,8 +764,8 @@ RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(cons OctreeElement* element; EntityItemPointer intersectedEntity = NULL; - result.intersects = entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, result.face, - (void**)&intersectedEntity, lockType, &result.accurate, + result.intersects = entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, result.face, + (void**)&intersectedEntity, lockType, &result.accurate, precisionPicking); if (result.intersects && intersectedEntity) { result.entityID = intersectedEntity->getEntityItemID(); @@ -778,15 +778,15 @@ RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(cons } void EntityTreeRenderer::connectSignalsToSlots(EntityScriptingInterface* entityScriptingInterface) { - connect(this, &EntityTreeRenderer::mousePressOnEntity, entityScriptingInterface, + connect(this, &EntityTreeRenderer::mousePressOnEntity, entityScriptingInterface, [=](const RayToEntityIntersectionResult& intersection, const QMouseEvent* event, unsigned int deviceId){ entityScriptingInterface->mousePressOnEntity(intersection.entityID, MouseEvent(*event, deviceId)); }); - connect(this, &EntityTreeRenderer::mouseMoveOnEntity, entityScriptingInterface, + connect(this, &EntityTreeRenderer::mouseMoveOnEntity, entityScriptingInterface, [=](const RayToEntityIntersectionResult& intersection, const QMouseEvent* event, unsigned int deviceId) { entityScriptingInterface->mouseMoveOnEntity(intersection.entityID, MouseEvent(*event, deviceId)); }); - connect(this, &EntityTreeRenderer::mouseReleaseOnEntity, entityScriptingInterface, + connect(this, &EntityTreeRenderer::mouseReleaseOnEntity, entityScriptingInterface, [=](const RayToEntityIntersectionResult& intersection, const QMouseEvent* event, unsigned int deviceId) { entityScriptingInterface->mouseReleaseOnEntity(intersection.entityID, MouseEvent(*event, deviceId)); }); @@ -966,7 +966,7 @@ void EntityTreeRenderer::mouseMoveEvent(QMouseEvent* event, unsigned int deviceI } else { // handle the hover logic... - // if we were previously hovering over an entity, and we're no longer hovering over any entity then we need to + // if we were previously hovering over an entity, and we're no longer hovering over any entity then we need to // send the hover leave for our previous entity if (!_currentHoverOverEntityID.isInvalidID()) { emit hoverLeaveEntity(_currentHoverOverEntityID, MouseEvent(*event, deviceID)); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 84aa3fa8cb..39f088f06d 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -38,7 +38,7 @@ public: class EntityTreeRenderer : public OctreeRenderer, public EntityItemFBXService, public ScriptUser { Q_OBJECT public: - EntityTreeRenderer(bool wantScripts, AbstractViewStateInterface* viewState, + EntityTreeRenderer(bool wantScripts, AbstractViewStateInterface* viewState, AbstractScriptingServicesInterface* scriptingServices); virtual ~EntityTreeRenderer(); @@ -55,7 +55,7 @@ public: EntityTree* getTree() { return static_cast(_tree); } - void processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); + void processEraseMessage(NLPacket& packet, const SharedNodePointer& sourceNode); virtual void init(); virtual void render(RenderArgs* renderArgs) override; @@ -71,7 +71,7 @@ public: Q_INVOKABLE Model* allocateModel(const QString& url, const QString& collisionUrl); /// if a renderable entity item needs to update the URL of a model, we will handle that for the entity - Q_INVOKABLE Model* updateModel(Model* original, const QString& newUrl, const QString& collisionUrl); + Q_INVOKABLE Model* updateModel(Model* original, const QString& newUrl, const QString& collisionUrl); /// if a renderable entity item is done with a model, it should return it to us void releaseModel(Model* model); @@ -136,7 +136,7 @@ private: QList _releasedModels; void renderProxies(EntityItemPointer entity, RenderArgs* args); - RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, + RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, bool precisionPicking); EntityItemID _currentHoverOverEntityID; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 8d96e0a60a..a6df04e31e 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -128,8 +128,8 @@ void EntityItemProperties::setSittingPoints(const QVector& sitting } } -bool EntityItemProperties::animationSettingsChanged() const { - return _animationSettingsChanged; +bool EntityItemProperties::animationSettingsChanged() const { + return _animationSettingsChanged; } void EntityItemProperties::setAnimationSettings(const QString& value) { @@ -900,11 +900,14 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent // // TODO: Implement support for script and visible properties. // -bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes, +bool EntityItemProperties::decodeEntityEditPacket(NLPacket& packet, int& processedBytes, EntityItemID& entityID, EntityItemProperties& properties) { bool valid = false; - + + const unsigned char* data = reinterpret_cast(packet.getPayload()); const unsigned char* dataAt = data; + + int bytesToRead = packet.getSizeUsed(); processedBytes = 0; // the first part of the data is an octcode, this is a required element of the edit packet format, but we don't diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 34c15043c0..f9a4d499d2 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -179,8 +179,8 @@ public: static bool encodeEraseEntityMessage(const EntityItemID& entityItemID, QByteArray& buffer); - static bool decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes, - EntityItemID& entityID, EntityItemProperties& properties); + static bool decodeEntityEditPacket(NLPacket& packet, int& processedBytes, + EntityItemID& entityID, EntityItemProperties& properties); bool glowLevelChanged() const { return _glowLevelChanged; } bool localRenderAlphaChanged() const { return _localRenderAlphaChanged; } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index a98b529e07..a5c5d58936 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -26,7 +26,7 @@ #include "LogHandler.h" -EntityTree::EntityTree(bool shouldReaverage) : +EntityTree::EntityTree(bool shouldReaverage) : Octree(shouldReaverage), _fbxService(NULL), _simulation(NULL) @@ -568,8 +568,8 @@ EntityItemPointer EntityTree::findEntityByEntityItemID(const EntityItemID& entit return foundEntity; } -int EntityTree::processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, - const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode) { +int EntityTree::processEditPacketData(NLPacket& packet, const unsigned char* editData, int maxLength, + const SharedNodePointer& senderNode) { if (!getIsServer()) { qCDebug(entities) << "UNEXPECTED!!! processEditPacketData() should only be called on a server tree."; @@ -578,9 +578,9 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign int processedBytes = 0; // we handle these types of "edit" packets - switch (packetType) { + switch (packet.getType()) { case PacketType::EntityErase: { - QByteArray dataByteArray((const char*)editData, maxLength); + QByteArray dataByteArray = QByteArray::fromRawData(reinterpret_cast(editData), maxLength); processedBytes = processEraseMessageDetails(dataByteArray, senderNode); break; } @@ -598,8 +598,8 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign EntityItemID entityItemID; EntityItemProperties properties; startDecode = usecTimestampNow(); - bool validEditPacket = EntityItemProperties::decodeEntityEditPacket(editData, maxLength, - processedBytes, entityItemID, properties); + bool validEditPacket = EntityItemProperties::decodeEntityEditPacket(packet, processedBytes, + entityItemID, properties); endDecode = usecTimestampNow(); // If we got a valid edit packet, then it could be a new entity or it could be an update to @@ -609,7 +609,7 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign startLookup = usecTimestampNow(); EntityItemPointer existingEntity = findEntityByEntityItemID(entityItemID); endLookup = usecTimestampNow(); - if (existingEntity && packetType == PacketType::EntityEdit) { + if (existingEntity && packet.getType() == PacketType::EntityEdit) { // if the EntityItem exists, then update it startLogging = usecTimestampNow(); if (wantEditLogging()) { @@ -623,7 +623,7 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign existingEntity->markAsChangedOnServer(); endUpdate = usecTimestampNow(); _totalUpdates++; - } else if (packetType == PacketType::EntityAdd) { + } else if (packet.getType() == PacketType::EntityAdd) { if (senderNode->getCanRez()) { // this is a new entity... assign a new entityID properties.setCreated(properties.getLastEdited()); @@ -651,7 +651,7 @@ int EntityTree::processEditPacketData(PacketType::Value packetType, const unsign } else { static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Add or Edit failed.*"); - qCDebug(entities) << "Add or Edit failed." << packetType << existingEntity.get(); + qCDebug(entities) << "Add or Edit failed." << packet.getType() << existingEntity.get(); } } @@ -854,45 +854,26 @@ void EntityTree::forgetEntitiesDeletedBefore(quint64 sinceTime) { // TODO: consider consolidating processEraseMessageDetails() and processEraseMessage() -int EntityTree::processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode) { +int EntityTree::processEraseMessage(NLPacket& packet, const SharedNodePointer& sourceNode) { lockForWrite(); - const unsigned char* packetData = (const unsigned char*)dataByteArray.constData(); - const unsigned char* dataAt = packetData; - size_t packetLength = dataByteArray.size(); - size_t numBytesPacketHeader = numBytesForPacketHeader(dataByteArray); - size_t processedBytes = numBytesPacketHeader; - dataAt += numBytesPacketHeader; + packet.seek(sizeof(OCTREE_PACKET_FLAGS) + sizeof(OCTREE_PACKET_SEQUENCE) + sizeof(OCTREE_PACKET_SENT_TIME)); - dataAt += sizeof(OCTREE_PACKET_FLAGS); - processedBytes += sizeof(OCTREE_PACKET_FLAGS); - - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - processedBytes += sizeof(OCTREE_PACKET_SEQUENCE); - - dataAt += sizeof(OCTREE_PACKET_SENT_TIME); - processedBytes += sizeof(OCTREE_PACKET_SENT_TIME); - - uint16_t numberOfIds = 0; // placeholder for now - memcpy(&numberOfIds, dataAt, sizeof(numberOfIds)); - dataAt += sizeof(numberOfIds); - processedBytes += sizeof(numberOfIds); - - if (numberOfIds > 0) { + uint16_t numberOfIDs = 0; // placeholder for now + packet.readPrimitive(&numberOfIDs); + + if (numberOfIDs > 0) { QSet entityItemIDsToDelete; - for (size_t i = 0; i < numberOfIds; i++) { + for (size_t i = 0; i < numberOfIDs; i++) { - if (processedBytes + NUM_BYTES_RFC4122_UUID > packetLength) { + if (NUM_BYTES_RFC4122_UUID > packet.bytesAvailable()) { qCDebug(entities) << "EntityTree::processEraseMessage().... bailing because not enough bytes in buffer"; break; // bail to prevent buffer overflow } - QByteArray encodedID = dataByteArray.mid(processedBytes, NUM_BYTES_RFC4122_UUID); - QUuid entityID = QUuid::fromRfc4122(encodedID); - dataAt += encodedID.size(); - processedBytes += encodedID.size(); - + QUuid entityID = QUuid::fromRfc4122(packet.read(NUM_BYTES_RFC4122_UUID)); + EntityItemID entityItemID(entityID); entityItemIDsToDelete << entityItemID; @@ -904,7 +885,7 @@ int EntityTree::processEraseMessage(const QByteArray& dataByteArray, const Share deleteEntities(entityItemIDsToDelete, true, true); } unlock(); - return processedBytes; + return packet.pos(); } // This version skips over the header diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 27ae47c265..4ade0afc6d 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -66,8 +66,8 @@ public: virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion >= VERSION_ENTITIES_USE_METERS_AND_RADIANS; } virtual bool handlesEditPacketType(PacketType::Value packetType) const; - virtual int processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, - const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode); + virtual int processEditPacketData(NLPacket& packet, const unsigned char* editData, int maxLength, + const SharedNodePointer& senderNode); virtual bool rootElementHasData() const { return true; } @@ -133,8 +133,8 @@ public: bool& hasMore); void forgetEntitiesDeletedBefore(quint64 sinceTime); - int processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); - int processEraseMessageDetails(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); + int processEraseMessage(NLPacket& packet, const SharedNodePointer& sourceNode); + int processEraseMessageDetails(const QByteArray& buffer, const SharedNodePointer& sourceNode); EntityItemFBXService* getFBXService() const { return _fbxService; } void setFBXService(EntityItemFBXService* service) { _fbxService = service; } @@ -186,9 +186,9 @@ public: virtual quint64 getAverageLoggingTime() const { return _totalEditMessages == 0 ? 0 : _totalLoggingTime / _totalEditMessages; } void trackIncomingEntityLastEdited(quint64 lastEditedTime, int bytesRead); - quint64 getAverageEditDeltas() const + quint64 getAverageEditDeltas() const { return _totalTrackedEdits == 0 ? 0 : _totalEditDeltas / _totalTrackedEdits; } - quint64 getAverageEditBytes() const + quint64 getAverageEditBytes() const { return _totalTrackedEdits == 0 ? 0 : _totalEditBytes / _totalTrackedEdits; } quint64 getMaxEditDelta() const { return _maxEditDelta; } quint64 getTotalTrackedEdits() const { return _totalTrackedEdits; } diff --git a/libraries/entities/src/EntityTreeHeadlessViewer.cpp b/libraries/entities/src/EntityTreeHeadlessViewer.cpp index 45d21c0987..80c0a7fa7f 100644 --- a/libraries/entities/src/EntityTreeHeadlessViewer.cpp +++ b/libraries/entities/src/EntityTreeHeadlessViewer.cpp @@ -40,6 +40,6 @@ void EntityTreeHeadlessViewer::update() { } } -void EntityTreeHeadlessViewer::processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode) { - static_cast(_tree)->processEraseMessage(dataByteArray, sourceNode); +void EntityTreeHeadlessViewer::processEraseMessage(NLPacket& packet, const SharedNodePointer& sourceNode) { + static_cast(_tree)->processEraseMessage(packet, sourceNode); } diff --git a/libraries/entities/src/EntityTreeHeadlessViewer.h b/libraries/entities/src/EntityTreeHeadlessViewer.h index fedbc74430..9c2efc06ab 100644 --- a/libraries/entities/src/EntityTreeHeadlessViewer.h +++ b/libraries/entities/src/EntityTreeHeadlessViewer.h @@ -38,7 +38,7 @@ public: EntityTree* getTree() { return (EntityTree*)_tree; } - void processEraseMessage(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); + void processEraseMessage(NLPacket& packet, const SharedNodePointer& sourceNode); virtual void init(); diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 846784559f..a3f9bbbac4 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -229,12 +229,12 @@ public: // own definition. Implement these to allow your octree based server to support editing virtual bool getWantSVOfileVersions() const { return false; } virtual PacketType::Value expectedDataPacketType() const { return PacketType::Unknown; } - virtual bool canProcessVersion(PacketVersion thisVersion) const { + virtual bool canProcessVersion(PacketVersion thisVersion) const { return thisVersion == versionForPacketType(expectedDataPacketType()); } virtual PacketVersion expectedVersion() const { return versionForPacketType(expectedDataPacketType()); } virtual bool handlesEditPacketType(PacketType::Value packetType) const { return false; } - virtual int processEditPacketData(PacketType::Value packetType, const unsigned char* packetData, int packetLength, - const unsigned char* editData, int maxLength, const SharedNodePointer& sourceNode) { return 0; } + virtual int processEditPacketData(NLPacket& packet, const unsigned char* editData, int maxLength, + const SharedNodePointer& sourceNode) { return 0; } virtual bool recurseChildrenWithData() const { return true; } virtual bool rootElementHasData() const { return false; } @@ -304,16 +304,16 @@ public: } lockType; bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - OctreeElement*& node, float& distance, BoxFace& face, + OctreeElement*& node, float& distance, BoxFace& face, void** intersectedObject = NULL, - Octree::lockType lockType = Octree::TryLock, - bool* accurateResult = NULL, + Octree::lockType lockType = Octree::TryLock, + bool* accurateResult = NULL, bool precisionPicking = false); - bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject = NULL, + bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject = NULL, Octree::lockType lockType = Octree::TryLock, bool* accurateResult = NULL); - bool findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration, + bool findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration, Octree::lockType lockType = Octree::TryLock, bool* accurateResult = NULL); /// \param cube query cube in world-frame (meters) @@ -323,7 +323,7 @@ public: /// \param point query point in world-frame (meters) /// \param lockType how to lock the tree (Lock, TryLock, NoLock) /// \param[out] accurateResult pointer to output result, will be set "true" or "false" if non-null - OctreeElement* getElementEnclosingPoint(const glm::vec3& point, + OctreeElement* getElementEnclosingPoint(const glm::vec3& point, Octree::lockType lockType = Octree::TryLock, bool* accurateResult = NULL); // Note: this assumes the fileFormat is the HIO individual voxels code files @@ -411,7 +411,7 @@ protected: QReadWriteLock _lock; - bool _isViewing; + bool _isViewing; bool _isServer; }; diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 16d2f4285a..17ed302a9a 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -40,15 +40,15 @@ OctreeRenderer::~OctreeRenderer() { } } -void OctreeRenderer::setTree(Octree* newTree) { +void OctreeRenderer::setTree(Octree* newTree) { if (_tree && _managedTree) { delete _tree; _managedTree = false; } - _tree = newTree; + _tree = newTree; } -void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode) { +void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceNode) { bool extraDebugging = false; if (extraDebugging) { @@ -61,30 +61,21 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar } bool showTimingDetails = false; // Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); - PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram()",showTimingDetails); + PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram()", showTimingDetails); - unsigned int packetLength = dataByteArray.size(); - PacketType::Value command = packetTypeForPacket(dataByteArray); - unsigned int numBytesPacketHeader = numBytesForPacketHeader(dataByteArray); - QUuid sourceUUID = uuidFromPacketHeader(dataByteArray); - PacketType::Value expectedType = getExpectedPacketType(); - // packetVersion is the second byte - PacketVersion packetVersion = dataByteArray[1]; - - if(command == expectedType) { + if (packet.getType() == getExpectedPacketType()) { PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram expected PacketType", showTimingDetails); // if we are getting inbound packets, then our tree is also viewing, and we should remember that fact. _tree->setIsViewing(true); - const unsigned char* dataAt = reinterpret_cast(dataByteArray.data()) + numBytesPacketHeader; + OCTREE_PACKET_FLAGS flags; + packet.readPrimitive(&flags); + + OCTREE_PACKET_SEQUENCE sequence; + packet.readPrimitive(&sequence); - OCTREE_PACKET_FLAGS flags = (*(OCTREE_PACKET_FLAGS*)(dataAt)); - dataAt += sizeof(OCTREE_PACKET_FLAGS); - OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - - OCTREE_PACKET_SENT_TIME sentAt = (*(OCTREE_PACKET_SENT_TIME*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + OCTREE_PACKET_SENT_TIME sentAt; + packet.readPrimitive(&sentAt); bool packetIsColored = oneAtBit(flags, PACKET_IS_COLOR_BIT); bool packetIsCompressed = oneAtBit(flags, PACKET_IS_COMPRESSED_BIT); @@ -94,13 +85,12 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar int flightTime = arrivedAt - sentAt + clockSkew; OCTREE_PACKET_INTERNAL_SECTION_SIZE sectionLength = 0; - unsigned int dataBytes = packetLength - (numBytesPacketHeader + OCTREE_PACKET_EXTRA_HEADERS_SIZE); if (extraDebugging) { qCDebug(octree, "OctreeRenderer::processDatagram() ... Got Packet Section" - " color:%s compressed:%s sequence: %u flight:%d usec size:%u data:%u", + " color:%s compressed:%s sequence: %u flight:%d usec size:%lld data:%lld", debug::valueOf(packetIsColored), debug::valueOf(packetIsCompressed), - sequence, flightTime, packetLength, dataBytes); + sequence, flightTime, packet.getSizeWithHeader(), packet.bytesAvailable()); } _packetsInLastWindow++; @@ -111,42 +101,48 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar quint64 totalWaitingForLock = 0; quint64 totalUncompress = 0; quint64 totalReadBitsteam = 0; + + const QUuid& sourceUUID = packet.getSourceID(); int subsection = 1; - while (dataBytes > 0) { + + bool error = false; + + while (packet.bytesAvailable() && !error) { if (packetIsCompressed) { - if (dataBytes > sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE)) { - sectionLength = (*(OCTREE_PACKET_INTERNAL_SECTION_SIZE*)dataAt); - dataAt += sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE); - dataBytes -= sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE); + if (packet.bytesAvailable() > sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE)) { + packet.readPrimitive(§ionLength); } else { sectionLength = 0; - dataBytes = 0; // stop looping something is wrong + error = true; } } else { - sectionLength = dataBytes; + sectionLength = packet.bytesAvailable(); } if (sectionLength) { // ask the VoxelTree to read the bitstream into the tree - ReadBitstreamToTreeParams args(packetIsColored ? WANT_COLOR : NO_COLOR, WANT_EXISTS_BITS, NULL, - sourceUUID, sourceNode, false, packetVersion); + ReadBitstreamToTreeParams args(packetIsColored ? WANT_COLOR : NO_COLOR, WANT_EXISTS_BITS, NULL, + sourceUUID, sourceNode, false, packet.getVersion()); quint64 startLock = usecTimestampNow(); // FIXME STUTTER - there may be an opportunity to bump this lock outside of the // loop to reduce the amount of locking/unlocking we're doing _tree->lockForWrite(); quint64 startUncompress = usecTimestampNow(); + OctreePacketData packetData(packetIsCompressed); - packetData.loadFinalizedContent(dataAt, sectionLength); + packetData.loadFinalizedContent(reinterpret_cast(packet.getPayload() + packet.pos()), + sectionLength); if (extraDebugging) { qCDebug(octree, "OctreeRenderer::processDatagram() ... Got Packet Section" - " color:%s compressed:%s sequence: %u flight:%d usec size:%u data:%u" + " color:%s compressed:%s sequence: %u flight:%d usec size:%lld data:%lld" " subsection:%d sectionLength:%d uncompressed:%d", debug::valueOf(packetIsColored), debug::valueOf(packetIsCompressed), - sequence, flightTime, packetLength, dataBytes, subsection, sectionLength, + sequence, flightTime, packet.getSizeWithHeader(), packet.bytesAvailable(), subsection, sectionLength, packetData.getUncompressedSize()); } + if (extraDebugging) { qCDebug(octree) << "OctreeRenderer::processDatagram() ******* START _tree->readBitstreamToTree()..."; } @@ -158,8 +154,8 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar } _tree->unlock(); - dataBytes -= sectionLength; - dataAt += sectionLength; + // seek forwards in packet + packet.seek(packet.pos() + sectionLength); elementsPerPacket += args.elementsPerPacket; entitiesPerPacket += args.entitiesPerPacket; @@ -228,10 +224,10 @@ void OctreeRenderer::render(RenderArgs* renderArgs) { } } -void OctreeRenderer::clear() { +void OctreeRenderer::clear() { if (_tree) { _tree->lockForWrite(); - _tree->eraseAllOctreeElements(); + _tree->eraseAllOctreeElements(); _tree->unlock(); } } diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index f6c92f81c9..e5114cd760 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -45,7 +45,7 @@ public: virtual void setTree(Octree* newTree); /// process incoming data - virtual void processDatagram(const QByteArray& dataByteArray, const SharedNodePointer& sourceNode); + virtual void processDatagram(NLPacket& packet, SharedNodePointer sourceNode); /// initialize and GPU/rendering related resources virtual void init(); diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index a3799c2f36..d8013f2c03 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -747,20 +747,17 @@ const char* OctreeSceneStats::getItemValue(Item item) { return _itemValueBuffer; } -void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, - bool wasStatsPacket, int nodeClockSkewUsec) { +void OctreeSceneStats::trackIncomingOctreePacket(NLPacket& packet, bool wasStatsPacket, int nodeClockSkewUsec) { const bool wantExtraDebugging = false; - int numBytesPacketHeader = numBytesForPacketHeader(packet); - const unsigned char* dataAt = reinterpret_cast(packet.data()) + numBytesPacketHeader; + // skip past the flags + packet.seek(sizeof(OCTREE_PACKET_FLAGS)); + + OCTREE_PACKET_SEQUENCE sequence; + packet.readPrimitive(&sequence); - //VOXEL_PACKET_FLAGS flags = (*(VOXEL_PACKET_FLAGS*)(dataAt)); - dataAt += sizeof(OCTREE_PACKET_FLAGS); - OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); - - OCTREE_PACKET_SENT_TIME sentAt = (*(OCTREE_PACKET_SENT_TIME*)dataAt); - dataAt += sizeof(OCTREE_PACKET_SENT_TIME); + OCTREE_PACKET_SENT_TIME sentAt; + packet.readPrimitive(&sentAt); //bool packetIsColored = oneAtBit(flags, PACKET_IS_COLOR_BIT); //bool packetIsCompressed = oneAtBit(flags, PACKET_IS_COMPRESSED_BIT); @@ -792,8 +789,8 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet, // track packets here... _incomingPacket++; - _incomingBytes += packet.size(); + _incomingBytes += packet.getSizeWithHeader(); if (!wasStatsPacket) { - _incomingWastedBytes += (MAX_PACKET_SIZE - packet.size()); + _incomingWastedBytes += (MAX_PACKET_SIZE - packet.getSizeWithHeader()); } } diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index a71360a4cf..d840c0d6f6 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -160,7 +160,7 @@ public: quint64 getLastFullTotalBytes() const { return _lastFullTotalBytes; } // Used in client implementations to track individual octree packets - void trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec); + void trackIncomingOctreePacket(NLPacket& packet, bool wasStatsPacket, int nodeClockSkewUsec); quint32 getIncomingPackets() const { return _incomingPacket; } quint64 getIncomingBytes() const { return _incomingBytes; } diff --git a/libraries/render-utils/src/Environment.cpp b/libraries/render-utils/src/Environment.cpp index 411beca0ae..62ec423f62 100644 --- a/libraries/render-utils/src/Environment.cpp +++ b/libraries/render-utils/src/Environment.cpp @@ -28,15 +28,6 @@ #include "SkyFromAtmosphere_vert.h" #include "SkyFromAtmosphere_frag.h" -uint qHash(const HifiSockAddr& sockAddr) { - if (sockAddr.getAddress().isNull()) { - return 0; // shouldn't happen, but if it does, zero is a perfectly valid hash - } - quint32 address = sockAddr.getAddress().toIPv4Address(); - return sockAddr.getPort() + qHash(QByteArray::fromRawData((char*) &address, - sizeof(address))); -} - Environment::Environment() : _initialized(false) { } @@ -53,7 +44,7 @@ void Environment::init() { setupAtmosphereProgram(SkyFromAtmosphere_vert, SkyFromAtmosphere_frag, _skyFromAtmosphereProgram, _skyFromAtmosphereUniformLocations); // start off with a default-constructed environment data - _data[HifiSockAddr()][0]; + _data[QUuid()][0]; _initialized = true; } @@ -98,10 +89,10 @@ void Environment::setupAtmosphereProgram(const char* vertSource, const char* fra void Environment::resetToDefault() { _data.clear(); - _data[HifiSockAddr()][0]; + _data[QUuid()][0]; } -void Environment::renderAtmospheres(gpu::Batch& batch, ViewFrustum& camera) { +void Environment::renderAtmospheres(gpu::Batch& batch, ViewFrustum& camera) { // get the lock for the duration of the call QMutexLocker locker(&_mutex); @@ -142,7 +133,7 @@ EnvironmentData Environment::getClosestData(const glm::vec3& position) { // NOTE: Deprecated - I'm leaving this in for now, but it's not actually used. I made it private -// so that if anyone wants to start using this in the future they will consider how to make it +// so that if anyone wants to start using this in the future they will consider how to make it // work with new physics systems. glm::vec3 Environment::getGravity (const glm::vec3& position) { // @@ -169,7 +160,7 @@ glm::vec3 Environment::getGravity (const glm::vec3& position) { // At or inside a planet, gravity is as set for the planet gravity += glm::normalize(vector) * environmentData.getGravity(); } else { - // Outside a planet, the gravity falls off with distance + // Outside a planet, the gravity falls off with distance gravityStrength = 1.0f / powf(glm::length(vector) / surfaceRadius, 2.0f); gravity += glm::normalize(vector) * environmentData.getGravity() * gravityStrength; } @@ -205,33 +196,28 @@ bool Environment::findCapsulePenetration(const glm::vec3& start, const glm::vec3 return found; } -int Environment::parseData(const HifiSockAddr& senderAddress, const QByteArray& packet) { - // push past the packet header - int bytesRead = numBytesForPacketHeader(packet); - +int Environment::processPacket(NLPacket& packet) { // push past flags, sequence, timestamp - bytesRead += sizeof(OCTREE_PACKET_FLAGS); - bytesRead += sizeof(OCTREE_PACKET_SEQUENCE); - bytesRead += sizeof(OCTREE_PACKET_SENT_TIME); + packet.seek(sizeof(OCTREE_PACKET_FLAGS) + sizeof(OCTREE_PACKET_SEQUENCE) + sizeof(OCTREE_PACKET_SENT_TIME)); // get the lock for the duration of the call QMutexLocker locker(&_mutex); EnvironmentData newData; - while (bytesRead < packet.size()) { - int dataLength = newData.parseData(reinterpret_cast(packet.data()) + bytesRead, - packet.size() - bytesRead); + + while (packet.bytesAvailable() > 0) { + int dataLength = newData.parseData(reinterpret_cast(packet.getPayload() + packet.pos()), + packet.bytesAvailable()); + packet.seek(packet.pos() + dataLength); // update the mapping by address/ID - _data[senderAddress][newData.getID()] = newData; - - bytesRead += dataLength; + _data[packet.getSourceID()][newData.getID()] = newData; } // remove the default mapping, if any - _data.remove(HifiSockAddr()); + _data.remove(QUuid()); - return bytesRead; + return packet.pos(); } void Environment::renderAtmosphere(gpu::Batch& batch, ViewFrustum& camera, const EnvironmentData& data) { diff --git a/libraries/render-utils/src/Environment.h b/libraries/render-utils/src/Environment.h index 65e0df4b36..f2c7d57fa5 100644 --- a/libraries/render-utils/src/Environment.h +++ b/libraries/render-utils/src/Environment.h @@ -36,13 +36,12 @@ public: void endOverride() { _environmentIsOverridden = false; } EnvironmentData getClosestData(const glm::vec3& position); - - - int parseData(const HifiSockAddr& senderSockAddr, const QByteArray& packet); + + int processPacket(NLPacket& packet); private: glm::vec3 getGravity (const glm::vec3& position); // NOTE: Deprecated - bool findCapsulePenetration(const glm::vec3& start, + bool findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration); // NOTE: Deprecated void renderAtmosphere(gpu::Batch& batch, ViewFrustum& camera, const EnvironmentData& data); @@ -79,7 +78,7 @@ private: typedef QHash ServerData; - QHash _data; + QHash _data; EnvironmentData _overrideData; bool _environmentIsOverridden = false; From 859122db5dbdea4fd061e84486a77d4d02a31c59 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 13:32:46 -0700 Subject: [PATCH 322/582] update signature of callbacks for avatar packets --- interface/src/avatar/Avatar.cpp | 6 +-- interface/src/avatar/Avatar.h | 16 +++--- interface/src/avatar/AvatarManager.cpp | 4 ++ interface/src/avatar/AvatarManager.h | 1 + interface/src/avatar/MyAvatar.cpp | 7 ++- interface/src/avatar/MyAvatar.h | 2 +- libraries/avatars/src/AvatarData.cpp | 6 +-- libraries/avatars/src/AvatarData.h | 8 +-- libraries/avatars/src/AvatarHashMap.cpp | 58 +++++++--------------- libraries/avatars/src/AvatarHashMap.h | 8 +-- libraries/networking/src/LimitedNodeList.h | 4 -- libraries/networking/src/Node.h | 5 +- 12 files changed, 53 insertions(+), 72 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 0dde96c7ce..a8067b8dcb 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -988,7 +988,7 @@ void Avatar::setBillboard(const QByteArray& billboard) { _billboardTexture.reset(); } -int Avatar::parseDataAtOffset(const QByteArray& packet, int offset) { +int Avatar::parseDataFromBuffer(const QByteArray& buffer) { if (!_initialized) { // now that we have data for this Avatar we are go for init init(); @@ -997,7 +997,7 @@ int Avatar::parseDataAtOffset(const QByteArray& packet, int offset) { // change in position implies movement glm::vec3 oldPosition = _position; - int bytesRead = AvatarData::parseDataAtOffset(packet, offset); + int bytesRead = AvatarData::parseDataFromBuffer(buffer); const float MOVE_DISTANCE_THRESHOLD = 0.001f; _moving = glm::distance(oldPosition, _position) > MOVE_DISTANCE_THRESHOLD; @@ -1123,7 +1123,7 @@ void Avatar::setShowDisplayName(bool showDisplayName) { } } -// virtual +// virtual void Avatar::computeShapeInfo(ShapeInfo& shapeInfo) { const CapsuleShape& capsule = _skeletonModel.getBoundingShape(); shapeInfo.setCapsuleY(capsule.getRadius(), capsule.getHalfHeight()); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index b23059acb0..b4bf0cf097 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -85,10 +85,10 @@ public: virtual void render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, bool postLighting = false); - bool addToScene(AvatarSharedPointer self, std::shared_ptr scene, + bool addToScene(AvatarSharedPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges); - void removeFromScene(AvatarSharedPointer self, std::shared_ptr scene, + void removeFromScene(AvatarSharedPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges); //setters @@ -146,7 +146,7 @@ public: void setShowDisplayName(bool showDisplayName); - virtual int parseDataAtOffset(const QByteArray& packet, int offset); + virtual int parseDataFromBuffer(const QByteArray& buffer); static void renderJointConnectingCone( gpu::Batch& batch, glm::vec3 position1, glm::vec3 position2, float radius1, float radius2, const glm::vec4& color); @@ -163,7 +163,7 @@ public: Q_INVOKABLE glm::quat getJointCombinedRotation(const QString& name) const; Q_INVOKABLE void setJointModelPositionAndOrientation(int index, const glm::vec3 position, const glm::quat& rotation); - Q_INVOKABLE void setJointModelPositionAndOrientation(const QString& name, const glm::vec3 position, + Q_INVOKABLE void setJointModelPositionAndOrientation(const QString& name, const glm::vec3 position, const glm::quat& rotation); Q_INVOKABLE glm::vec3 getNeckPosition() const; @@ -179,8 +179,8 @@ public: void slamPosition(const glm::vec3& position); - // Call this when updating Avatar position with a delta. This will allow us to - // _accurately_ measure position changes and compute the resulting velocity + // Call this when updating Avatar position with a delta. This will allow us to + // _accurately_ measure position changes and compute the resulting velocity // (otherwise floating point error will cause problems at large positions). void applyPositionDelta(const glm::vec3& delta); @@ -203,9 +203,9 @@ protected: // These position histories and derivatives are in the world-frame. // The derivatives are the MEASURED results of all external and internal forces - // and are therefore READ-ONLY --> motion control of the Avatar is NOT obtained + // and are therefore READ-ONLY --> motion control of the Avatar is NOT obtained // by setting these values. - // Floating point error prevents us from accurately measuring velocity using a naive approach + // Floating point error prevents us from accurately measuring velocity using a naive approach // (e.g. vel = (pos - lastPos)/dt) so instead we use _positionDeltaAccumulator. glm::vec3 _positionDeltaAccumulator; glm::vec3 _lastVelocity; diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 944f16fd34..47d7ff06c5 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -56,6 +56,10 @@ static void localLightFromScriptValue(const QScriptValue& value, AvatarManager:: vec3FromScriptValue(value.property("color"), light.color); } +AvatarManager::AvatarManager() { + +} + void AvatarManager::registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, localLightToScriptValue, localLightFromScriptValue); qScriptRegisterSequenceMetaType >(engine); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 9d1c94a47e..dad3f488cf 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -29,6 +29,7 @@ class AvatarManager : public AvatarHashMap { SINGLETON_DEPENDENCY public: + AvatarManager(); /// Registers the script types associated with the avatar manager. static void registerMetaTypes(QScriptEngine* engine); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 2dfe4216be..ef93485a38 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -870,12 +870,11 @@ AttachmentData MyAvatar::loadAttachmentData(const QUrl& modelURL, const QString& return attachment; } -int MyAvatar::parseDataAtOffset(const QByteArray& packet, int offset) { +int MyAvatar::parseDataFromBuffer(const QByteArray& buffer) { qCDebug(interfaceapp) << "Error: ignoring update packet for MyAvatar" - << " packetLength = " << packet.size() - << " offset = " << offset; + << " packetLength = " << buffer.size() // this packet is just bad, so we pretend that we unpacked it ALL - return packet.size() - offset; + return buffer.size(); } void MyAvatar::sendKillAvatar() { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 34dfcad2ad..62d7cc57d3 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -102,7 +102,7 @@ public: eyeContactTarget getEyeContactTarget(); - virtual int parseDataAtOffset(const QByteArray& packet, int offset); + virtual int parseDataFromBuffer(const QByteArray& buffer); static void sendKillAvatar(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 5ea3b4c669..01a7a1c1dd 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -265,7 +265,7 @@ bool AvatarData::shouldLogError(const quint64& now) { } // read data in packet starting at byte offset and return number of bytes parsed -int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { +int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { // lazily allocate memory for HeadData in case we're not an Avatar instance if (!_headData) { @@ -277,7 +277,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { _handData = new HandData(this); } - const unsigned char* startPosition = reinterpret_cast(packet.data()) + offset; + const unsigned char* startPosition = reinterpret_cast(buffer.data()); const unsigned char* sourceBuffer = startPosition; quint64 now = usecTimestampNow(); @@ -299,7 +299,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { // = 45 bytes int minPossibleSize = 45; - int maxAvailableSize = packet.size() - offset; + int maxAvailableSize = buffer.size(); if (minPossibleSize > maxAvailableSize) { if (shouldLogError(now)) { qCDebug(avatars) << "Malformed AvatarData packet at the start; " diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index c482f52bf1..ad6be52a61 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -66,12 +66,12 @@ typedef QHash AvatarHash; const quint32 AVATAR_MOTION_KEYBOARD_MOTOR_ENABLED = 1U << 0; const quint32 AVATAR_MOTION_SCRIPTED_MOTOR_ENABLED = 1U << 1; -const quint32 AVATAR_MOTION_DEFAULTS = +const quint32 AVATAR_MOTION_DEFAULTS = AVATAR_MOTION_KEYBOARD_MOTOR_ENABLED | AVATAR_MOTION_SCRIPTED_MOTOR_ENABLED; // these bits will be expanded as features are exposed -const quint32 AVATAR_MOTION_SCRIPTABLE_BITS = +const quint32 AVATAR_MOTION_SCRIPTABLE_BITS = AVATAR_MOTION_SCRIPTED_MOTOR_ENABLED; const qint64 AVATAR_SILENCE_THRESHOLD_USECS = 5 * USECS_PER_SECOND; @@ -181,7 +181,7 @@ public: /// \param packet byte array of data /// \param offset number of bytes into packet where data starts /// \return number of bytes parsed - virtual int parseDataAtOffset(const QByteArray& packet, int offset); + virtual int parseDataFromBuffer(const QByteArray& buffer); // Body Rotation (degrees) float getBodyYaw() const { return _bodyYaw; } @@ -241,7 +241,7 @@ public: Q_INVOKABLE virtual void clearJointsData(); /// Returns the index of the joint with the specified name, or -1 if not found/unknown. - Q_INVOKABLE virtual int getJointIndex(const QString& name) const { return _jointIndices.value(name) - 1; } + Q_INVOKABLE virtual int getJointIndex(const QString& name) const { return _jointIndices.value(name) - 1; } Q_INVOKABLE virtual QStringList getJointNames() const { return _jointNames; } diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 03187a02bc..c00ba1f08c 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -52,48 +52,37 @@ AvatarSharedPointer AvatarHashMap::addAvatar(const QUuid& sessionUUID, const QWe return avatar; } -void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size()); - int bytesRead = 0; - - SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (avatarMixer) { - avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); - } +void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, SharedNodePointer sendingNode) { // enumerate over all of the avatars in this packet // only add them if mixerWeakPointer points to something (meaning that mixer is still around) - while (bytesRead < data.size() && avatarMixer.data()) { - QUuid sessionUUID = QUuid::fromRfc4122(data.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); - bytesRead += NUM_BYTES_RFC4122_UUID; + while (packet->bytesAvailable()) { + QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); if (sessionUUID != _lastOwnerSessionUUID) { AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - avatar = addAvatar(sessionUUID, avatarMixer); + avatar = addAvatar(sessionUUID, sendingNode); } // have the matching (or new) avatar parse the data from the packet - bytesRead += avatar->parseDataAtOffset(data, bytesRead); + int bytesRead = avatar->parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->pos())); + packet->seek(packet->pos() + bytesRead); } else { // create a dummy AvatarData class to throw this data on the ground AvatarData dummyData; - bytesRead += dummyData.parseDataAtOffset(data, bytesRead); + int bytesRead = dummyData.parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->pos())); + packet->seek(packet->pos() + bytesRead); } } } -void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer sendingNode) { // setup a data stream to parse the packet - QDataStream identityStream { packet.data() }; + QDataStream identityStream(packet.data()); QUuid sessionUUID; - - SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (avatarMixer) { - avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); - } - + while (!identityStream.atEnd()) { QUrl faceMeshURL, skeletonURL; @@ -104,7 +93,7 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer packet, // mesh URL for a UUID, find avatar in our list AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - avatar = addAvatar(sessionUUID, avatarMixer); + avatar = addAvatar(sessionUUID, sendingNode); } if (avatar->getFaceModelURL() != faceMeshURL) { avatar->setFaceModelURL(faceMeshURL); @@ -124,34 +113,23 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer packet, } } -void AvatarHashMap::processAvatarBillboardPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - const auto data = QByteArray::fromRawData(packet->getPayload(), packet->size()); - QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(data, NUM_BYTES_RFC4122_UUID)); - - SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (avatarMixer) { - avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); - } +void AvatarHashMap::processAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { - avatar = addAvatar(sessionUUID, avatarMixer); + avatar = addAvatar(sessionUUID, sendingNode); } - QByteArray billboard = data.mid(NUM_BYTES_RFC4122_UUID); + QByteArray billboard = packet->read(packet->bytesAvailable()); if (avatar->getBillboard() != billboard) { avatar->setBillboard(billboard); } } -void AvatarHashMap::processKillAvatar(QSharedPointer packet, HifiSockAddr senderSockAddr) { - SharedNodePointer avatarMixer = DependencyManager::get()->nodeWithUUID(packet->getSourceID()); - if (avatarMixer) { - avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); - } - +void AvatarHashMap::processKillAvatar(QSharedPointer packet, SharedNodePointer sendingNode) { // read the node id - QUuid sessionUUID = QUuid::fromRfc4122(QByteArray(packet->getPayload(), NUM_BYTES_RFC4122_UUID)); + QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); removeAvatar(sessionUUID); } diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 3c979e35f8..071798e4f8 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -38,10 +38,10 @@ public slots: private slots: void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); - void processAvatarDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void processAvatarIdentityPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void processAvatarBillboardPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void processKillAvatar(QSharedPointer packet, HifiSockAddr senderSockAddr); + void processAvatarDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void processAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void processAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void processKillAvatar(QSharedPointer packet, SharedNodePointer sendingNode); protected: AvatarHashMap(); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 2e0bb5b6b7..bfcfd61c20 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -64,9 +63,6 @@ const QString USERNAME_UUID_REPLACEMENT_STATS_KEY = "$username"; class HifiSockAddr; -typedef QSharedPointer SharedNodePointer; -Q_DECLARE_METATYPE(SharedNodePointer) - using namespace tbb; typedef std::pair UUIDNodePair; typedef concurrent_unordered_map NodeHash; diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 83bdf0ebd3..a10b5ec087 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -17,8 +17,8 @@ #include #include +#include #include -#include #include "HifiSockAddr.h" #include "NetworkPeer.h" @@ -92,6 +92,9 @@ private: PacketTypeSequenceMap _lastSequenceNumbers; }; +typedef QSharedPointer SharedNodePointer; +Q_DECLARE_METATYPE(SharedNodePointer) + QDebug operator<<(QDebug debug, const Node &message); #endif // hifi_Node_h From ca1ff9b0f5a87a50e1802035380a286f7538fcf6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 13:34:36 -0700 Subject: [PATCH 323/582] fix a couple of compile errors for avatar changes --- interface/src/avatar/AvatarManager.cpp | 4 ---- interface/src/avatar/AvatarManager.h | 2 -- interface/src/avatar/MyAvatar.cpp | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 47d7ff06c5..944f16fd34 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -56,10 +56,6 @@ static void localLightFromScriptValue(const QScriptValue& value, AvatarManager:: vec3FromScriptValue(value.property("color"), light.color); } -AvatarManager::AvatarManager() { - -} - void AvatarManager::registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, localLightToScriptValue, localLightFromScriptValue); qScriptRegisterSequenceMetaType >(engine); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index dad3f488cf..5e3fe9543a 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -29,8 +29,6 @@ class AvatarManager : public AvatarHashMap { SINGLETON_DEPENDENCY public: - AvatarManager(); - /// Registers the script types associated with the avatar manager. static void registerMetaTypes(QScriptEngine* engine); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index ef93485a38..bb6188f52c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -872,7 +872,7 @@ AttachmentData MyAvatar::loadAttachmentData(const QUrl& modelURL, const QString& int MyAvatar::parseDataFromBuffer(const QByteArray& buffer) { qCDebug(interfaceapp) << "Error: ignoring update packet for MyAvatar" - << " packetLength = " << buffer.size() + << " packetLength = " << buffer.size(); // this packet is just bad, so we pretend that we unpacked it ALL return buffer.size(); } From 9de6828b032b71e8ccb743643708e9ec0b02f8b4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 14:24:06 -0700 Subject: [PATCH 324/582] Remove readPendingDatagram from AudioMixer --- assignment-client/src/audio/AudioMixer.cpp | 27 ---------------------- assignment-client/src/audio/AudioMixer.h | 2 -- 2 files changed, 29 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index d8c01dafcd..018f946771 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -543,11 +543,6 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { } } -void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { - auto nodeList = DependencyManager::get(); - nodeList->processNodeData(senderSockAddr, receivedPacket); -} - void AudioMixer::handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); nodeList->findNodeAndUpdateWithDataFromPacket(packet); @@ -684,28 +679,6 @@ void AudioMixer::run() { _datagramProcessingThread = new QThread(this); _datagramProcessingThread->setObjectName("Datagram Processor Thread"); - // create an AudioMixerDatagramProcessor and move it to that thread - AudioMixerDatagramProcessor* datagramProcessor = new AudioMixerDatagramProcessor(nodeList->getNodeSocket(), thread()); - datagramProcessor->moveToThread(_datagramProcessingThread); - - // remove the NodeList as the parent of the node socket - nodeList->getNodeSocket().setParent(NULL); - nodeList->getNodeSocket().moveToThread(_datagramProcessingThread); - - // let the datagram processor handle readyRead from node socket - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, - datagramProcessor, &AudioMixerDatagramProcessor::readPendingDatagrams); - - // connect to the datagram processing thread signal that tells us we have to handle a packet - connect(datagramProcessor, &AudioMixerDatagramProcessor::packetRequiresProcessing, this, &AudioMixer::readPendingDatagram); - - // delete the datagram processor and the associated thread when the QThread quits - connect(_datagramProcessingThread, &QThread::finished, datagramProcessor, &QObject::deleteLater); - connect(datagramProcessor, &QObject::destroyed, _datagramProcessingThread, &QThread::deleteLater); - - // start the datagram processing thread - _datagramProcessingThread->start(); - nodeList->addNodeTypeToInterestSet(NodeType::Agent); nodeList->linkedDataCreateCallback = [](Node* node) { diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index c88c5a6242..50ec3c6d18 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -35,8 +35,6 @@ public slots: /// threaded run of assignment void run(); - void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); - void sendStatsPacket(); static const InboundAudioStream::Settings& getStreamSettings() { return _streamSettings; } From ede39515d8a08eae5d65ca43ad4b74be91e2ac42 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 14:26:10 -0700 Subject: [PATCH 325/582] update parseData for new network API --- domain-server/src/DomainServerNodeData.h | 2 +- libraries/audio-client/src/AudioClient.cpp | 65 ++++++-------------- libraries/audio-client/src/AudioClient.h | 11 ++-- libraries/audio-client/src/AudioIOStats.cpp | 17 +++-- libraries/audio-client/src/AudioIOStats.h | 6 +- libraries/audio/src/InboundAudioStream.cpp | 38 ++++++------ libraries/audio/src/InboundAudioStream.h | 8 +-- libraries/networking/src/Assignment.h | 2 +- libraries/networking/src/LimitedNodeList.cpp | 24 +++----- libraries/networking/src/LimitedNodeList.h | 3 +- libraries/networking/src/NodeData.h | 5 +- libraries/octree/src/OctreeQuery.cpp | 11 ++-- libraries/octree/src/OctreeQuery.h | 2 +- 13 files changed, 76 insertions(+), 118 deletions(-) diff --git a/domain-server/src/DomainServerNodeData.h b/domain-server/src/DomainServerNodeData.h index d2efced1ef..00c5f659ca 100644 --- a/domain-server/src/DomainServerNodeData.h +++ b/domain-server/src/DomainServerNodeData.h @@ -24,7 +24,7 @@ class DomainServerNodeData : public NodeData { public: DomainServerNodeData(); - int parseData(const QByteArray& packet) { return 0; } + int parseData(NLPacket& packet, QSharedPointer sendingNode) { return 0; } const QJsonObject& getStatsJSONObject() const { return _statsJSONObject; } diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index c946586074..ef7a16f983 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -33,7 +33,7 @@ #include #include -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdouble-promotion" #endif @@ -142,10 +142,10 @@ AudioClient::AudioClient() : configureGverbFilter(_gverb); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::AudioEnvironment, this, "handleAudioStreamStatsPacket"); - packetReceiver.registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioEnvironmentDataPacket"); + packetReceiver.registerPacketListener(PacketType::AudioStreamStats, &_stats, "handleAudioStreamStatsPacket"); + packetReceiver.registerPacketListener(PacketType::AudioEnvironment, this, "handleAudioEnvironmentDataPacket"); + packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleAudioDataPacket"); packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioDataPacket"); - packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFrame"); packetReceiver.registerPacketListener(PacketType::NoisyMute, this, "handleNoisyMutePacket"); packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } @@ -535,35 +535,24 @@ void AudioClient::stop() { } } -void AudioClient::handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - _stats.parseAudioStreamStatsPacket(packet->getData()); - - updateLastHeardFromAudioMixer(packet); -} - -void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - const char* dataAt = packet->getPayload(); +void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer sendingNode) { char bitset; - memcpy(&bitset, dataAt, sizeof(char)); - dataAt += sizeof(char); + packet->readPrimitive(&bitset); - bool hasReverb = oneAtBit(bitset, HAS_REVERB_BIT);; + bool hasReverb = oneAtBit(bitset, HAS_REVERB_BIT); + if (hasReverb) { float reverbTime, wetLevel; - memcpy(&reverbTime, dataAt, sizeof(float)); - dataAt += sizeof(float); - memcpy(&wetLevel, dataAt, sizeof(float)); - dataAt += sizeof(float); + packet->readPrimitive(&reverbTime); + packet->readPrimitive(&wetLevel); _receivedAudioStream.setReverb(reverbTime, wetLevel); } else { _receivedAudioStream.clearReverb(); - } - - updateLastHeardFromAudioMixer(packet); + } } -void AudioClient::handleAudioDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleAudioDataPacket(QSharedPointer packet, SharedNodePointer sendingNode) { auto nodeList = DependencyManager::get(); nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveFirstAudioPacket); @@ -577,45 +566,29 @@ void AudioClient::handleAudioDataPacket(QSharedPointer packet, HifiSoc } // Audio output must exist and be correctly set up if we're going to process received audio - _receivedAudioStream.parseData(packet->getData()); + _receivedAudioStream.parseData(*packet, sendingNode); } - - updateLastHeardFromAudioMixer(packet); } -void AudioClient::handleSilentAudioFrame(QSharedPointer packet, HifiSockAddr senderSockAddr) { - updateLastHeardFromAudioMixer(packet); -} - -void AudioClient::handleNoisyMutePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleNoisyMutePacket(QSharedPointer packet, SharedNodePointer sendingNode) { if (!_muted) { toggleMute(); + // TODO reimplement on interface side //AudioScriptingInterface::getInstance().mutedByMixer(); } } -void AudioClient::handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void AudioClient::handleMuteEnvironmentPacket(QSharedPointer packet, SharedNodePointer sendingNode) { glm::vec3 position; float radius; - - int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::MuteEnvironment); - memcpy(&position, packet->getPayload(), sizeof(glm::vec3)); - memcpy(&radius, packet->getPayload() + sizeof(glm::vec3), sizeof(float)); + + packet->readPrimitive(&position); + packet->readPrimitive(&radius); emit muteEnvironmentRequested(position, radius); } -void AudioClient::updateLastHeardFromAudioMixer(QSharedPointer& packet) { - // update having heard from the audio-mixer and record the bytes received - auto nodeList = DependencyManager::get(); - SharedNodePointer audioMixer = nodeList->nodeWithUUID(packet->getSourceID()); - if (audioMixer) { - audioMixer->setLastHeardMicrostamp(usecTimestampNow()); - } - -} - QString AudioClient::getDefaultDeviceName(QAudio::Mode mode) { QAudioDeviceInfo deviceInfo = defaultAudioDeviceForMode(mode); return deviceInfo.deviceName(); diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 8812473a79..cf57b9dca1 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -139,12 +139,10 @@ public slots: void start(); void stop(); - void handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleAudioEnvironmentDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleAudioDataPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleSilentAudioFrame(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleNoisyMutePacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleAudioEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleAudioDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleNoisyMutePacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleMuteEnvironmentPacket(QSharedPointer packet, SharedNodePointer sendingNode); void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); } void handleAudioInput(); @@ -214,7 +212,6 @@ private slots: void audioStateChanged(QAudio::State state); private: - void updateLastHeardFromAudioMixer(QSharedPointer& packet); void outputFormatChanged(); QByteArray firstInputFrame; diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index 8f7ab2ecaa..931e9badeb 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -63,27 +63,24 @@ void AudioIOStats::sentPacket() { _lastSentAudioPacket = now; } } -void AudioIOStats::parseAudioStreamStatsPacket(const QByteArray& packet) { - - int numBytesPacketHeader = numBytesForPacketHeader(packet); - const char* dataAt = packet.constData() + numBytesPacketHeader; +void AudioIOStats::processStreamStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode) { // parse the appendFlag, clear injected audio stream stats if 0 - quint8 appendFlag = *(reinterpret_cast(dataAt)); - dataAt += sizeof(quint8); + quint8 appendFlag; + packet->readPrimitive(&appendFlag); + if (!appendFlag) { _mixerInjectedStreamStatsMap.clear(); } // parse the number of stream stats structs to follow - quint16 numStreamStats = *(reinterpret_cast(dataAt)); - dataAt += sizeof(quint16); + quint16 numStreamStats; + packet->readPrimitive(&numStreamStats); // parse the stream stats AudioStreamStats streamStats; for (quint16 i = 0; i < numStreamStats; i++) { - memcpy(&streamStats, dataAt, sizeof(AudioStreamStats)); - dataAt += sizeof(AudioStreamStats); + packet->readPrimitive(&streamStats); if (streamStats._streamType == PositionalAudioStream::Microphone) { _mixerAvatarStreamStats = streamStats; diff --git a/libraries/audio-client/src/AudioIOStats.h b/libraries/audio-client/src/AudioIOStats.h index 07bf349ad9..da0acf2fa3 100644 --- a/libraries/audio-client/src/AudioIOStats.h +++ b/libraries/audio-client/src/AudioIOStats.h @@ -17,6 +17,8 @@ #include #include +#include +#include class MixedProcessedAudioStream; @@ -41,7 +43,7 @@ public: const MovingMinMaxAvg& getPacketSentTimeGaps() const { return _packetSentTimeGaps; } void sendDownstreamAudioStatsPacket(); - void parseAudioStreamStatsPacket(const QByteArray& packet); + void processStreamStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode); private: MixedProcessedAudioStream* _receivedAudioStream; @@ -57,4 +59,4 @@ private: MovingMinMaxAvg _packetSentTimeGaps; }; -#endif // hifi_AudioIOStats_h \ No newline at end of file +#endif // hifi_AudioIOStats_h diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 928662d2e8..1c061b3aaa 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -11,6 +11,9 @@ #include +#include +#include + #include "InboundAudioStream.h" #include "PacketHeaders.h" @@ -96,28 +99,23 @@ void InboundAudioStream::perSecondCallbackForUpdatingStats() { _timeGapStatsForStatsPacket.currentIntervalComplete(); } -int InboundAudioStream::parseData(const QByteArray& packet) { - - PacketType::Value packetType = packetTypeForPacket(packet); - QUuid senderUUID = uuidFromPacketHeader(packet); - - // parse header - int numBytesHeader = numBytesForPacketHeader(packet); - const char* dataAt = packet.constData() + numBytesHeader; - int readBytes = numBytesHeader; +int InboundAudioStream::parseData(NLPacket& packet, SharedNodePointer sendingNode) { // parse sequence number and track it - quint16 sequence = *(reinterpret_cast(dataAt)); - dataAt += sizeof(quint16); - readBytes += sizeof(quint16); - SequenceNumberStats::ArrivalInfo arrivalInfo = _incomingSequenceNumberStats.sequenceNumberReceived(sequence, senderUUID); + quint16 sequence; + packet.readPrimitive(&sequence); + SequenceNumberStats::ArrivalInfo arrivalInfo = _incomingSequenceNumberStats.sequenceNumberReceived(sequence, + sendingNode->getUUID()); packetReceivedUpdateTimingStats(); int networkSamples; // parse the info after the seq number and before the audio data (the stream properties) - readBytes += parseStreamProperties(packetType, packet.mid(readBytes), networkSamples); + int propertyBytes = parseStreamProperties(packet.getType(), + QByteArray::fromRawData(packet.getPayload(), packet.pos()), + networkSamples); + packet.seek(packet.pos() + propertyBytes); // handle this packet based on its arrival status. switch (arrivalInfo._status) { @@ -132,10 +130,12 @@ int InboundAudioStream::parseData(const QByteArray& packet) { } case SequenceNumberStats::OnTime: { // Packet is on time; parse its data to the ringbuffer - if (packetType == PacketType::SilentAudioFrame) { + if (packet.getType() == PacketType::SilentAudioFrame) { writeDroppableSilentSamples(networkSamples); } else { - readBytes += parseAudioData(packetType, packet.mid(readBytes), networkSamples); + int audioBytes = parseAudioData(packet.getType(), QByteArray::fromRawData(packet.getPayload(), packet.pos()), + networkSamples); + packet.seek(packet.pos() + audioBytes); } break; } @@ -165,7 +165,7 @@ int InboundAudioStream::parseData(const QByteArray& packet) { framesAvailableChanged(); - return readBytes; + return packet.pos(); } int InboundAudioStream::parseStreamProperties(PacketType::Value type, const QByteArray& packetAfterSeqNum, int& numAudioSamples) { @@ -314,7 +314,7 @@ void InboundAudioStream::setToStarved() { starvesInWindow++; } while (starvesIterator != end); - // this starve put us over the starve threshold. update _desiredJitterBufferFrames to + // this starve put us over the starve threshold. update _desiredJitterBufferFrames to // value determined by window A. if (starvesInWindow >= _starveThreshold) { int calculatedJitterBufferFrames; @@ -398,7 +398,7 @@ void InboundAudioStream::packetReceivedUpdateTimingStats() { _timeGapStatsForDesiredReduction.update(gap); if (_timeGapStatsForDesiredCalcOnTooManyStarves.getNewStatsAvailableFlag()) { - _calculatedJitterBufferFramesUsingMaxGap = ceilf((float)_timeGapStatsForDesiredCalcOnTooManyStarves.getWindowMax() + _calculatedJitterBufferFramesUsingMaxGap = ceilf((float)_timeGapStatsForDesiredCalcOnTooManyStarves.getWindowMax() / (float) AudioConstants::NETWORK_FRAME_USECS); _timeGapStatsForDesiredCalcOnTooManyStarves.clearNewStatsAvailableFlag(); } diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index cb8494f23e..106caa11ef 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -80,7 +80,7 @@ public: {} // max number of frames over desired in the ringbuffer. - int _maxFramesOverDesired; + int _maxFramesOverDesired; // if false, _desiredJitterBufferFrames will always be _staticDesiredJitterBufferFrames. Otherwise, // either fred or philip's method will be used to calculate _desiredJitterBufferFrames based on packet timegaps. @@ -107,7 +107,7 @@ public: virtual void resetStats(); void clearBuffer(); - virtual int parseData(const QByteArray& packet); + virtual int parseData(NLPacket& packet, QSharedPointer sendingNode); int popFrames(int maxFrames, bool allOrNothing, bool starveIfNoFramesPopped = true); int popSamples(int maxSamples, bool allOrNothing, bool starveIfNoSamplesPopped = true); @@ -131,7 +131,7 @@ public: virtual AudioStreamStats getAudioStreamStats() const; /// returns the desired number of jitter buffer frames under the dyanmic jitter buffers scheme - int getCalculatedJitterBufferFrames() const { return _useStDevForJitterCalc ? + int getCalculatedJitterBufferFrames() const { return _useStDevForJitterCalc ? _calculatedJitterBufferFramesUsingStDev : _calculatedJitterBufferFramesUsingMaxGap; }; /// returns the desired number of jitter buffer frames using Philip's method @@ -217,7 +217,7 @@ protected: bool _dynamicJitterBuffers; // if false, _desiredJitterBufferFrames is locked at 1 (old behavior) int _staticDesiredJitterBufferFrames; - // if jitter buffer is dynamic, this determines what method of calculating _desiredJitterBufferFrames + // if jitter buffer is dynamic, this determines what method of calculating _desiredJitterBufferFrames // if true, Philip's timegap std dev calculation is used. Otherwise, Freddy's max timegap calculation is used bool _useStDevForJitterCalc; diff --git a/libraries/networking/src/Assignment.h b/libraries/networking/src/Assignment.h index a8338a7b5a..1e4c985583 100644 --- a/libraries/networking/src/Assignment.h +++ b/libraries/networking/src/Assignment.h @@ -86,7 +86,7 @@ public: const char* getTypeName() const; // implement parseData to return 0 so we can be a subclass of NodeData - int parseData(const QByteArray& packet) { return 0; } + int parseData(NLPacket& packet, SharedNodePointer sendingNode) { return 0; } friend QDebug operator<<(QDebug debug, const Assignment& assignment); friend QDataStream& operator<<(QDataStream &out, const Assignment& assignment); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 47a7a4b99b..d269db8bed 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -231,35 +231,25 @@ PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid return _packetSequenceNumbers[nodeUUID][packetType]++; } -int LimitedNodeList::updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, QSharedPointer packet) { - QMutexLocker locker(&matchingNode->getMutex()); +int LimitedNodeList::updateNodeWithDataFromPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + QMutexLocker locker(&sendingNode->getMutex()); // if this was a sequence numbered packet we should store the last seq number for // a packet of this type for this node if (SEQUENCE_NUMBERED_PACKETS.contains(packet->getType())) { - matchingNode->setLastSequenceNumberForPacketType(packet->readSequenceNumber(), packet->getType()); + sendingNode->setLastSequenceNumberForPacketType(packet->readSequenceNumber(), packet->getType()); } - NodeData* linkedData = matchingNode->getLinkedData(); + NodeData* linkedData = sendingNode->getLinkedData(); if (!linkedData && linkedDataCreateCallback) { - linkedDataCreateCallback(matchingNode.data()); + linkedDataCreateCallback(sendingNode.data()); } if (linkedData) { QMutexLocker linkedDataLocker(&linkedData->getMutex()); - return linkedData->parseData(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + return linkedData->parseData(*packet, sendingNode); } - return 0; -} - -int LimitedNodeList::findNodeAndUpdateWithDataFromPacket(QSharedPointer packet) { - SharedNodePointer matchingNode = nodeWithUUID(packet->getSourceID()); - - if (matchingNode) { - return updateNodeWithDataFromPacket(matchingNode, packet); - } - - // we weren't able to match the sender address to the address we have for this node, unlock and don't parse + return 0; } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index bfcfd61c20..44d853919a 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -155,8 +155,7 @@ public: void processKillNode(const QByteArray& datagram); - int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, QSharedPointer packet); - int findNodeAndUpdateWithDataFromPacket(const QSharedPointer packet); + int updateNodeWithDataFromPacket(QSharedPointer packet, SharedNodePointer matchingNode); unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) { assert(false); return 0; } SharedNodePointer soloNodeOfType(char nodeType); diff --git a/libraries/networking/src/NodeData.h b/libraries/networking/src/NodeData.h index b865e444a9..d323c72184 100644 --- a/libraries/networking/src/NodeData.h +++ b/libraries/networking/src/NodeData.h @@ -14,6 +14,9 @@ #include #include +#include + +#include "NLPacket.h" class Node; @@ -22,7 +25,7 @@ class NodeData : public QObject { public: NodeData(); virtual ~NodeData() = 0; - virtual int parseData(const QByteArray& packet) = 0; + virtual int parseData(NLPacket& packet, QSharedPointer sendingNode) = 0; QMutex& getMutex() { return _mutex; } diff --git a/libraries/octree/src/OctreeQuery.cpp b/libraries/octree/src/OctreeQuery.cpp index 08197a587e..ea568387f5 100644 --- a/libraries/octree/src/OctreeQuery.cpp +++ b/libraries/octree/src/OctreeQuery.cpp @@ -64,13 +64,10 @@ int OctreeQuery::getBroadcastData(unsigned char* destinationBuffer) { } // called on the other nodes - assigns it to my views of the others -int OctreeQuery::parseData(const QByteArray& packet) { - - // increment to push past the packet header - int numBytesPacketHeader = numBytesForPacketHeader(packet); - - const unsigned char* startPosition = reinterpret_cast(packet.data()); - const unsigned char* sourceBuffer = startPosition + numBytesPacketHeader; +int OctreeQuery::parseData(NLPacket& packet, QSharedPointer sendingNode) { + + const unsigned char* startPosition = reinterpret_cast(packet.getPayload()); + const unsigned char* sourceBuffer = startPosition; // camera details memcpy(&_cameraPosition, sourceBuffer, sizeof(_cameraPosition)); diff --git a/libraries/octree/src/OctreeQuery.h b/libraries/octree/src/OctreeQuery.h index 3c204ff938..83cb828112 100644 --- a/libraries/octree/src/OctreeQuery.h +++ b/libraries/octree/src/OctreeQuery.h @@ -48,7 +48,7 @@ public: virtual ~OctreeQuery() {} int getBroadcastData(unsigned char* destinationBuffer); - int parseData(const QByteArray& packet); + int parseData(NLPacket& packet, QSharedPointer sendingNode); // getters for camera details const glm::vec3& getCameraPosition() const { return _cameraPosition; } From 601e8d6e6863901dc1dd23fe1cc99d27ba041008 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 14:28:46 -0700 Subject: [PATCH 326/582] fix AssignmentClientChildData parseData override --- assignment-client/src/AssignmentClientChildData.cpp | 11 +++++++++++ assignment-client/src/AssignmentClientChildData.h | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/AssignmentClientChildData.cpp b/assignment-client/src/AssignmentClientChildData.cpp index de34613ec9..cc714e629d 100644 --- a/assignment-client/src/AssignmentClientChildData.cpp +++ b/assignment-client/src/AssignmentClientChildData.cpp @@ -1,3 +1,13 @@ +// +// AssignmentClientChildData.cpp +// assignment-client/src +// +// Created by Stephen Birarda on 07/13/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 "AssignmentClientChildData.h" @@ -5,4 +15,5 @@ AssignmentClientChildData::AssignmentClientChildData(QString childType) : _childType(childType) { + } diff --git a/assignment-client/src/AssignmentClientChildData.h b/assignment-client/src/AssignmentClientChildData.h index 6fd5f72f7f..c8116a9959 100644 --- a/assignment-client/src/AssignmentClientChildData.h +++ b/assignment-client/src/AssignmentClientChildData.h @@ -23,7 +23,7 @@ class AssignmentClientChildData : public NodeData { void setChildType(QString childType) { _childType = childType; } // implement parseData to return 0 so we can be a subclass of NodeData - int parseData(const QByteArray& packet) { return 0; } + int parseData(NLPacket& packet, QSharedPointer sendingNode) { return 0; } private: QString _childType; From d242f5d5d980f76d54baf733f557172bf42816c1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 14:35:03 -0700 Subject: [PATCH 327/582] repair AudioMixerClientData parseData --- .../src/audio/AudioMixerClientData.cpp | 35 +++++++++++-------- .../src/audio/AudioMixerClientData.h | 4 +-- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 13cfe4d1a0..59f5982159 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -49,20 +49,18 @@ AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() const { return NULL; } -int AudioMixerClientData::parseData(const QByteArray& packet) { - PacketType::Value packetType = packetTypeForPacket(packet); +int AudioMixerClientData::parseData(NLPacket& packet, SharedNodePointer sendingNode) { + PacketType::Value packetType = packet.getType(); + if (packetType == PacketType::AudioStreamStats) { - const char* dataAt = packet.data(); - // skip over header, appendFlag, and num stats packed - dataAt += (numBytesForPacketHeader(packet) + sizeof(quint8) + sizeof(quint16)); + packet.seek(sizeof(quint8) + sizeof(quint16)); // read the downstream audio stream stats - memcpy(&_downstreamAudioStreamStats, dataAt, sizeof(AudioStreamStats)); - dataAt += sizeof(AudioStreamStats); + packet.readPrimitive(&_downstreamAudioStreamStats); - return dataAt - packet.data(); + return packet.pos(); } else { PositionalAudioStream* matchingStream = NULL; @@ -76,8 +74,11 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { // we don't have a mic stream yet, so add it // read the channel flag to see if our stream is stereo or not - const char* channelFlagAt = packet.constData() + numBytesForPacketHeader(packet) + sizeof(quint16); - quint8 channelFlag = *(reinterpret_cast(channelFlagAt)); + packet.seek(sizeof(quint16)); + + quint8 channelFlag; + packet.readPrimitive(&channelFlag); + bool isStereo = channelFlag == 1; _audioStreams.insert(nullUUID, matchingStream = new AvatarAudioStream(isStereo, AudioMixer::getStreamSettings())); @@ -88,20 +89,24 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { // this is injected audio // grab the stream identifier for this injected audio - int bytesBeforeStreamIdentifier = numBytesForPacketHeader(packet) + sizeof(quint16); - QUuid streamIdentifier = QUuid::fromRfc4122(packet.mid(bytesBeforeStreamIdentifier, NUM_BYTES_RFC4122_UUID)); - int bytesBeforeStereoIdentifier = bytesBeforeStreamIdentifier + NUM_BYTES_RFC4122_UUID; + packet.seek(sizeof(quint16)); + QUuid streamIdentifier = QUuid::fromRfc4122(packet.read(NUM_BYTES_RFC4122_UUID)); + bool isStereo; - QDataStream(packet.mid(bytesBeforeStereoIdentifier)) >> isStereo; + packet.readPrimitive(&isStereo); if (!_audioStreams.contains(streamIdentifier)) { // we don't have this injected stream yet, so add it - _audioStreams.insert(streamIdentifier, matchingStream = new InjectedAudioStream(streamIdentifier, isStereo, AudioMixer::getStreamSettings())); + _audioStreams.insert(streamIdentifier, + matchingStream = new InjectedAudioStream(streamIdentifier, isStereo, AudioMixer::getStreamSettings())); } else { matchingStream = _audioStreams.value(streamIdentifier); } } + // seek to the beginning of the packet so that the next reader is in the right spot + packet.seek(0); + return matchingStream->parseData(packet); } return 0; diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 4f3f8e360d..99f8683b70 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -25,7 +25,7 @@ class PerListenerSourcePairData { public: - PerListenerSourcePairData() { + PerListenerSourcePairData() { _penumbraFilter.initialize(AudioConstants::SAMPLE_RATE, AudioConstants::NETWORK_FRAME_SAMPLES_STEREO / 2); }; AudioFilterHSF1s& getPenumbraFilter() { return _penumbraFilter; } @@ -42,7 +42,7 @@ public: const QHash& getAudioStreams() const { return _audioStreams; } AvatarAudioStream* getAvatarAudioStream() const; - int parseData(const QByteArray& packet); + int parseData(NLPacket& packet, QSharedPointer sendingNode); void checkBuffersBeforeFrameSend(); From 26be49247539c1eb1ae42f9c7e01ac9c0c6c51c8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 14:46:56 -0700 Subject: [PATCH 328/582] use same listener for many packets in AudioMixer --- assignment-client/src/audio/AudioMixer.cpp | 40 +++++-------------- assignment-client/src/audio/AudioMixer.h | 10 ++--- .../src/audio/AudioMixerClientData.cpp | 2 +- .../src/avatars/AvatarMixerClientData.cpp | 5 +-- .../src/avatars/AvatarMixerClientData.h | 8 ++-- libraries/networking/src/PacketReceiver.cpp | 2 +- libraries/networking/src/PacketReceiver.h | 2 +- 7 files changed, 23 insertions(+), 46 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 018f946771..54ffb95fbf 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -75,7 +75,7 @@ bool AudioMixer::shouldMute(float quietestFrame) { return (quietestFrame > _noiseMutingThreshold); } -AudioMixer::AudioMixer(const QByteArray& packet) : +AudioMixer::AudioMixer(NLPacket& packet) : ThreadedAssignment(packet), _trailingSleepRatio(1.0f), _minAudibilityThreshold(LOUDNESS_TO_DISTANCE_RATIO / 2.0f), @@ -97,11 +97,14 @@ AudioMixer::AudioMixer(const QByteArray& packet) : // SOON auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::MicrophoneAudioNoEcho, this, "handleMicrophoneAudioNoEchoPacket"); - packetReceiver.registerPacketListener(PacketType::MicrophoneAudioWithEcho, this, "handleMicrophoneAudioWithEchoPacket"); - packetReceiver.registerPacketListener(PacketType::InjectAudio, this, "handleInjectAudioPacket"); - packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFramePacket"); - packetReceiver.registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioStreamStatsPacket"); + + QSet nodeAudioPackets { + PacketType::MicrophoneAudioNoEcho, PacketType::MicrophoneAudioWithEcho, + PacketType::InjectAudio, PacketType::SilentAudioFrame, + PacketType::AudioStreamStats + }; + + packetReceiver.registerPacketListenerForSet(nodeAudioPackets, this, "handleNodeAudioPacket"); packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } @@ -543,29 +546,8 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { } } -void AudioMixer::handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet); -} - -void AudioMixer::handleMicrophoneAudioWithEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet); -} - -void AudioMixer::handleInjectAudioPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet); -} - -void AudioMixer::handleSilentAudioFramePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet); -} - -void AudioMixer::handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet); +void AudioMixer::handleNodeAudioPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + DependencyManager::get()->updateNodeWithDataFromPacket(packet, sendingNode); } void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 50ec3c6d18..9e7a010f61 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -28,7 +28,7 @@ const int READ_DATAGRAMS_STATS_WINDOW_SECONDS = 30; class AudioMixer : public ThreadedAssignment { Q_OBJECT public: - AudioMixer(const QByteArray& packet); + AudioMixer(NLPacket& packet); void deleteLater() { qDebug() << "DELETE LATER CALLED?"; QObject::deleteLater(); } public slots: @@ -40,12 +40,8 @@ public slots: static const InboundAudioStream::Settings& getStreamSettings() { return _streamSettings; } private slots: - void handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleMicrophoneAudioWithEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleInjectAudioPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleSilentAudioFramePacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleNodeAudioPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleMuteEnvironmentPacket(QSharedPointer packet, SharedNodePointer sendingNode); private: /// adds one stream to the mix for a listening node diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 59f5982159..dc2d60be51 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -107,7 +107,7 @@ int AudioMixerClientData::parseData(NLPacket& packet, SharedNodePointer sendingN // seek to the beginning of the packet so that the next reader is in the right spot packet.seek(0); - return matchingStream->parseData(packet); + return matchingStream->parseData(packet, sendingNode); } return 0; } diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 197e9baf5e..9f658e1b48 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -13,10 +13,9 @@ #include "AvatarMixerClientData.h" -int AvatarMixerClientData::parseData(const QByteArray& packet) { +int AvatarMixerClientData::parseData(NLPacket& packet, SharedNodePointer sendingNode) { // compute the offset to the data payload - int offset = numBytesForPacketHeader(packet); - return _avatar.parseDataAtOffset(packet, offset); + return _avatar.parseDataFromBuffer(QByteArray::fromRawData(packet.getPayload(), packet.getSizeUsed())); } bool AvatarMixerClientData::checkAndSetHasReceivedFirstPackets() { diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index 3e10b8473a..4497f17da7 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -31,13 +31,13 @@ const QString OUTBOUND_AVATAR_DATA_STATS_KEY = "outbound_av_data_kbps"; class AvatarMixerClientData : public NodeData { Q_OBJECT public: - int parseData(const QByteArray& packet); + int parseData(NLPacket& packet, SharedNodePointer sendingNode); AvatarData& getAvatar() { return _avatar; } bool checkAndSetHasReceivedFirstPackets(); PacketSequenceNumber getLastBroadcastSequenceNumber(const QUuid& nodeUUID) const; - void setLastBroadcastSequenceNumber(const QUuid& nodeUUID, PacketSequenceNumber sequenceNumber) + void setLastBroadcastSequenceNumber(const QUuid& nodeUUID, PacketSequenceNumber sequenceNumber) { _lastBroadcastSequenceNumbers[nodeUUID] = sequenceNumber; } Q_INVOKABLE void removeLastBroadcastSequenceNumber(const QUuid& nodeUUID) { _lastBroadcastSequenceNumbers.erase(nodeUUID); } @@ -57,7 +57,7 @@ public: void incrementNumAvatarsSentLastFrame() { ++_numAvatarsSentLastFrame; } int getNumAvatarsSentLastFrame() const { return _numAvatarsSentLastFrame; } - void recordNumOtherAvatarStarves(int numAvatarsHeldBack) { _otherAvatarStarves.updateAverage((float) numAvatarsHeldBack); } + void recordNumOtherAvatarStarves(int numAvatarsHeldBack) { _otherAvatarStarves.updateAverage((float) numAvatarsHeldBack); } float getAvgNumOtherAvatarStarvesPerSecond() const { return _otherAvatarStarves.getAverageSampleValuePerSecond(); } void recordNumOtherAvatarSkips(int numOtherAvatarSkips) { _otherAvatarSkips.updateAverage((float) numOtherAvatarSkips); } @@ -71,7 +71,7 @@ public: void recordSentAvatarData(int numBytes) { _avgOtherAvatarDataRate.updateAverage((float) numBytes); } - float getOutboundAvatarDataKbps() const + float getOutboundAvatarDataKbps() const { return _avgOtherAvatarDataRate.getAverageSampleValuePerSecond() / (float) BYTES_PER_KILOBIT; } void loadJSONStats(QJsonObject& jsonObject) const; diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 6511185fa4..8e6c5c7929 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -24,7 +24,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : } -void PacketReceiver::registerPacketListeners(const QSet& types, QObject* object, const char* slot) { +void PacketReceiver::registerPacketListenerForSet(const QSet& types, QObject* object, const char* slot) { QSet nonSourcedTypes; QSet sourcedTypes; diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index e5b6693fe4..a410e9eef9 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -39,7 +39,7 @@ public: void shutdown() { _isShuttingDown = true; } - void registerPacketListeners(const QSet& types, QObject* listener, const char* slot); + void registerPacketListenerForSet(const QSet& types, QObject* listener, const char* slot); void registerPacketListener(PacketType::Value type, QObject* listener, const char* slot); public slots: From a4ff18d9ec7173189262abadb8364e830b42c53a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 13 Jul 2015 15:03:10 -0700 Subject: [PATCH 329/582] Remove OctreeServerDatagramProcessor --- .../octree/OctreeServerDatagramProcessor.cpp | 55 ------------------- .../octree/OctreeServerDatagramProcessor.h | 32 ----------- 2 files changed, 87 deletions(-) delete mode 100644 assignment-client/src/octree/OctreeServerDatagramProcessor.cpp delete mode 100644 assignment-client/src/octree/OctreeServerDatagramProcessor.h diff --git a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp deleted file mode 100644 index 94249e7517..0000000000 --- a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// -// OctreeServerDatagramProcessor.cpp -// assignment-client/src -// -// Created by Brad Hefta-Gaub on 2014-09-05 -// Copyright 2014 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 - -#include -#include -#include -#include - -#include "OctreeServerDatagramProcessor.h" - -OctreeServerDatagramProcessor::OctreeServerDatagramProcessor(QUdpSocket& nodeSocket, QThread* previousNodeSocketThread) : - _nodeSocket(nodeSocket), - _previousNodeSocketThread(previousNodeSocketThread) -{ - -} - -OctreeServerDatagramProcessor::~OctreeServerDatagramProcessor() { - // return the node socket to its previous thread - _nodeSocket.moveToThread(_previousNodeSocketThread); -} - -void OctreeServerDatagramProcessor::readPendingDatagrams() { - - HifiSockAddr senderSockAddr; - static QByteArray incomingPacket; - - // read everything that is available - while (_nodeSocket.hasPendingDatagrams()) { - incomingPacket.resize(_nodeSocket.pendingDatagramSize()); - - // just get this packet off the stack - _nodeSocket.readDatagram(incomingPacket.data(), incomingPacket.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - - PacketType::Value packetType = packetTypeForPacket(incomingPacket); - if (packetType == PacketType::Ping) { - DependencyManager::get()->processNodeData(senderSockAddr, incomingPacket); - return; // don't emit - } - - // emit the signal to tell AudioMixer it needs to process a packet - emit packetRequiresProcessing(incomingPacket, senderSockAddr); - } -} diff --git a/assignment-client/src/octree/OctreeServerDatagramProcessor.h b/assignment-client/src/octree/OctreeServerDatagramProcessor.h deleted file mode 100644 index 8c1d4943dd..0000000000 --- a/assignment-client/src/octree/OctreeServerDatagramProcessor.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// OctreeServerDatagramProcessor.h -// assignment-client/src -// -// Created by Brad Hefta-Gaub on 2014-09-05 -// Copyright 2014 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_OctreeServerDatagramProcessor_h -#define hifi_OctreeServerDatagramProcessor_h - -#include -#include - -class OctreeServerDatagramProcessor : public QObject { - Q_OBJECT -public: - OctreeServerDatagramProcessor(QUdpSocket& nodeSocket, QThread* previousNodeSocketThread); - ~OctreeServerDatagramProcessor(); -public slots: - void readPendingDatagrams(); -signals: - void packetRequiresProcessing(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); -private: - QUdpSocket& _nodeSocket; - QThread* _previousNodeSocketThread; -}; - -#endif // hifi_OctreeServerDatagramProcessor_h \ No newline at end of file From f06636d45ec12eef386beb3ae0599d908168d671 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:16:55 -0700 Subject: [PATCH 330/582] repairs for other ThreadedAssignment subclasses --- assignment-client/src/Agent.cpp | 16 +++-- assignment-client/src/Agent.h | 8 +-- assignment-client/src/audio/AudioMixer.cpp | 12 ++-- assignment-client/src/avatars/AvatarMixer.cpp | 4 +- assignment-client/src/avatars/AvatarMixer.h | 2 +- .../octree/OctreeInboundPacketProcessor.cpp | 66 +++++++++---------- .../src/octree/OctreeInboundPacketProcessor.h | 18 ++--- assignment-client/src/octree/OctreeServer.cpp | 13 ++-- assignment-client/src/octree/OctreeServer.h | 2 +- libraries/networking/src/PacketReceiver.cpp | 2 +- libraries/networking/src/PacketReceiver.h | 2 +- libraries/octree/src/OctreeRenderer.cpp | 2 +- 12 files changed, 75 insertions(+), 72 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0037f989ef..449d8b5362 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -32,7 +32,7 @@ static const int RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES = 10; -Agent::Agent(const QByteArray& packet) : +Agent::Agent(NLPacket& packet) : ThreadedAssignment(packet), _entityEditSender(), _receivedAudioStream(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES, @@ -49,15 +49,17 @@ Agent::Agent(const QByteArray& packet) : DependencyManager::set(); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioPacket"); - packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleAudioPacket"); - packetReceiver.registerPacketListener(PacketType::OctreeStats, this, "handleOctreePacket"); - packetReceiver.registerPacketListener(PacketType::EntityData, this, "handleOctreePacket"); - packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleOctreePacket"); + + packetReceiver.registerPacketListenerForTypes( + QSet({ PacketType::MixedAudio, PacketType::SilentAudioFrame }), + this, "handleAudioPacket"); + packetReceiver.registerPacketListenerForTypes( + QSet({ PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }), + this, "handleOctreePacket"); packetReceiver.registerPacketListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); } -void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { QByteArray mutablePacket = QByteArray(packet->getData(), packet->getSizeWithHeader()); int messageLength = mutablePacket.size(); diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 3e202f2d0d..840c1d6d22 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -35,7 +35,7 @@ class Agent : public ThreadedAssignment { Q_PROPERTY(bool isListeningToAudioStream READ isListeningToAudioStream WRITE setIsListeningToAudioStream) Q_PROPERTY(float lastReceivedAudioLoudness READ getLastReceivedAudioLoudness) public: - Agent(const QByteArray& packet); + Agent(NLPacket& packet); void setIsAvatar(bool isAvatar) { QMetaObject::invokeMethod(&_scriptEngine, "setIsAvatar", Q_ARG(bool, isAvatar)); } bool isAvatar() const { return _scriptEngine.isAvatar(); } @@ -55,9 +55,9 @@ public slots: void playAvatarSound(Sound* avatarSound) { _scriptEngine.setAvatarSound(avatarSound); } private slots: - void handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode); private: ScriptEngine _scriptEngine; diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 54ffb95fbf..19b9ebe868 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -104,7 +104,7 @@ AudioMixer::AudioMixer(NLPacket& packet) : PacketType::AudioStreamStats }; - packetReceiver.registerPacketListenerForSet(nodeAudioPackets, this, "handleNodeAudioPacket"); + packetReceiver.registerPacketListenerForTypes(nodeAudioPackets, this, "handleNodeAudioPacket"); packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } @@ -475,7 +475,6 @@ int AudioMixer::prepareMixForListeningNode(Node* node) { } void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { - static char clientEnvBuffer[MAX_PACKET_SIZE]; // Send stream properties bool hasReverb = false; @@ -501,6 +500,7 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { break; } } + AudioMixerClientData* nodeData = static_cast(node->getLinkedData()); AvatarAudioStream* stream = nodeData->getAvatarAudioStream(); bool dataChanged = (stream->hasReverb() != hasReverb) || @@ -550,13 +550,13 @@ void AudioMixer::handleNodeAudioPacket(QSharedPointer packet, SharedNo DependencyManager::get()->updateNodeWithDataFromPacket(packet, sendingNode); } -void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, SharedNodePointer sendingNode) { auto nodeList = DependencyManager::get(); - SharedNodePointer sendingNode = nodeList->nodeWithUUID(packet->getSourceID()); + if (sendingNode->getCanAdjustLocks()) { - auto newPacket = NLPacket::create(PacketType::MuteEnvironment); + auto newPacket = NLPacket::create(PacketType::MuteEnvironment, packet->getSizeUsed()); // Copy payload - newPacket->write(newPacket->getPayload()); + newPacket->write(packet->getPayload(), packet->getSizeUsed()); nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getType() == NodeType::Agent && node->getActiveSocket() && diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 3559793ff5..35cd3d4885 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -33,7 +33,7 @@ const QString AVATAR_MIXER_LOGGING_NAME = "avatar-mixer"; const int AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND = 60; const unsigned int AVATAR_DATA_SEND_INTERVAL_MSECS = (1.0f / (float) AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND) * 1000; -AvatarMixer::AvatarMixer(const QByteArray& packet) : +AvatarMixer::AvatarMixer(NLPacket& packet) : ThreadedAssignment(packet), _broadcastThread(), _lastFrameTimestamp(QDateTime::currentMSecsSinceEpoch()), @@ -402,7 +402,7 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { void AvatarMixer::handleAvatarDataPacket(QSharedPointer packet, SharedNodePointer senderNode) { auto nodeList = DependencyManager::get(); - nodeList->findNodeAndUpdateWithDataFromPacket(packet); + nodeList->updateNodeWithDataFromPacket(packet, senderNode); } void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer senderNode) { diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 90473f754f..d0ced8cdfd 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -20,7 +20,7 @@ /// Handles assignments of type AvatarMixer - distribution of avatar data to various clients class AvatarMixer : public ThreadedAssignment { public: - AvatarMixer(const QByteArray& packet); + AvatarMixer(NLPacket& packet); ~AvatarMixer(); public slots: /// runs the avatar mixer diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 613eec18df..e71ab5e848 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -74,7 +74,7 @@ void OctreeInboundPacketProcessor::midProcess() { } } -void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet) { +void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet, SharedNodePointer sendingNode) { if (_shuttingDown) { qDebug() << "OctreeInboundPacketProcessor::processPacket() while shutting down... ignoring incoming packet"; return; @@ -83,22 +83,24 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin bool debugProcessPacket = _myServer->wantsVerboseDebug(); if (debugProcessPacket) { - qDebug("OctreeInboundPacketProcessor::processPacket() packetData=%p packetLength=%d", &packet, packet.size()); + qDebug("OctreeInboundPacketProcessor::processPacket() payload=%p payloadLength=%lld", + packet->getPayload(), + packet->getSizeUsed()); } - int numBytesPacketHeader = numBytesForPacketHeader(packet); - - // Ask our tree subclass if it can handle the incoming packet... - PacketType::Value packetType = packetTypeForPacket(packet); + PacketType::Value packetType = packet->getType(); + if (_myServer->getOctree()->handlesEditPacketType(packetType)) { - PerformanceWarning warn(debugProcessPacket, "processPacket KNOWN TYPE",debugProcessPacket); + PerformanceWarning warn(debugProcessPacket, "processPacket KNOWN TYPE", debugProcessPacket); _receivedPacketCount++; - const unsigned char* packetData = reinterpret_cast(packet.data()); + unsigned short int sequence; + packet->readPrimitive(&sequence); - unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); - quint64 sentAt = (*((quint64*)(packetData + numBytesPacketHeader + sizeof(sequence)))); + quint64 sentAt; + packet->readPrimitive(&sentAt); + quint64 arrivedAt = usecTimestampNow(); if (sentAt > arrivedAt) { if (debugProcessPacket || _myServer->wantsDebugReceiving()) { @@ -107,6 +109,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin } sentAt = arrivedAt; } + quint64 transitTime = arrivedAt - sentAt; int editsInPacket = 0; quint64 processTime = 0; @@ -114,7 +117,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin if (debugProcessPacket || _myServer->wantsDebugReceiving()) { qDebug() << "PROCESSING THREAD: got '" << packetType << "' packet - " << _receivedPacketCount << " command from client"; - qDebug() << " receivedBytes=" << packet.size(); + qDebug() << " receivedBytes=" << packet->getSizeWithHeader(); qDebug() << " sequence=" << sequence; qDebug() << " sentAt=" << sentAt << " usecs"; qDebug() << " arrivedAt=" << arrivedAt << " usecs"; @@ -125,42 +128,41 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin } if (debugProcessPacket) { - qDebug() << " numBytesPacketHeader=" << numBytesPacketHeader; + qDebug() << " numBytesPacketHeader=" << packet->localHeaderSize(); qDebug() << " sizeof(sequence)=" << sizeof(sequence); qDebug() << " sizeof(sentAt)=" << sizeof(sentAt); } - int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); - if (debugProcessPacket) { - qDebug() << " atByte=" << atByte; - qDebug() << " packet.size()=" << packet.size(); - if (atByte >= packet.size()) { + qDebug() << " atByte (in payload)=" << packet->pos(); + qDebug() << " payload size=" << packet->getSizeUsed(); + if (!packet->bytesAvailable()) { qDebug() << " ----- UNEXPECTED ---- got a packet without any edit details!!!! --------"; } } + + const unsigned char* editData = nullptr; + while (packet->bytesAvailable() > 0) { - unsigned char* editData = (unsigned char*)&packetData[atByte]; - while (atByte < packet.size()) { + editData = reinterpret_cast(packet->getPayload() + packet->pos()); - int maxSize = packet.size() - atByte; + int maxSize = packet->bytesAvailable(); if (debugProcessPacket) { qDebug() << " --- inside while loop ---"; qDebug() << " maxSize=" << maxSize; qDebug("OctreeInboundPacketProcessor::processPacket() %c " - "packetData=%p packetLength=%d editData=%p atByte=%d maxSize=%d", - packetType, packetData, packet.size(), editData, atByte, maxSize); + "payload=%p payloadLength=%lld editData=%p payloadPosition=%lld maxSize=%d", + packetType, packet->getPayload(), packet->getSizeUsed(), editData, + packet->pos(), maxSize); } quint64 startLock = usecTimestampNow(); _myServer->getOctree()->lockForWrite(); quint64 startProcess = usecTimestampNow(); - int editDataBytesRead = _myServer->getOctree()->processEditPacketData(packetType, - reinterpret_cast(packet.data()), - packet.size(), - editData, maxSize, sendingNode); + int editDataBytesRead = + _myServer->getOctree()->processEditPacketData(*packet, editData, maxSize, sendingNode); if (debugProcessPacket) { qDebug() << "OctreeInboundPacketProcessor::processPacket() after processEditPacketData()..." @@ -177,27 +179,25 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin lockWaitTime += thisLockWaitTime; // skip to next edit record in the packet - editData += editDataBytesRead; - atByte += editDataBytesRead; + packet->seek(packet->pos() + editDataBytesRead); if (debugProcessPacket) { qDebug() << " editDataBytesRead=" << editDataBytesRead; - qDebug() << " AFTER processEditPacketData atByte=" << atByte; - qDebug() << " AFTER processEditPacketData packet.size()=" << packet.size(); + qDebug() << " AFTER processEditPacketData payload position=" << packet->pos(); + qDebug() << " AFTER processEditPacketData payload size=" << packet->getSizeUsed(); } } if (debugProcessPacket) { qDebug("OctreeInboundPacketProcessor::processPacket() DONE LOOPING FOR %c " - "packetData=%p packetLength=%d editData=%p atByte=%d", - packetType, packetData, packet.size(), editData, atByte); + "payload=%p payloadLength=%lld editData=%p payloadPosition=%lld", + packetType, packet->getPayload(), packet->getSizeUsed(), editData, packet->pos()); } // Make sure our Node and NodeList knows we've heard from this node. QUuid& nodeUUID = DEFAULT_NODE_ID_REF; if (sendingNode) { - sendingNode->setLastHeardMicrostamp(usecTimestampNow()); nodeUUID = sendingNode->getUUID(); if (debugProcessPacket) { qDebug() << "sender has uuid=" << nodeUUID; diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.h b/assignment-client/src/octree/OctreeInboundPacketProcessor.h index 156e09b493..3ddb76b3fa 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.h +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.h @@ -29,9 +29,9 @@ public: quint64 getAverageLockWaitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalLockWaitTime / _totalPackets; } quint64 getTotalElementsProcessed() const { return _totalElementsInPacket; } quint64 getTotalPacketsProcessed() const { return _totalPackets; } - quint64 getAverageProcessTimePerElement() const + quint64 getAverageProcessTimePerElement() const { return _totalElementsInPacket == 0 ? 0 : _totalProcessTime / _totalElementsInPacket; } - quint64 getAverageLockWaitTimePerElement() const + quint64 getAverageLockWaitTimePerElement() const { return _totalElementsInPacket == 0 ? 0 : _totalLockWaitTime / _totalElementsInPacket; } const SequenceNumberStats& getIncomingEditSequenceNumberStats() const { return _incomingEditSequenceNumberStats; } @@ -40,7 +40,7 @@ public: void trackInboundPacket(unsigned short int incomingSequence, quint64 transitTime, int editsInPacket, quint64 processTime, quint64 lockWaitTime); - quint64 _totalTransitTime; + quint64 _totalTransitTime; quint64 _totalProcessTime; quint64 _totalLockWaitTime; quint64 _totalElementsInPacket; @@ -53,7 +53,7 @@ typedef QHash::iterator NodeToSenderStatsMapIterator; typedef QHash::const_iterator NodeToSenderStatsMapConstIterator; -/// Handles processing of incoming network packets for the octee servers. As with other ReceivedPacketProcessor classes +/// Handles processing of incoming network packets for the octee servers. As with other ReceivedPacketProcessor classes /// the user is responsible for reading inbound packets and adding them to the processing queue by calling queueReceivedPacket() class OctreeInboundPacketProcessor : public ReceivedPacketProcessor { Q_OBJECT @@ -65,9 +65,9 @@ public: quint64 getAverageLockWaitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalLockWaitTime / _totalPackets; } quint64 getTotalElementsProcessed() const { return _totalElementsInPacket; } quint64 getTotalPacketsProcessed() const { return _totalPackets; } - quint64 getAverageProcessTimePerElement() const + quint64 getAverageProcessTimePerElement() const { return _totalElementsInPacket == 0 ? 0 : _totalProcessTime / _totalElementsInPacket; } - quint64 getAverageLockWaitTimePerElement() const + quint64 getAverageLockWaitTimePerElement() const { return _totalElementsInPacket == 0 ? 0 : _totalLockWaitTime / _totalElementsInPacket; } void resetStats(); @@ -78,7 +78,7 @@ public: protected: - virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); + virtual void processPacket(QSharedPointer packet, SharedNodePointer sendingNode); virtual unsigned long getMaxWait() const; virtual void preProcess(); @@ -88,13 +88,13 @@ private: int sendNackPackets(); private: - void trackInboundPacket(const QUuid& nodeUUID, unsigned short int sequence, quint64 transitTime, + void trackInboundPacket(const QUuid& nodeUUID, unsigned short int sequence, quint64 transitTime, int elementsInPacket, quint64 processTime, quint64 lockWaitTime); OctreeServer* _myServer; int _receivedPacketCount; - quint64 _totalTransitTime; + quint64 _totalTransitTime; quint64 _totalProcessTime; quint64 _totalLockWaitTime; quint64 _totalElementsInPacket; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2488c92439..3002474714 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -213,7 +213,7 @@ void OctreeServer::trackProcessWaitTime(float time) { _averageProcessWaitTime.updateAverage(time); } -OctreeServer::OctreeServer(const QByteArray& packet) : +OctreeServer::OctreeServer(NLPacket& packet) : ThreadedAssignment(packet), _argc(0), _argv(NULL), @@ -247,11 +247,6 @@ OctreeServer::OctreeServer(const QByteArray& packet) : // make sure the AccountManager has an Auth URL for payment redemptions AccountManager::getInstance().setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); - - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); - packetReceiver.registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); - packetReceiver.registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); } OctreeServer::~OctreeServer() { @@ -1108,6 +1103,12 @@ void OctreeServer::readConfiguration() { } void OctreeServer::run() { + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); + packetReceiver.registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); + packetReceiver.registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); + _safeServerName = getMyServerName(); // Before we do anything else, create our tree... diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index df36580f57..e55af02715 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -32,7 +32,7 @@ const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per secon class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { Q_OBJECT public: - OctreeServer(const QByteArray& packet); + OctreeServer(NLPacket& packet); ~OctreeServer(); /// allows setting of run arguments diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 8e6c5c7929..7d40ba9187 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -24,7 +24,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : } -void PacketReceiver::registerPacketListenerForSet(const QSet& types, QObject* object, const char* slot) { +void PacketReceiver::registerPacketListenerForTypes(const QSet& types, QObject* object, const char* slot) { QSet nonSourcedTypes; QSet sourcedTypes; diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index a410e9eef9..4caae47076 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -39,7 +39,7 @@ public: void shutdown() { _isShuttingDown = true; } - void registerPacketListenerForSet(const QSet& types, QObject* listener, const char* slot); + void registerPacketListenerForTypes(const QSet& types, QObject* listener, const char* slot); void registerPacketListener(PacketType::Value type, QObject* listener, const char* slot); public slots: diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 17ed302a9a..54ce95b803 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -110,7 +110,7 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN while (packet.bytesAvailable() && !error) { if (packetIsCompressed) { - if (packet.bytesAvailable() > sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE)) { + if (packet.bytesAvailable() > (qint64) sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE)) { packet.readPrimitive(§ionLength); } else { sectionLength = 0; From 4a22f18add3fc8d2cb33c15c124dab1ce453c00a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 15:25:25 -0700 Subject: [PATCH 331/582] Setup udt namespace/move relevant files --- libraries/networking/src/{ => udt}/Packet.cpp | 0 libraries/networking/src/{ => udt}/Packet.h | 0 .../networking/src/{ => udt}/PacketHeaders.cpp | 0 .../networking/src/{ => udt}/PacketHeaders.h | 0 libraries/networking/src/udt/PacketList.cpp | 12 ++++++++++++ libraries/networking/src/udt/PacketList.h | 15 +++++++++++++++ libraries/networking/src/udt/udt.cpp | 12 ++++++++++++ libraries/networking/src/udt/udt.h | 15 +++++++++++++++ 8 files changed, 54 insertions(+) rename libraries/networking/src/{ => udt}/Packet.cpp (100%) rename libraries/networking/src/{ => udt}/Packet.h (100%) rename libraries/networking/src/{ => udt}/PacketHeaders.cpp (100%) rename libraries/networking/src/{ => udt}/PacketHeaders.h (100%) create mode 100644 libraries/networking/src/udt/PacketList.cpp create mode 100644 libraries/networking/src/udt/PacketList.h create mode 100644 libraries/networking/src/udt/udt.cpp create mode 100644 libraries/networking/src/udt/udt.h diff --git a/libraries/networking/src/Packet.cpp b/libraries/networking/src/udt/Packet.cpp similarity index 100% rename from libraries/networking/src/Packet.cpp rename to libraries/networking/src/udt/Packet.cpp diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/udt/Packet.h similarity index 100% rename from libraries/networking/src/Packet.h rename to libraries/networking/src/udt/Packet.h diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp similarity index 100% rename from libraries/networking/src/PacketHeaders.cpp rename to libraries/networking/src/udt/PacketHeaders.cpp diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h similarity index 100% rename from libraries/networking/src/PacketHeaders.h rename to libraries/networking/src/udt/PacketHeaders.h diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp new file mode 100644 index 0000000000..dc9dd36e16 --- /dev/null +++ b/libraries/networking/src/udt/PacketList.cpp @@ -0,0 +1,12 @@ +// +// PacketList.cpp +// +// +// Created by Clement on 7/13/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 "PacketList.h" diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h new file mode 100644 index 0000000000..4dc8eb2225 --- /dev/null +++ b/libraries/networking/src/udt/PacketList.h @@ -0,0 +1,15 @@ +// +// PacketList.h +// +// +// Created by Clement on 7/13/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_PacketList_h +#define hifi_PacketList_h + +#endif // hifi_PacketList_h \ No newline at end of file diff --git a/libraries/networking/src/udt/udt.cpp b/libraries/networking/src/udt/udt.cpp new file mode 100644 index 0000000000..d580a9f7f8 --- /dev/null +++ b/libraries/networking/src/udt/udt.cpp @@ -0,0 +1,12 @@ +// +// udt.cpp +// +// +// Created by Clement on 7/13/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 "udt.h" diff --git a/libraries/networking/src/udt/udt.h b/libraries/networking/src/udt/udt.h new file mode 100644 index 0000000000..74803151d1 --- /dev/null +++ b/libraries/networking/src/udt/udt.h @@ -0,0 +1,15 @@ +// +// udt.h +// +// +// Created by Clement on 7/13/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_udt_h +#define hifi_udt_h + +#endif // hifi_udt_h \ No newline at end of file From c80df94b06451e0112f5a23e6f816f62ea9bdf47 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 15:28:55 -0700 Subject: [PATCH 332/582] Update includes for moved files --- assignment-client/src/Agent.cpp | 2 +- assignment-client/src/AssignmentClient.cpp | 2 +- assignment-client/src/AssignmentClientMonitor.cpp | 2 +- assignment-client/src/AssignmentFactory.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 2 +- assignment-client/src/audio/AudioMixerClientData.cpp | 2 +- assignment-client/src/audio/AvatarAudioStream.cpp | 2 +- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- assignment-client/src/avatars/AvatarMixerClientData.cpp | 2 +- assignment-client/src/avatars/AvatarMixerClientData.h | 2 +- assignment-client/src/entities/EntityNodeData.h | 2 +- assignment-client/src/octree/OctreeInboundPacketProcessor.cpp | 2 +- assignment-client/src/octree/OctreeQueryNode.cpp | 2 +- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- .../src/octree/OctreeServerDatagramProcessor.cpp | 2 +- domain-server/src/DomainServer.cpp | 2 +- domain-server/src/DomainServerNodeData.cpp | 2 +- ice-server/src/IceServer.cpp | 2 +- interface/src/Application.cpp | 2 +- interface/src/Application.h | 4 ++-- interface/src/avatar/Avatar.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- libraries/audio-client/src/AudioClient.cpp | 2 +- libraries/audio/src/AudioInjector.cpp | 2 +- libraries/audio/src/AudioRingBuffer.cpp | 2 +- libraries/audio/src/InboundAudioStream.cpp | 2 +- libraries/audio/src/InboundAudioStream.h | 2 +- libraries/audio/src/InjectedAudioStream.cpp | 2 +- libraries/audio/src/MixedAudioStream.h | 2 +- libraries/audio/src/PositionalAudioStream.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 2 +- libraries/avatars/src/AvatarHashMap.cpp | 2 +- libraries/entities/src/EntityEditPacketSender.cpp | 2 +- libraries/entities/src/EntityItemID.cpp | 2 +- libraries/entities/src/EntityTreeHeadlessViewer.h | 2 +- libraries/environment/src/EnvironmentData.cpp | 2 +- libraries/networking/src/AccountManager.cpp | 2 +- libraries/networking/src/Assignment.cpp | 2 +- libraries/networking/src/DomainHandler.cpp | 2 +- libraries/networking/src/LimitedNodeList.cpp | 2 ++ libraries/networking/src/LimitedNodeList.h | 2 +- libraries/networking/src/NLPacket.h | 2 +- libraries/networking/src/Node.h | 2 +- libraries/networking/src/NodeList.cpp | 2 +- libraries/networking/src/udt/Packet.cpp | 2 +- libraries/octree/src/JurisdictionListener.cpp | 2 +- libraries/octree/src/JurisdictionMap.cpp | 2 +- libraries/octree/src/JurisdictionSender.cpp | 2 +- libraries/octree/src/Octree.cpp | 2 +- libraries/octree/src/OctreeEditPacketSender.cpp | 2 +- libraries/octree/src/OctreeEditPacketSender.h | 2 +- libraries/octree/src/OctreeHeadlessViewer.h | 2 +- libraries/octree/src/OctreePacketData.h | 2 +- libraries/octree/src/OctreeQuery.cpp | 2 +- libraries/octree/src/OctreeRenderer.h | 2 +- libraries/octree/src/OctreeSceneStats.cpp | 2 +- libraries/render-utils/src/Environment.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 58 files changed, 60 insertions(+), 58 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0a4408cbf0..71169893ea 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index fd9e4f4f71..76d3716802 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 7855956763..166491a979 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -18,7 +18,7 @@ #include "AssignmentClientMonitor.h" #include "AssignmentClientApp.h" #include "AssignmentClientChildData.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" #include "SharedUtil.h" diff --git a/assignment-client/src/AssignmentFactory.cpp b/assignment-client/src/AssignmentFactory.cpp index 4dafd64a92..c2f6f5c22c 100644 --- a/assignment-client/src/AssignmentFactory.cpp +++ b/assignment-client/src/AssignmentFactory.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include #include "Agent.h" #include "AssignmentFactory.h" diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 40c1a9d7ab..edb9db92fa 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -45,7 +45,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 0060b45f6e..e933982bb0 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include "InjectedAudioStream.h" diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index 68f8f718de..fc14bcede6 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include #include "AvatarAudioStream.h" diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 487db1b380..4e5f7f91d4 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include #include diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 197e9baf5e..44552f5ccd 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include #include "AvatarMixerClientData.h" diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index 3e10b8473a..e45c0c9e54 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include diff --git a/assignment-client/src/entities/EntityNodeData.h b/assignment-client/src/entities/EntityNodeData.h index 054ceb07d3..d779a0b58d 100644 --- a/assignment-client/src/entities/EntityNodeData.h +++ b/assignment-client/src/entities/EntityNodeData.h @@ -12,7 +12,7 @@ #ifndef hifi_EntityNodeData_h #define hifi_EntityNodeData_h -#include +#include #include "../octree/OctreeQueryNode.h" diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 613eec18df..ebc18162d9 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include "OctreeServer.h" diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 7df9604817..2f1a554b8c 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 520b796e47..6a5d76d4b9 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include "OctreeSendThread.h" diff --git a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp index 94249e7517..084fd13ab5 100644 --- a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp +++ b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include "OctreeServerDatagramProcessor.h" diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index bb98bb1186..9cdac34c30 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/domain-server/src/DomainServerNodeData.cpp b/domain-server/src/DomainServerNodeData.cpp index 0d7efa064c..795b2f4aef 100644 --- a/domain-server/src/DomainServerNodeData.cpp +++ b/domain-server/src/DomainServerNodeData.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include "DomainServerNodeData.h" diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 24199b8bb8..1e9e3e8ec4 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include "IceServer.h" diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 09f8e111ba..ee90d222c6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -81,7 +81,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/interface/src/Application.h b/interface/src/Application.h index 0131fdb19a..26b1e0caee 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include @@ -48,7 +48,6 @@ #include "FileLogger.h" #include "GLCanvas.h" #include "Menu.h" -#include "PacketHeaders.h" #include "Physics.h" #include "Stars.h" #include "avatar/Avatar.h" @@ -56,6 +55,7 @@ #include "devices/SixenseManager.h" #include "scripting/ControllerScriptingInterface.h" #include "scripting/WebWindowClass.h" +#include "udt/PacketHeaders.h" #include "ui/BandwidthDialog.h" #include "ui/HMDToolsDialog.h" #include "ui/ModelsBrowser.h" diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 3d4c158a0b..ca983287ad 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 1384f6e9ca..dc83d8e07f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 918e5e23db..23cfcd3000 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -50,7 +50,7 @@ extern "C" { #include #include -#include +#include #include #include #include diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index ac11d8f8ca..4866bcfad6 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include #include diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 8330414c4a..fc46d5fd66 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -16,7 +16,7 @@ #include -#include +#include #include "AudioLogging.h" diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 928662d2e8..9df083159f 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -12,7 +12,7 @@ #include #include "InboundAudioStream.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" const int STARVE_HISTORY_CAPACITY = 50; diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index cb8494f23e..65a0e5ddaa 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include "AudioRingBuffer.h" diff --git a/libraries/audio/src/InjectedAudioStream.cpp b/libraries/audio/src/InjectedAudioStream.cpp index b7e9a40942..e7633c49e7 100644 --- a/libraries/audio/src/InjectedAudioStream.cpp +++ b/libraries/audio/src/InjectedAudioStream.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include "InjectedAudioStream.h" diff --git a/libraries/audio/src/MixedAudioStream.h b/libraries/audio/src/MixedAudioStream.h index edb26c486f..e6c0339b2a 100644 --- a/libraries/audio/src/MixedAudioStream.h +++ b/libraries/audio/src/MixedAudioStream.h @@ -13,7 +13,7 @@ #define hifi_MixedAudioStream_h #include "InboundAudioStream.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" class MixedAudioStream : public InboundAudioStream { public: diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index 7ca18db540..a916ccf2e3 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -18,7 +18,7 @@ #include #include -#include +#include #include PositionalAudioStream::PositionalAudioStream(PositionalAudioStream::Type type, bool isStereo, const InboundAudioStream::Settings& settings) : diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 5ea3b4c669..06e05a9390 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include #include diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 60eb5c4499..f2742b63ea 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -10,7 +10,7 @@ // #include -#include +#include #include #include "AvatarLogging.h" diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 0faba6541c..616e8f75d5 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "EntityEditPacketSender.h" #include "EntitiesLogging.h" #include "EntityItem.h" diff --git a/libraries/entities/src/EntityItemID.cpp b/libraries/entities/src/EntityItemID.cpp index d882559ee3..ab2c39324f 100644 --- a/libraries/entities/src/EntityItemID.cpp +++ b/libraries/entities/src/EntityItemID.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "RegisteredMetaTypes.h" #include "EntityItemID.h" diff --git a/libraries/entities/src/EntityTreeHeadlessViewer.h b/libraries/entities/src/EntityTreeHeadlessViewer.h index fedbc74430..23c32546cb 100644 --- a/libraries/entities/src/EntityTreeHeadlessViewer.h +++ b/libraries/entities/src/EntityTreeHeadlessViewer.h @@ -12,7 +12,7 @@ #ifndef hifi_EntityTreeHeadlessViewer_h #define hifi_EntityTreeHeadlessViewer_h -#include +#include #include #include #include diff --git a/libraries/environment/src/EnvironmentData.cpp b/libraries/environment/src/EnvironmentData.cpp index f703b667bc..2c6fe5b491 100644 --- a/libraries/environment/src/EnvironmentData.cpp +++ b/libraries/environment/src/EnvironmentData.cpp @@ -12,7 +12,7 @@ #include #include "EnvironmentData.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" // initial values from Sean O'Neil's GPU Gems entry (http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html), // GameEngine.cpp diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 2830a13ca7..4ded2216d0 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -24,7 +24,7 @@ #include #include "NodeList.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" #include "RSAKeypairGenerator.h" #include "SharedUtil.h" diff --git a/libraries/networking/src/Assignment.cpp b/libraries/networking/src/Assignment.cpp index 3da1fb9a41..16d7b6a051 100644 --- a/libraries/networking/src/Assignment.cpp +++ b/libraries/networking/src/Assignment.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" #include "SharedUtil.h" #include "UUID.h" diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 38d1ade2ad..568c4b1e9b 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -16,7 +16,7 @@ #include "Assignment.h" #include "HifiSockAddr.h" #include "NodeList.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" #include "SharedUtil.h" #include "UserActivityLogger.h" #include "NetworkLogging.h" diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 8895f09675..d54fbd093b 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -33,6 +33,8 @@ #include "UUID.h" #include "NetworkLogging.h" +#include "udt/udt.h" + const char SOLO_NODE_TYPES[2] = { NodeType::AvatarMixer, NodeType::AudioMixer diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 33f9ac9fd3..3d9f85aa08 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -38,7 +38,7 @@ #include "DomainHandler.h" #include "Node.h" #include "NLPacket.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" #include "NLPacketList.h" #include "UUIDHasher.h" diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index e70df1dad7..6c38f1eb2e 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -12,7 +12,7 @@ #ifndef hifi_NLPacket_h #define hifi_NLPacket_h -#include "Packet.h" +#include "udt/Packet.h" class NLPacket : public Packet { Q_OBJECT diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 83bdf0ebd3..3bd79d01f0 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -24,7 +24,7 @@ #include "NetworkPeer.h" #include "NodeData.h" #include "NodeType.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" #include "SimpleMovingAverage.h" #include "MovingPercentile.h" diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index dd1d4bdc5f..3e6418c7f6 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -25,7 +25,7 @@ #include "HifiSockAddr.h" #include "JSONBreakableMarshal.h" #include "NodeList.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" #include "SharedUtil.h" #include "UUID.h" #include "NetworkLogging.h" diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index ca1c66f4ca..f7a52b068a 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -11,7 +11,7 @@ #include "Packet.h" -#include "LimitedNodeList.h" +#include "../LimitedNodeList.h" qint64 Packet::localHeaderSize(PacketType::Value type) { qint64 size = numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion) + diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index d725ce3555..735fcb0725 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include "JurisdictionListener.h" JurisdictionListener::JurisdictionListener(NodeType_t type) : diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index d6e4ad8003..5fc735eb68 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include "OctreeLogging.h" diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index 1ade2412b8..69ae76840e 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include "JurisdictionSender.h" diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index ca6cfcecba..810bfa6097 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 41b8b7bca6..6bbfdc5024 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include "OctreeLogging.h" #include "OctreeEditPacketSender.h" diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index a1ba2f0675..34fed80e98 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -13,7 +13,7 @@ #define hifi_OctreeEditPacketSender_h #include -#include +#include #include "JurisdictionMap.h" #include "SentPacketHistory.h" diff --git a/libraries/octree/src/OctreeHeadlessViewer.h b/libraries/octree/src/OctreeHeadlessViewer.h index 70ee43be35..692b7e4848 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.h +++ b/libraries/octree/src/OctreeHeadlessViewer.h @@ -12,7 +12,7 @@ #ifndef hifi_OctreeHeadlessViewer_h #define hifi_OctreeHeadlessViewer_h -#include +#include #include #include "JurisdictionListener.h" diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index 5ce44a0457..439a07087c 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -27,7 +27,7 @@ #include #include // for MAX_PACKET_SIZE -#include // for MAX_PACKET_HEADER_BYTES +#include // for MAX_PACKET_HEADER_BYTES #include #include #include diff --git a/libraries/octree/src/OctreeQuery.cpp b/libraries/octree/src/OctreeQuery.cpp index 08197a587e..3bfa8c0fff 100644 --- a/libraries/octree/src/OctreeQuery.cpp +++ b/libraries/octree/src/OctreeQuery.cpp @@ -10,7 +10,7 @@ // #include -#include +#include #include "OctreeConstants.h" #include "OctreeQuery.h" diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index f6c92f81c9..e470b088d1 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -17,7 +17,7 @@ #include -#include +#include #include #include diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index c4367b43d8..3633f05e2d 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -15,7 +15,7 @@ #include #include -#include +#include #include "OctreePacketData.h" #include "OctreeElement.h" diff --git a/libraries/render-utils/src/Environment.cpp b/libraries/render-utils/src/Environment.cpp index 411beca0ae..763bbc460a 100644 --- a/libraries/render-utils/src/Environment.cpp +++ b/libraries/render-utils/src/Environment.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 134766fb6b..1fc54fa35a 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include "AnimationObject.h" From 44c5d4a2bfd6abd395e842a8a210328da7e671de Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 15:29:41 -0700 Subject: [PATCH 333/582] Couple fixes SharedNodePointer > Node& --- assignment-client/src/audio/AudioMixerClientData.cpp | 3 --- libraries/networking/src/NodeList.cpp | 8 ++++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index e933982bb0..1e0bc6d9b2 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -159,10 +159,7 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& int numStreamStatsRemaining = _audioStreams.size(); QHash::ConstIterator audioStreamsIterator = _audioStreams.constBegin(); - NLPacketList statsPacketList(PacketType::AudioStreamStats); - while (numStreamStatsRemaining > 0) { - auto statsPacket = NLPacket::create(PacketType::AudioStreamStats); // pack the append flag in this packet diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 3e6418c7f6..20206c88ce 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -184,7 +184,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr if (matchingNode) { matchingNode->setLastHeardMicrostamp(usecTimestampNow()); auto replyPacket = constructPingReplyPacket(packet); - sendPacket(std::move(replyPacket), matchingNode, senderSockAddr); + sendPacket(std::move(replyPacket), *matchingNode, senderSockAddr); // If we don't have a symmetric socket for this node and this socket doesn't match // what we have for public and local then set it as the symmetric. @@ -611,14 +611,14 @@ void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { // send the ping packet to the local and public sockets for this node auto localPingPacket = constructPingPacket(PingType::Local); - sendPacket(std::move(localPingPacket), node, node->getLocalSocket()); + sendPacket(std::move(localPingPacket), *node, node->getLocalSocket()); auto publicPingPacket = constructPingPacket(PingType::Public); - sendPacket(std::move(publicPingPacket), node, node->getPublicSocket()); + sendPacket(std::move(publicPingPacket), *node, node->getPublicSocket()); if (!node->getSymmetricSocket().isNull()) { auto symmetricPingPacket = constructPingPacket(PingType::Symmetric); - sendPacket(std::move(symmetricPingPacket), node, node->getSymmetricSocket()); + sendPacket(std::move(symmetricPingPacket), *node, node->getSymmetricSocket()); } node->incrementConnectionAttempts(); From eb5699907770cc202b3f3e609f379f8c458a856d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 15:30:41 -0700 Subject: [PATCH 334/582] Make PacketList class NLPacketList inherits from --- libraries/networking/src/NLPacketList.cpp | 96 +---------------- libraries/networking/src/NLPacketList.h | 54 +--------- libraries/networking/src/udt/PacketList.cpp | 111 ++++++++++++++++++++ libraries/networking/src/udt/PacketList.h | 58 ++++++++++ 4 files changed, 178 insertions(+), 141 deletions(-) diff --git a/libraries/networking/src/NLPacketList.cpp b/libraries/networking/src/NLPacketList.cpp index 8cadc1b9f5..85b413eda9 100644 --- a/libraries/networking/src/NLPacketList.cpp +++ b/libraries/networking/src/NLPacketList.cpp @@ -11,100 +11,12 @@ #include "NLPacketList.h" -#include - -NLPacketList::NLPacketList(PacketType::Value packetType) : - _packetType(packetType) -{ +#include "NLPacket.h" +NLPacketList::NLPacketList(PacketType::Value packetType) : PacketList(packetType) { } -std::unique_ptr NLPacketList::createPacketWithExtendedHeader() { - // use the static create method to create a new packet - auto packet = NLPacket::create(_packetType); - - // add the extended header to the front of the packet - if (packet->write(_extendedHeader) == -1) { - qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" - << "- make sure that _extendedHeader is not larger than the payload capacity."; - } - - return packet; -} - -qint64 NLPacketList::writeData(const char* data, qint64 maxSize) { - if (!_currentPacket) { - // we don't have a current packet, time to set one up - _currentPacket = createPacketWithExtendedHeader(); - } - - // check if this block of data can fit into the currentPacket - if (maxSize <= _currentPacket->bytesAvailable()) { - // it fits, just write it to the current packet - _currentPacket->write(data, maxSize); - - // return the number of bytes written - return maxSize; - } else { - // it does not fit - this may need to be in the next packet - - if (!_isOrdered) { - auto newPacket = createPacketWithExtendedHeader(); - - if (_segmentStartIndex >= 0) { - // We in the process of writing a segment for an unordered PacketList. - // We need to try and pull the first part of the segment out to our new packet - - // check now to see if this is an unsupported write - int numBytesToEnd = _currentPacket->bytesAvailable(); - - if ((newPacket->size() - numBytesToEnd) < maxSize) { - // this is an unsupported case - the segment is bigger than the size of an individual packet - // but the PacketList is not going to be sent ordered - qDebug() << "Error in PacketList::writeData - attempted to write a segment to an unordered packet that is" - << "larger than the payload size."; - Q_ASSERT(false); - } - - // copy from currentPacket where the segment started to the beginning of the newPacket - newPacket->write(_currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); - - // the current segment now starts at the beginning of the new packet - _segmentStartIndex = 0; - - // shrink the current payload to the actual size of the packet - _currentPacket->setSizeUsed(_segmentStartIndex); - } - - // move the current packet to our list of packets - _packets.push_back(std::move(_currentPacket)); - - // write the data to the newPacket - newPacket->write(data, maxSize); - - // swap our current packet with the new packet - _currentPacket.swap(newPacket); - - // return the number of bytes written to the new packet - return maxSize; - } else { - // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover - // into a new packet - - int numBytesToEnd = _currentPacket->bytesAvailable(); - _currentPacket->write(data, numBytesToEnd); - - // move the current packet to our list of packets - _packets.push_back(std::move(_currentPacket)); - - // recursively call our writeData method for the remaining data to write to a new packet - return numBytesToEnd + writeData(data + numBytesToEnd, maxSize - numBytesToEnd); - } - } -} - -void NLPacketList::closeCurrentPacket() { - // move the current packet to our list of packets - _packets.push_back(std::move(_currentPacket)); +std::unique_ptr NLPacketList::createPacket() { + return std::move(NLPacket::create(getType())); } diff --git a/libraries/networking/src/NLPacketList.h b/libraries/networking/src/NLPacketList.h index 3b8150730f..a1a483781d 100644 --- a/libraries/networking/src/NLPacketList.h +++ b/libraries/networking/src/NLPacketList.h @@ -12,61 +12,17 @@ #ifndef hifi_NLPacketList_h #define hifi_NLPacketList_h -#include +#include "udt/PacketList.h" -#include "PacketHeaders.h" - -#include "NLPacket.h" - -class NLPacketList : public QIODevice { - Q_OBJECT +class NLPacketList : public PacketList { public: NLPacketList(PacketType::Value packetType); - - virtual bool isSequential() const { return true; } - - void startSegment() { _segmentStartIndex = _currentPacket->pos(); } - void endSegment() { _segmentStartIndex = -1; } - - int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); } - - void closeCurrentPacket(); - - void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } - - template qint64 readPrimitive(T* data); - template qint64 writePrimitive(const T& data); -protected: - virtual qint64 writeData(const char* data, qint64 maxSize); - virtual qint64 readData(char* data, qint64 maxSize) { return 0; } - -private: - friend class LimitedNodeList; +private: NLPacketList(const NLPacketList& other) = delete; NLPacketList& operator=(const NLPacketList& other) = delete; - - std::unique_ptr createPacketWithExtendedHeader(); - - PacketType::Value _packetType; - bool _isOrdered = false; - - std::unique_ptr _currentPacket; - std::list> _packets; - - int _segmentStartIndex = -1; - - QByteArray _extendedHeader; + + virtual std::unique_ptr createPacket(); }; -template qint64 NLPacketList::readPrimitive(T* data) { - return QIODevice::read(reinterpret_cast(data), sizeof(T)); -} - -template qint64 NLPacketList::writePrimitive(const T& data) { - static_assert(!std::is_pointer::value, "T must not be a pointer"); - return QIODevice::write(reinterpret_cast(&data), sizeof(T)); -} - - #endif // hifi_PacketList_h diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index dc9dd36e16..43e0b2a4ea 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -10,3 +10,114 @@ // #include "PacketList.h" + +#include + +#include "Packet.h" + +PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType) { +} + +void PacketList::startSegment() { + _segmentStartIndex = _currentPacket->pos(); +} + +void PacketList::endSegment() { + _segmentStartIndex = -1; +} + +std::unique_ptr PacketList::createPacket() { + // use the static create method to create a new packet + return std::move(Packet::create(getType())); +} + +std::unique_ptr PacketList::createPacketWithExtendedHeader() { + // use the static create method to create a new packet + auto packet = createPacket(); + + if (!_extendedHeader.isEmpty()) { + // add the extended header to the front of the packet + if (packet->write(_extendedHeader) == -1) { + qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" + << "- make sure that _extendedHeader is not larger than the payload capacity."; + } + } + + return std::move(packet); +} + +qint64 PacketList::writeData(const char* data, qint64 maxSize) { + if (!_currentPacket) { + // we don't have a current packet, time to set one up + _currentPacket = createPacketWithExtendedHeader(); + } + + // check if this block of data can fit into the currentPacket + if (maxSize <= _currentPacket->bytesAvailable()) { + // it fits, just write it to the current packet + _currentPacket->write(data, maxSize); + + // return the number of bytes written + return maxSize; + } else { + // it does not fit - this may need to be in the next packet + + if (!_isOrdered) { + auto newPacket = createPacketWithExtendedHeader(); + + if (_segmentStartIndex >= 0) { + // We in the process of writing a segment for an unordered PacketList. + // We need to try and pull the first part of the segment out to our new packet + + // check now to see if this is an unsupported write + int numBytesToEnd = _currentPacket->bytesAvailable(); + + if ((newPacket->size() - numBytesToEnd) < maxSize) { + // this is an unsupported case - the segment is bigger than the size of an individual packet + // but the PacketList is not going to be sent ordered + qDebug() << "Error in PacketList::writeData - attempted to write a segment to an unordered packet that is" + << "larger than the payload size."; + Q_ASSERT(false); + } + + // copy from currentPacket where the segment started to the beginning of the newPacket + newPacket->write(_currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); + + // the current segment now starts at the beginning of the new packet + _segmentStartIndex = 0; + + // shrink the current payload to the actual size of the packet + _currentPacket->setSizeUsed(_segmentStartIndex); + } + + // move the current packet to our list of packets + _packets.push_back(std::move(_currentPacket)); + + // write the data to the newPacket + newPacket->write(data, maxSize); + + // swap our current packet with the new packet + _currentPacket.swap(newPacket); + + // return the number of bytes written to the new packet + return maxSize; + } else { + // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover + // into a new packet + + int numBytesToEnd = _currentPacket->bytesAvailable(); + _currentPacket->write(data, numBytesToEnd); + + // move the current packet to our list of packets + _packets.push_back(std::move(_currentPacket)); + + // recursively call our writeData method for the remaining data to write to a new packet + return numBytesToEnd + writeData(data + numBytesToEnd, maxSize - numBytesToEnd); + } + } +} + +void PacketList::closeCurrentPacket() { + // move the current packet to our list of packets + _packets.push_back(std::move(_currentPacket)); +} diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 4dc8eb2225..cbd2870ed8 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -12,4 +12,62 @@ #ifndef hifi_PacketList_h #define hifi_PacketList_h +#include + +#include "PacketHeaders.h" + +class Packet; + +class PacketList : public QIODevice { + Q_OBJECT +public: + PacketList(PacketType::Value packetType); + + virtual bool isSequential() const { return true; } + + void startSegment(); + void endSegment(); + + PacketType::Value getType() const { return _packetType; } + int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); } + + void closeCurrentPacket(); + + void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } + + template qint64 readPrimitive(T* data); + template qint64 writePrimitive(const T& data); +protected: + virtual qint64 writeData(const char* data, qint64 maxSize); + virtual qint64 readData(char* data, qint64 maxSize) { return 0; } + +private: + friend class LimitedNodeList; + + PacketList(const PacketList& other) = delete; + PacketList& operator=(const PacketList& other) = delete; + + virtual std::unique_ptr createPacket(); + std::unique_ptr createPacketWithExtendedHeader(); + + PacketType::Value _packetType; + bool _isOrdered = false; + + std::unique_ptr _currentPacket; + std::list> _packets; + + int _segmentStartIndex = -1; + + QByteArray _extendedHeader; +}; + +template qint64 PacketList::readPrimitive(T* data) { + return QIODevice::read(reinterpret_cast(data), sizeof(T)); +} + +template qint64 PacketList::writePrimitive(const T& data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); + return QIODevice::write(reinterpret_cast(&data), sizeof(T)); +} + #endif // hifi_PacketList_h \ No newline at end of file From 81ad0056c3d5f03fa8d3d1ccb7b35637f4d0c498 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 13 Jul 2015 15:34:37 -0700 Subject: [PATCH 335/582] Fix a few node deref --- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- .../src/octree/OctreeInboundPacketProcessor.cpp | 2 +- domain-server/src/DomainServer.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 4e5f7f91d4..32371122ee 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -337,7 +337,7 @@ void AvatarMixer::broadcastAvatarData() { }); // send the avatar data PacketList - nodeList->sendPacketList(avatarPacketList, node); + nodeList->sendPacketList(avatarPacketList, *node); // record the bytes sent for other avatar data in the AvatarMixerClientData nodeData->recordSentAvatarData(numAvatarDataBytes); diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index ebc18162d9..521c4bce46 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -287,7 +287,7 @@ int OctreeInboundPacketProcessor::sendNackPackets() { packetsSent += nackPacketList.getNumPackets(); // send the list of nack packets - nodeList->sendPacketList(nackPacketList, destinationNode); + nodeList->sendPacketList(nackPacketList, *destinationNode); } } diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 9cdac34c30..20eb2c9ac4 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -974,7 +974,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif } // write the PacketList to this node - limitedNodeList->sendPacketList(domainListPackets, node); + limitedNodeList->sendPacketList(domainListPackets, *node); } QUuid DomainServer::connectionSecretForNodes(const SharedNodePointer& nodeA, const SharedNodePointer& nodeB) { @@ -1094,7 +1094,7 @@ void DomainServer::readAvailableDatagrams() { assignmentStream << uniqueAssignment; - limitedNodeList->sendUnreliablePacket(*assignmentPacket, *senderSockAddr); + limitedNodeList->sendUnreliablePacket(*assignmentPacket, senderSockAddr); // add the information for that deployed assignment to the hash of pending assigned nodes PendingAssignedNodeData* pendingNodeData = new PendingAssignedNodeData(assignmentToDeploy->getUUID(), @@ -1125,7 +1125,7 @@ void DomainServer::readAvailableDatagrams() { dtlsRequiredPacket->writePrimitive(dtlsPort); } - limitedNodeList->sendUnreliablePacket(*dtlsRequiredPacket, *senderSockAddr); + limitedNodeList->sendUnreliablePacket(*dtlsRequiredPacket, senderSockAddr); } } } From 9d4f9aa21e24ebbada350bb5c9594543d3d21a64 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:38:45 -0700 Subject: [PATCH 336/582] final fixes to get ACs building again --- assignment-client/src/Agent.cpp | 32 ++++++----- assignment-client/src/AssignmentClient.cpp | 2 +- assignment-client/src/AssignmentFactory.cpp | 6 +- assignment-client/src/AssignmentFactory.h | 2 +- .../src/entities/EntityServer.cpp | 13 +++-- assignment-client/src/entities/EntityServer.h | 8 +-- assignment-client/src/octree/OctreeServer.cpp | 55 ++----------------- assignment-client/src/octree/OctreeServer.h | 9 +-- libraries/networking/src/NodeList.h | 1 - libraries/octree/src/JurisdictionSender.h | 2 +- 10 files changed, 42 insertions(+), 88 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 449d8b5362..a333f4afdd 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -60,34 +60,38 @@ Agent::Agent(NLPacket& packet) : } void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { - QByteArray mutablePacket = QByteArray(packet->getData(), packet->getSizeWithHeader()); - int messageLength = mutablePacket.size(); - auto packetType = packet->getType(); if (packetType == PacketType::OctreeStats) { int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(packet, senderNode); - if (messageLength > statsMessageLength) { - mutablePacket = mutablePacket.mid(statsMessageLength); + if (packet->getSizeUsed() > statsMessageLength) { + // pull out the piggybacked packet and create a new QSharedPointer for it + int packetSizeWithHeader = packet->getSizeUsed() - statsMessageLength; + + std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); + memcpy(buffer.get(), packet->getPayload() + statsMessageLength, packetSizeWithHeader); + + auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, packet->getSenderSockAddr()); + packet = QSharedPointer(newPacket.release()); } else { return; // bail since no piggyback data } - packetType = packetTypeForPacket(mutablePacket); + packetType = packet->getType(); } // fall through to piggyback message if (packetType == PacketType::EntityData || packetType == PacketType::EntityErase) { - _entityViewer.processDatagram(mutablePacket, senderNode); + _entityViewer.processDatagram(*packet, senderNode); } } -void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - QByteArray receivedPacket = QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader()); - int headerBytes = numBytesForPacketHeader(receivedPacket); - +void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode) { + NodeType_t nodeType; + packet->peek(reinterpret_cast(&nodeType), sizeof(nodeType)); + // PacketType_JURISDICTION, first byte is the node type... - switch (receivedPacket[headerBytes]) { + switch (nodeType) { case NodeType::EntityServer: DependencyManager::get()->getJurisdictionListener()-> queueReceivedPacket(packet, senderNode); @@ -95,8 +99,8 @@ void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNode } } -void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - _receivedAudioStream.parseData(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); +void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode) { + _receivedAudioStream.parseData(*packet, senderNode); _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 499ed93c89..e6934e8b1b 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -210,7 +210,7 @@ void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer pac qDebug() << "Received a PacketType::CreateAssignment - attempting to unpack."; // construct the deployed assignment from the packet data - _currentAssignment = AssignmentFactory::unpackAssignment(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + _currentAssignment = AssignmentFactory::unpackAssignment(*packet); if (_currentAssignment) { qDebug() << "Received an assignment -" << *_currentAssignment; diff --git a/assignment-client/src/AssignmentFactory.cpp b/assignment-client/src/AssignmentFactory.cpp index 4dafd64a92..705ff5179b 100644 --- a/assignment-client/src/AssignmentFactory.cpp +++ b/assignment-client/src/AssignmentFactory.cpp @@ -17,12 +17,10 @@ #include "avatars/AvatarMixer.h" #include "entities/EntityServer.h" -ThreadedAssignment* AssignmentFactory::unpackAssignment(const QByteArray& packet) { - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); +ThreadedAssignment* AssignmentFactory::unpackAssignment(NLPacket& packet) { quint8 packedType; - packetStream >> packedType; + packet.peek(reinterpret_cast(&packedType), sizeof(packedType)); Assignment::Type unpackedType = (Assignment::Type) packedType; diff --git a/assignment-client/src/AssignmentFactory.h b/assignment-client/src/AssignmentFactory.h index 9c197f5747..3c1fef99ef 100644 --- a/assignment-client/src/AssignmentFactory.h +++ b/assignment-client/src/AssignmentFactory.h @@ -16,7 +16,7 @@ class AssignmentFactory { public: - static ThreadedAssignment* unpackAssignment(const QByteArray& packet); + static ThreadedAssignment* unpackAssignment(NLPacket& packet); }; #endif // hifi_AssignmentFactory_h diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index bdd619ccf1..3dee2af464 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -21,9 +21,10 @@ const char* MODEL_SERVER_NAME = "Entity"; const char* MODEL_SERVER_LOGGING_TARGET_NAME = "entity-server"; const char* LOCAL_MODELS_PERSIST_FILE = "resources/models.svo"; -EntityServer::EntityServer(const QByteArray& packet) - : OctreeServer(packet), _entitySimulation(NULL) { - +EntityServer::EntityServer(NLPacket& packet) : + OctreeServer(packet), + _entitySimulation(NULL) +{ auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::EntityAdd, this, "handleEntityAddPacket"); packetReceiver.registerPacketListener(PacketType::EntityEdit, this, "handleEntityEditPacket"); @@ -40,19 +41,19 @@ EntityServer::~EntityServer() { tree->removeNewlyCreatedHook(this); } -void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } -void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } -void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index cacf8f3457..dde68dfebd 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -22,7 +22,7 @@ class EntityServer : public OctreeServer, public NewlyCreatedEntityHook { Q_OBJECT public: - EntityServer(const QByteArray& packet); + EntityServer(NLPacket& packet); ~EntityServer(); // Subclasses must implement these methods @@ -50,9 +50,9 @@ protected: virtual Octree* createTree(); private slots: - void handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode); private: EntitySimulation* _entitySimulation; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 3002474714..9b93b3895e 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -813,53 +813,11 @@ void OctreeServer::parsePayload() { } } -void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { - auto nodeList = DependencyManager::get(); - - // If we know we're shutting down we just drop these packets on the floor. - // This stops us from initializing send threads we just shut down. - - if (!_isShuttingDown) { - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType::Value packetType = packetTypeForPacket(receivedPacket); - SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); - if (packetType == getMyQueryMessageType()) { - // If we got a query packet, then we're talking to an agent, and we - // need to make sure we have it in our nodeList. - if (matchingNode) { - nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); - - OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); - if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - nodeData->initializeOctreeSendThread(this, matchingNode); - } - } - } else if (packetType == PacketType::OctreeDataNack) { - // If we got a nack packet, then we're talking to an agent, and we - // need to make sure we have it in our nodeList. - if (matchingNode) { - OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); - if (nodeData) { - nodeData->parseNackPacket(receivedPacket); - } - } - } else if (packetType == PacketType::JurisdictionRequest) { - _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); - } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { - _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); - } else { - // let processNodeData handle it. - DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); - } - } - } -} - -void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode) { // If we got a query packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. auto nodeList = DependencyManager::get(); - nodeList->updateNodeWithDataFromPacket(senderNode, packet->getData()); + nodeList->updateNodeWithDataFromPacket(packet, senderNode); OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { @@ -867,7 +825,7 @@ void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, Shar } } -void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode) { // If we got a nack packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); @@ -876,8 +834,8 @@ void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, S } } -void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - _jurisdictionSender->queueReceivedPacket(senderNode, packet->getData()); +void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode) { + _jurisdictionSender->queueReceivedPacket(packet, senderNode); } void OctreeServer::setupDatagramProcessingThread() { @@ -902,9 +860,6 @@ void OctreeServer::setupDatagramProcessingThread() { connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, datagramProcessor, &OctreeServerDatagramProcessor::readPendingDatagrams); - // connect to the datagram processing thread signal that tells us we have to handle a packet - connect(datagramProcessor, &OctreeServerDatagramProcessor::packetRequiresProcessing, this, &OctreeServer::readPendingDatagram); - // delete the datagram processor and the associated thread when the QThread quits connect(_datagramProcessingThread, &QThread::finished, datagramProcessor, &QObject::deleteLater); connect(datagramProcessor, &QObject::destroyed, _datagramProcessingThread, &QThread::deleteLater); diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index e55af02715..bcc9f8cc43 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -125,13 +125,10 @@ public slots: void nodeKilled(SharedNodePointer node); void sendStatsPacket(); - void readPendingDatagrams() { }; // this will not be called since our datagram processing thread will handle - void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); - private slots: - void handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode); protected: virtual Octree* createTree() = 0; diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 6578326f4a..65bd6a6983 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -63,7 +63,6 @@ public: void resetNodeInterestSet() { _nodeTypesOfInterest.clear(); } void processReceivedPacket(std::unique_ptr, HifiSockAddr senderSockAddr); - void processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet); void setAssignmentServerSocket(const HifiSockAddr& serverSocket) { _assignmentServerSocket = serverSocket; } void sendAssignment(Assignment& assignment); diff --git a/libraries/octree/src/JurisdictionSender.h b/libraries/octree/src/JurisdictionSender.h index a9b6fb03b5..dd0ff44a11 100644 --- a/libraries/octree/src/JurisdictionSender.h +++ b/libraries/octree/src/JurisdictionSender.h @@ -38,7 +38,7 @@ public: void setNodeType(NodeType_t type) { _nodeType = type; } protected: - virtual void processPacket(QSharedPointer pack, SharedNodePointer sendingNode); + virtual void processPacket(QSharedPointer packet, SharedNodePointer sendingNode); /// Locks all the resources of the thread. void lockRequestingNodes() { _requestingNodeMutex.lock(); } From 49ee35a41c85ff47e8b098bd01308e28f50844ca Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:39:35 -0700 Subject: [PATCH 337/582] remove call to processNodeData --- assignment-client/src/octree/OctreeServerDatagramProcessor.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp index 94249e7517..2bb1a03bdb 100644 --- a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp +++ b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp @@ -25,7 +25,7 @@ OctreeServerDatagramProcessor::OctreeServerDatagramProcessor(QUdpSocket& nodeSoc } -OctreeServerDatagramProcessor::~OctreeServerDatagramProcessor() { +OctreeServerDatagramProcessor::~OctreeServerDatagramProcessor() { // return the node socket to its previous thread _nodeSocket.moveToThread(_previousNodeSocketThread); } @@ -45,7 +45,6 @@ void OctreeServerDatagramProcessor::readPendingDatagrams() { PacketType::Value packetType = packetTypeForPacket(incomingPacket); if (packetType == PacketType::Ping) { - DependencyManager::get()->processNodeData(senderSockAddr, incomingPacket); return; // don't emit } From 57c3f0fd208b0909c6919b09ba096cdd6686c373 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:40:20 -0700 Subject: [PATCH 338/582] fix unmatched diagnostic pop --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index ef7a16f983..fc515c0c4c 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -43,7 +43,7 @@ extern "C" { #include } -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop #endif From 34f9b1881ef4b059c0c7aa9425a80541baaa679d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:40:55 -0700 Subject: [PATCH 339/582] fix registration of OctreePacketProcessor for set of types --- interface/src/octree/OctreePacketProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index b9a111aa3f..80528612b6 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -24,7 +24,7 @@ OctreePacketProcessor::OctreePacketProcessor() { PacketType::EntityErase, PacketType::OctreeStats, PacketType::EnvironmentData }; - packetReceiver.registerPacketListeners(types, this, "handleOctreePacket"); + packetReceiver.registerPacketListenerForTypes(types, this, "handleOctreePacket"); } void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { From 8d38cd567091f8290334cb516f5e77e857ba0e39 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:58:44 -0700 Subject: [PATCH 340/582] use a specific packet type for AC child status --- assignment-client/src/AssignmentClient.cpp | 21 ++++-- assignment-client/src/AssignmentClient.h | 4 +- .../src/AssignmentClientChildData.h | 6 +- .../src/AssignmentClientMonitor.cpp | 75 +++++++++++-------- .../src/AssignmentClientMonitor.h | 3 +- libraries/networking/src/PacketHeaders.cpp | 3 +- libraries/networking/src/PacketHeaders.h | 2 +- 7 files changed, 64 insertions(+), 50 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index e6934e8b1b..2f5dacc52a 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -160,23 +160,28 @@ void AssignmentClient::aboutToQuit() { } -void AssignmentClient::setUpStatsToMonitor() { +void AssignmentClient::setUpStatusToMonitor() { // send a stats packet every 1 seconds - connect(&_statsTimerACM, &QTimer::timeout, this, &AssignmentClient::sendStatsPacketToACM); + connect(&_statsTimerACM, &QTimer::timeout, this, &AssignmentClient::sendStatusPacketToACM); _statsTimerACM.start(1000); } -void AssignmentClient::sendStatsPacketToACM() { +void AssignmentClient::sendStatusPacketToACM() { // tell the assignment client monitor what this assignment client is doing (if anything) - QJsonObject statsObject; auto nodeList = DependencyManager::get(); + auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, 1 + NUM_BYTES_RFC4122_UUID); + + quint8 assignmentType = Assignment::Type::AllTypes; + if (_currentAssignment) { - statsObject["assignment_type"] = _currentAssignment->getTypeName(); - } else { - statsObject["assignment_type"] = "none"; + assignmentType = _currentAssignment->getType(); } - nodeList->sendStats(statsObject, _assignmentClientMonitorSocket); + + statusPacket->write(nodeList->getSessionUUID().toRfc4122()); + statusPacket->writePrimitive(assignmentType); + + nodeList->sendPacket(statusPacket, _assignmentClientMonitorSocket); } void AssignmentClient::sendAssignmentRequest() { diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 268683fa3c..23e28968ed 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -30,7 +30,7 @@ private slots: void sendAssignmentRequest(); void assignmentCompleted(); void handleAuthenticationRequest(); - void sendStatsPacketToACM(); + void sendStatusPacketToACM(); void stopAssignmentClient(); public slots: @@ -41,7 +41,7 @@ private slots: void handleStopNodePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); private: - void setUpStatsToMonitor(); + void setUpStatusToMonitor(); Assignment _requestAssignment; QPointer _currentAssignment; diff --git a/assignment-client/src/AssignmentClientChildData.h b/assignment-client/src/AssignmentClientChildData.h index c8116a9959..77d8bd7e31 100644 --- a/assignment-client/src/AssignmentClientChildData.h +++ b/assignment-client/src/AssignmentClientChildData.h @@ -19,14 +19,14 @@ class AssignmentClientChildData : public NodeData { public: AssignmentClientChildData(QString childType); - QString getChildType() { return _childType; } - void setChildType(QString childType) { _childType = childType; } + Assignment::Type getChildType() { return _childType; } + void setChildType(Assignment::Type childType) { _childType = childType; } // implement parseData to return 0 so we can be a subclass of NodeData int parseData(NLPacket& packet, QSharedPointer sendingNode) { return 0; } private: - QString _childType; + Assignment::Type _childType; }; #endif // hifi_AssignmentClientChildData_h diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 5498322f58..6cc1577dea 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -54,8 +54,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto nodeList = DependencyManager::set(); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); - packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); + packetReceiver.registerPacketListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket"); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { @@ -203,43 +202,53 @@ void AssignmentClientMonitor::checkSpares() { } } -void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode) { - auto senderSockAddr = packet->getSenderSockAddr(); +void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { + QUuid senderUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); - // update our records about how to reach this child - senderNode->setLocalSocket(senderSockAddr); + auto nodeList = DependencyManager::get(); - QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload()); - QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); + SharedNodePointer matchingNode = nodeList->nodeWithUUID(senderUUID); + const HifiSockAddr* senderSockAddr = packet->getSendingSockAddr(); - // get child's assignment type out of the decoded json - QString childType = unpackedStatsJSON["assignment_type"].toString(); - AssignmentClientChildData *childData = - static_cast(senderNode->getLinkedData()); - childData->setChildType(childType); - // note when this child talked - senderNode->setLastHeardMicrostamp(usecTimestampNow()); -} + AssignmentClientChildData *childData = nullptr; -void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode) { - auto senderSockAddr = packet->getSenderSockAddr(); + if (!matchingNode) { + // The parent only expects to be talking with prorams running on this same machine. + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || + senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { + + if (!senderUUID.isNull()) { + // We don't have this node yet - we should add it + matchingNode = DependencyManager::get()->addOrUpdateNode + (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); + + childData = new AssignmentClientChildData("unknown"); + senderNode->setLinkedData(childData); + } else { + // tell unknown assignment-client child to exit. + qDebug() << "Asking unknown child at" << senderSockAddr << "to exit."; - // The parent only expects to be talking with prorams running on this same machine. - if (senderSockAddr.getAddress() == QHostAddress::LocalHost || - senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - QUuid packetUUID = uuidFromPacketHeader(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - if (!packetUUID.isNull()) { - senderNode = DependencyManager::get()->addOrUpdateNode - (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); - AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); - senderNode->setLinkedData(childData); - } else { - // tell unknown assignment-client child to exit. - qDebug() << "asking unknown child to exit."; + auto diePacket = NLPacket::create(PacketType::StopNode, 0); + nodeList->sendPacket(std::move(diePacket), senderSockAddr); - auto diePacket = NLPacket::create(PacketType::StopNode, 0); - auto nodeList = DependencyManager::get(); - nodeList->sendPacket(std::move(diePacket), senderSockAddr); + return; + } } + } else { + childData = dynamic_cast(senderNode->getLinkedData()); + } + + if (childData) { + // update our records about how to reach this child + matchingNode->setLocalSocket(senderSockAddr); + + // get child's assignment type out of the packet + quint8 assignmentType; + packet->readPrimitive(&assignmentType); + + childData->setChildType((Assignment::Type) assignmentType); + + // note when this child talked + matchingNode->setLastHeardMicrostamp(usecTimestampNow()); } } diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 0c2b958f5c..895e0defb2 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -37,8 +37,7 @@ public: private slots: void checkSpares(); void childProcessFinished(); - void handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode); - void handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleChildStatusPacket(QSharedPointer packet); public slots: void aboutToQuit(); diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 6fdd421ea0..cb5f1c312d 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -33,7 +33,8 @@ const QSet NON_SOURCED_PACKETS = QSet() << DomainServerPathQuery << DomainServerPathResponse << DomainServerAddedNode << ICEServerPeerInformation << ICEServerQuery << ICEServerHeartbeat - << ICEPing << ICEPingReply; + << ICEPing << ICEPingReply + << AssignmentClientStatus; int arithmeticCodingValueFromBuffer(const char* checkValue) { if (((uchar) *checkValue) < 255) { diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 2f7eac3a63..bc7f0fe3df 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -57,7 +57,7 @@ namespace PacketType { OctreeStats, Jurisdiction, JurisdictionRequest, - UNUSED_6, + AssignmentClientStatus, UNUSED_7, // 30 UNUSED_8, UNUSED_9, From 1c9f43e5aa6a576723fcefd89e3ee1f6d8f00f1e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 16:03:05 -0700 Subject: [PATCH 341/582] compile fixes for AC status packet --- assignment-client/src/AssignmentClient.cpp | 4 ++-- .../src/AssignmentClientChildData.cpp | 2 +- .../src/AssignmentClientChildData.h | 2 +- .../src/AssignmentClientMonitor.cpp | 18 +++++++++--------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 2f5dacc52a..9957619134 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -118,7 +118,7 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri qDebug() << "Assignment-client monitor socket is" << _assignmentClientMonitorSocket; // Hook up a timer to send this child's status to the Monitor once per second - setUpStatsToMonitor(); + setUpStatusToMonitor(); } auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleCreateAssignmentPacket"); @@ -181,7 +181,7 @@ void AssignmentClient::sendStatusPacketToACM() { statusPacket->write(nodeList->getSessionUUID().toRfc4122()); statusPacket->writePrimitive(assignmentType); - nodeList->sendPacket(statusPacket, _assignmentClientMonitorSocket); + nodeList->sendPacket(std::move(statusPacket), _assignmentClientMonitorSocket); } void AssignmentClient::sendAssignmentRequest() { diff --git a/assignment-client/src/AssignmentClientChildData.cpp b/assignment-client/src/AssignmentClientChildData.cpp index cc714e629d..577124c982 100644 --- a/assignment-client/src/AssignmentClientChildData.cpp +++ b/assignment-client/src/AssignmentClientChildData.cpp @@ -12,7 +12,7 @@ #include "AssignmentClientChildData.h" -AssignmentClientChildData::AssignmentClientChildData(QString childType) : +AssignmentClientChildData::AssignmentClientChildData(Assignment::Type childType) : _childType(childType) { diff --git a/assignment-client/src/AssignmentClientChildData.h b/assignment-client/src/AssignmentClientChildData.h index 77d8bd7e31..926a160d08 100644 --- a/assignment-client/src/AssignmentClientChildData.h +++ b/assignment-client/src/AssignmentClientChildData.h @@ -17,7 +17,7 @@ class AssignmentClientChildData : public NodeData { public: - AssignmentClientChildData(QString childType); + AssignmentClientChildData(Assignment::Type childType); Assignment::Type getChildType() { return _childType; } void setChildType(Assignment::Type childType) { _childType = childType; } diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 6cc1577dea..df912ef519 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -175,7 +175,7 @@ void AssignmentClientMonitor::checkSpares() { nodeList->eachNode([&](const SharedNodePointer& node) { AssignmentClientChildData *childData = static_cast(node->getLinkedData()); totalCount ++; - if (childData->getChildType() == "none") { + if (childData->getChildType() == Assignment::Type::AllTypes) { spareCount ++; aSpareId = node->getUUID(); } @@ -203,12 +203,12 @@ void AssignmentClientMonitor::checkSpares() { } void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { - QUuid senderUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); + QUuid senderID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); auto nodeList = DependencyManager::get(); - SharedNodePointer matchingNode = nodeList->nodeWithUUID(senderUUID); - const HifiSockAddr* senderSockAddr = packet->getSendingSockAddr(); + SharedNodePointer matchingNode = nodeList->nodeWithUUID(senderID); + const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); AssignmentClientChildData *childData = nullptr; @@ -217,13 +217,13 @@ void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer p if (senderSockAddr.getAddress() == QHostAddress::LocalHost || senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - if (!senderUUID.isNull()) { + if (!senderID.isNull()) { // We don't have this node yet - we should add it matchingNode = DependencyManager::get()->addOrUpdateNode - (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); + (senderID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); - childData = new AssignmentClientChildData("unknown"); - senderNode->setLinkedData(childData); + childData = new AssignmentClientChildData(Assignment::Type::AllTypes); + matchingNode->setLinkedData(childData); } else { // tell unknown assignment-client child to exit. qDebug() << "Asking unknown child at" << senderSockAddr << "to exit."; @@ -235,7 +235,7 @@ void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer p } } } else { - childData = dynamic_cast(senderNode->getLinkedData()); + childData = dynamic_cast(matchingNode->getLinkedData()); } if (childData) { From b45af742ef6b91476a50451c4e263b4f82070ae2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 09:37:09 -0700 Subject: [PATCH 342/582] Remove datagram processing from OctreeServer --- assignment-client/src/octree/OctreeServer.cpp | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 9b93b3895e..7fa82df0d7 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -28,7 +28,6 @@ #include "OctreeServer.h" #include "OctreeServerConsts.h" -#include "OctreeServerDatagramProcessor.h" OctreeServer* OctreeServer::_instance = NULL; int OctreeServer::_clientCount = 0; @@ -838,36 +837,6 @@ void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer pack _jurisdictionSender->queueReceivedPacket(packet, senderNode); } -void OctreeServer::setupDatagramProcessingThread() { - auto nodeList = DependencyManager::get(); - - // we do not want this event loop to be the handler for UDP datagrams, so disconnect - disconnect(&nodeList->getNodeSocket(), 0, this, 0); - - // setup a QThread with us as parent that will house the OctreeServerDatagramProcessor - _datagramProcessingThread = new QThread(this); - _datagramProcessingThread->setObjectName("Octree Datagram Processor"); - - // create an OctreeServerDatagramProcessor and move it to that thread - OctreeServerDatagramProcessor* datagramProcessor = new OctreeServerDatagramProcessor(nodeList->getNodeSocket(), thread()); - datagramProcessor->moveToThread(_datagramProcessingThread); - - // remove the NodeList as the parent of the node socket - nodeList->getNodeSocket().setParent(NULL); - nodeList->getNodeSocket().moveToThread(_datagramProcessingThread); - - // let the datagram processor handle readyRead from node socket - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, - datagramProcessor, &OctreeServerDatagramProcessor::readPendingDatagrams); - - // delete the datagram processor and the associated thread when the QThread quits - connect(_datagramProcessingThread, &QThread::finished, datagramProcessor, &QObject::deleteLater); - connect(datagramProcessor, &QObject::destroyed, _datagramProcessingThread, &QThread::deleteLater); - - // start the datagram processing thread - _datagramProcessingThread->start(); -} - bool OctreeServer::readOptionBool(const QString& optionName, const QJsonObject& settingsSectionObject, bool& result) { result = false; // assume it doesn't exist bool optionAvailable = false; @@ -1079,8 +1048,6 @@ void OctreeServer::run() { // use common init to setup common timers and logging commonInit(getMyLoggingServerTargetName(), getMyNodeType()); - setupDatagramProcessingThread(); - // read the configuration from either the payload or the domain server configuration readConfiguration(); From e3b5972344e03a41906050f2acad4f9882a95ea6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 11:21:02 -0700 Subject: [PATCH 343/582] use initializer list for packetReceiver register call --- assignment-client/src/Agent.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index a333f4afdd..a67540738d 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -51,10 +51,10 @@ Agent::Agent(NLPacket& packet) : auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListenerForTypes( - QSet({ PacketType::MixedAudio, PacketType::SilentAudioFrame }), + { PacketType::MixedAudio, PacketType::SilentAudioFrame }, this, "handleAudioPacket"); packetReceiver.registerPacketListenerForTypes( - QSet({ PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }), + { PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }, this, "handleOctreePacket"); packetReceiver.registerPacketListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); } From c63d7144001e96ac8007e790789da1b47f68c9a4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 12:18:38 -0700 Subject: [PATCH 344/582] remove variables for out in PacketReceiver --- libraries/networking/src/PacketReceiver.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 4caae47076..21c27bcdac 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -31,9 +31,7 @@ public: PacketReceiver& operator=(const PacketReceiver&) = delete; int getInPacketCount() const { return _inPacketCount; } - int getOutPacketCount() const { return _outPacketCount; } int getInByteCount() const { return _inByteCount; } - int getOutByteCount() const { return _outByteCount; } void resetCounters() { _inPacketCount = 0; _outPacketCount = 0; _inByteCount = 0; _outByteCount = 0; } @@ -61,9 +59,7 @@ private: QMutex _packetListenerLock; QHash _packetListenerMap; int _inPacketCount = 0; - int _outPacketCount = 0; int _inByteCount = 0; - int _outByteCount = 0; bool _isShuttingDown = false; }; From 0637f589b5d06b64fa64b9632692c27c9226ad24 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 13:52:38 -0700 Subject: [PATCH 345/582] add PacketListener to help unregister for packets --- assignment-client/src/Agent.cpp | 6 +- assignment-client/src/AssignmentClient.cpp | 5 +- assignment-client/src/AssignmentClient.h | 4 +- .../src/AssignmentClientMonitor.cpp | 2 +- .../src/AssignmentClientMonitor.h | 2 +- assignment-client/src/audio/AudioMixer.cpp | 4 +- assignment-client/src/avatars/AvatarMixer.cpp | 8 +- .../src/entities/EntityServer.cpp | 6 +- assignment-client/src/octree/OctreeServer.cpp | 6 +- domain-server/src/DomainServer.cpp | 17 ++-- domain-server/src/DomainServer.h | 3 +- interface/src/Application.cpp | 5 +- interface/src/Application.h | 6 +- .../src/octree/OctreePacketProcessor.cpp | 6 +- interface/src/octree/OctreePacketProcessor.h | 4 +- libraries/audio-client/src/AudioClient.cpp | 12 +-- libraries/audio-client/src/AudioClient.h | 3 +- libraries/audio-client/src/AudioIOStats.h | 3 +- libraries/avatars/src/AvatarHashMap.cpp | 8 +- libraries/avatars/src/AvatarHashMap.h | 3 +- .../entities/src/EntityEditPacketSender.cpp | 2 +- .../entities/src/EntityEditPacketSender.h | 4 +- libraries/networking/src/DomainHandler.cpp | 5 ++ libraries/networking/src/DomainHandler.h | 5 +- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 3 +- libraries/networking/src/NodeList.cpp | 16 ++-- libraries/networking/src/PacketListener.cpp | 18 +++++ libraries/networking/src/PacketListener.h | 22 ++++++ libraries/networking/src/PacketReceiver.cpp | 77 +++++++++++++------ libraries/networking/src/PacketReceiver.h | 11 ++- .../networking/src/PacketReceiverListener.cpp | 0 .../networking/src/PacketReceiverListener.h | 22 ++++++ libraries/networking/src/ThreadedAssignment.h | 6 +- 34 files changed, 215 insertions(+), 91 deletions(-) create mode 100644 libraries/networking/src/PacketListener.cpp create mode 100644 libraries/networking/src/PacketListener.h create mode 100644 libraries/networking/src/PacketReceiverListener.cpp create mode 100644 libraries/networking/src/PacketReceiverListener.h diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index a67540738d..c25a0dc434 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -50,13 +50,13 @@ Agent::Agent(NLPacket& packet) : auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListenerForTypes( + packetReceiver.registerListenerForTypes( { PacketType::MixedAudio, PacketType::SilentAudioFrame }, this, "handleAudioPacket"); - packetReceiver.registerPacketListenerForTypes( + packetReceiver.registerListenerForTypes( { PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }, this, "handleOctreePacket"); - packetReceiver.registerPacketListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); + packetReceiver.registerListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); } void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 9957619134..aab5d6af3b 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -121,11 +121,10 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri setUpStatusToMonitor(); } auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleCreateAssignmentPacket"); - packetReceiver.registerPacketListener(PacketType::StopNode, this, "handleStopNodePacket"); + packetReceiver.registerListener(PacketType::CreateAssignment, this, "handleCreateAssignmentPacket"); + packetReceiver.registerListener(PacketType::StopNode, this, "handleStopNodePacket"); } - void AssignmentClient::stopAssignmentClient() { qDebug() << "Forced stop of assignment-client."; diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 23e28968ed..e18e8eea4d 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -15,11 +15,13 @@ #include #include +#include + #include "ThreadedAssignment.h" class QSharedMemory; -class AssignmentClient : public QObject { +class AssignmentClient : public QObject, public PacketListener { Q_OBJECT public: diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index df912ef519..fc7697fc15 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -54,7 +54,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto nodeList = DependencyManager::set(); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket"); + packetReceiver.registerListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket"); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 895e0defb2..a75e876581 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -24,7 +24,7 @@ extern const char* NUM_FORKS_PARAMETER; -class AssignmentClientMonitor : public QObject { +class AssignmentClientMonitor : public QObject, public PacketListener { Q_OBJECT public: AssignmentClientMonitor(const unsigned int numAssignmentClientForks, const unsigned int minAssignmentClientForks, diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 19b9ebe868..a44759ae8d 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -104,8 +104,8 @@ AudioMixer::AudioMixer(NLPacket& packet) : PacketType::AudioStreamStats }; - packetReceiver.registerPacketListenerForTypes(nodeAudioPackets, this, "handleNodeAudioPacket"); - packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); + packetReceiver.registerListenerForTypes(nodeAudioPackets, this, "handleNodeAudioPacket"); + packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } const float ATTENUATION_BEGINS_AT_DISTANCE = 1.0f; diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 35cd3d4885..02202100be 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -48,10 +48,10 @@ AvatarMixer::AvatarMixer(NLPacket& packet) : connect(DependencyManager::get().data(), &NodeList::nodeKilled, this, &AvatarMixer::nodeKilled); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::AvatarData, this, "handleAvatarDataPacket"); - packetReceiver.registerPacketListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket"); - packetReceiver.registerPacketListener(PacketType::AvatarBillboard, this, "handleAvatarBillboardPacket"); - packetReceiver.registerPacketListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); + packetReceiver.registerListener(PacketType::AvatarData, this, "handleAvatarDataPacket"); + packetReceiver.registerListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket"); + packetReceiver.registerListener(PacketType::AvatarBillboard, this, "handleAvatarBillboardPacket"); + packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); } AvatarMixer::~AvatarMixer() { diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 3dee2af464..2a6815c2d5 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -26,9 +26,9 @@ EntityServer::EntityServer(NLPacket& packet) : _entitySimulation(NULL) { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::EntityAdd, this, "handleEntityAddPacket"); - packetReceiver.registerPacketListener(PacketType::EntityEdit, this, "handleEntityEditPacket"); - packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleEntityErasePacket"); + packetReceiver.registerListener(PacketType::EntityAdd, this, "handleEntityAddPacket"); + packetReceiver.registerListener(PacketType::EntityEdit, this, "handleEntityEditPacket"); + packetReceiver.registerListener(PacketType::EntityErase, this, "handleEntityErasePacket"); } EntityServer::~EntityServer() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 9b93b3895e..efcde790f9 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1060,9 +1060,9 @@ void OctreeServer::readConfiguration() { void OctreeServer::run() { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); - packetReceiver.registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); - packetReceiver.registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); + packetReceiver.registerListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); + packetReceiver.registerListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); + packetReceiver.registerListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); _safeServerName = getMyServerName(); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d6d6956a12..579ec1a002 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -111,6 +111,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : } void DomainServer::aboutToQuit() { + // clear the log handler so that Qt doesn't call the destructor on LogHandler qInstallMessageHandler(0); } @@ -280,14 +281,14 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { // register as the packet receiver for the types we want PacketReceiver& packetReceiver = nodeList->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::RequestAssignment, this, "processRequestAssignmentPacket"); - packetReceiver.registerPacketListener(PacketType::DomainConnectRequest, this, "processConnectRequestPackets"); - packetReceiver.registerPacketListener(PacketType::DomainListRequest, this, "processListRequestPacket"); - packetReceiver.registerPacketListener(PacketType::DomainServerPathQuery, this, "processPathQueryPacket"); - packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket"); - packetReceiver.registerPacketListener(PacketType::ICEPing, this, "processICEPingPacket"); - packetReceiver.registerPacketListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); - packetReceiver.registerPacketListener(PacketType::ICEServerPeerInformation, this, "processICEPeerInformationPacket"); + packetReceiver.registerListener(PacketType::RequestAssignment, this, "processRequestAssignmentPacket"); + packetReceiver.registerListener(PacketType::DomainConnectRequest, this, "processConnectRequestPackets"); + packetReceiver.registerListener(PacketType::DomainListRequest, this, "processListRequestPacket"); + packetReceiver.registerListener(PacketType::DomainServerPathQuery, this, "processPathQueryPacket"); + packetReceiver.registerListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket"); + packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); + packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); + packetReceiver.registerListener(PacketType::ICEServerPeerInformation, this, "processICEPeerInformationPacket"); // add whatever static assignments that have been parsed to the queue addStaticAssignmentsToQueue(); diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 0c287c4c55..7f7cba7445 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "DomainServerSettingsManager.h" #include "DomainServerWebSessionData.h" @@ -34,7 +35,7 @@ typedef QSharedPointer SharedAssignmentPointer; typedef QMultiHash TransactionHash; -class DomainServer : public QCoreApplication, public HTTPSRequestHandler { +class DomainServer : public QCoreApplication, public HTTPSRequestHandler, public PacketListener { Q_OBJECT public: DomainServer(int argc, char* argv[]); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 80a4e7bcca..7886041ff6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -654,7 +654,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : applicationUpdater->checkForUpdate(); auto& packetReceiver = nodeList->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::DomainConnectionDenied, this, "handleDomainConnectionDeniedPacket"); + packetReceiver.registerListener(PacketType::DomainConnectionDenied, this, "handleDomainConnectionDeniedPacket"); } void Application::aboutToQuit() { @@ -666,6 +666,9 @@ void Application::aboutToQuit() { void Application::cleanupBeforeQuit() { + // stop handling packets we've asked to handle + DependencyManager::get()->getPacketReceiver().unregisterListener(this); + _entities.clear(); // this will allow entity scripts to properly shutdown //_datagramProcessor->shutdown(); // tell the datagram processor we're shutting down, so it can short circuit diff --git a/interface/src/Application.h b/interface/src/Application.h index 1326ac5180..4580e762e6 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -134,7 +135,10 @@ class Application; typedef bool (Application::* AcceptURLMethod)(const QString &); -class Application : public QApplication, public AbstractViewStateInterface, AbstractScriptingServicesInterface { +class Application : public QApplication, + public AbstractViewStateInterface, + AbstractScriptingServicesInterface, + public PacketListener { Q_OBJECT friend class OctreePacketProcessor; diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 80528612b6..64cf0696da 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -24,7 +24,11 @@ OctreePacketProcessor::OctreePacketProcessor() { PacketType::EntityErase, PacketType::OctreeStats, PacketType::EnvironmentData }; - packetReceiver.registerPacketListenerForTypes(types, this, "handleOctreePacket"); + packetReceiver.registerListenerForTypes(types, this, "handleOctreePacket"); +} + +OctreePacketProcessor::~OctreePacketProcessor() { + DependencyManager::get()->getPacketReceiver().unregisterListener(this); } void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 47ebdc73bc..3476cd383e 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -13,13 +13,15 @@ #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 { +class OctreePacketProcessor : public ReceivedPacketProcessor, public PacketListener { Q_OBJECT public: OctreePacketProcessor(); + ~OctreePacketProcessor(); signals: void packetVersionMismatch(); diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index fc515c0c4c..a9e60f85e2 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -142,12 +142,12 @@ AudioClient::AudioClient() : configureGverbFilter(_gverb); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::AudioStreamStats, &_stats, "handleAudioStreamStatsPacket"); - packetReceiver.registerPacketListener(PacketType::AudioEnvironment, this, "handleAudioEnvironmentDataPacket"); - packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleAudioDataPacket"); - packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioDataPacket"); - packetReceiver.registerPacketListener(PacketType::NoisyMute, this, "handleNoisyMutePacket"); - packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); + packetReceiver.registerListener(PacketType::AudioStreamStats, &_stats, "handleAudioStreamStatsPacket"); + packetReceiver.registerListener(PacketType::AudioEnvironment, this, "handleAudioEnvironmentDataPacket"); + packetReceiver.registerListener(PacketType::SilentAudioFrame, this, "handleAudioDataPacket"); + packetReceiver.registerListener(PacketType::MixedAudio, this, "handleAudioDataPacket"); + packetReceiver.registerListener(PacketType::NoisyMute, this, "handleNoisyMutePacket"); + packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); } AudioClient::~AudioClient() { diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index cf57b9dca1..dc9c40acf7 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -80,7 +81,7 @@ typedef glm::quat (*AudioOrientationGetter)(); class NLPacket; -class AudioClient : public AbstractAudioInterface, public Dependency { +class AudioClient : public AbstractAudioInterface, public Dependency, public PacketListener { Q_OBJECT SINGLETON_DEPENDENCY public: diff --git a/libraries/audio-client/src/AudioIOStats.h b/libraries/audio-client/src/AudioIOStats.h index da0acf2fa3..c5c2a47ff4 100644 --- a/libraries/audio-client/src/AudioIOStats.h +++ b/libraries/audio-client/src/AudioIOStats.h @@ -19,10 +19,11 @@ #include #include #include +#include class MixedProcessedAudioStream; -class AudioIOStats : public QObject { +class AudioIOStats : public QObject, public PacketListener { Q_OBJECT public: AudioIOStats(MixedProcessedAudioStream* receivedAudioStream); diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index c00ba1f08c..b219089f07 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -20,10 +20,10 @@ AvatarHashMap::AvatarHashMap() { connect(DependencyManager::get().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); - packetReceiver.registerPacketListener(PacketType::KillAvatar, this, "processKillAvatar"); - packetReceiver.registerPacketListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); - packetReceiver.registerPacketListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); + packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); + packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); + packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); + packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); } bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) { diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 071798e4f8..04988a81e2 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -21,11 +21,12 @@ #include #include #include +#include #include "AvatarData.h" #include -class AvatarHashMap : public QObject, public Dependency { +class AvatarHashMap : public QObject, public Dependency, public PacketListener { Q_OBJECT SINGLETON_DEPENDENCY diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index a798b83412..0dd3465b33 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -19,7 +19,7 @@ EntityEditPacketSender::EntityEditPacketSender() { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); + packetReceiver.registerListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); } void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 667040c1df..39bd4cdffc 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -14,10 +14,12 @@ #include +#include + #include "EntityItem.h" /// Utility for processing, packing, queueing and sending of outbound edit voxel messages. -class EntityEditPacketSender : public OctreeEditPacketSender { +class EntityEditPacketSender : public OctreeEditPacketSender, public PacketListener { Q_OBJECT public: EntityEditPacketSender(); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 6d76e09028..174fbe8cb3 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -38,6 +38,11 @@ DomainHandler::DomainHandler(QObject* parent) : { // if we get a socket that make sure our NetworkPeer ping timer stops connect(this, &DomainHandler::completedSocketDiscovery, &_icePeer, &NetworkPeer::stopPingTimer); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + + packetReceiver.registerListener(PacketType::ICEServerPeerInformation, this, "processICEResponsePacket"); + packetReceiver.registerListener(PacketType::DomainServerRequireDTLS, this, "processDTLSRequirementPacket"); } void DomainHandler::clearConnectionInfo() { diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 716138a4f1..82b0c163de 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -22,17 +22,18 @@ #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 { +class DomainHandler : public QObject, public PacketListener { Q_OBJECT public: DomainHandler(QObject* parent = 0); - + void clearConnectionInfo(); void clearSettings(); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a91076d6ca..d03a3c9f07 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -100,7 +100,7 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short _packetStatTimer.start(); // make sure we handle STUN response packets - _packetReceiver.registerPacketListener(PacketType::StunResponse, this, "processSTUNResponse"); + _packetReceiver.registerListener(PacketType::StunResponse, this, "processSTUNResponse"); } void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 07d1eed644..5e23b2e93c 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -39,6 +39,7 @@ #include "NLPacket.h" #include "PacketHeaders.h" #include "PacketReceiver.h" +#include "PacketListener.h" #include "NLPacketList.h" #include "UUIDHasher.h" @@ -75,7 +76,7 @@ namespace PingType { const PingType_t Symmetric = 3; } -class LimitedNodeList : public QObject, public Dependency { +class LimitedNodeList : public QObject, public Dependency, public PacketListener { Q_OBJECT SINGLETON_DEPENDENCY public: diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 1daf8a1c02..b0de65ab85 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -92,15 +92,13 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned startSTUNPublicSocketUpdate(); auto& packetReceiver = getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::DomainList, this, "processDomainServerList"); - packetReceiver.registerPacketListener(PacketType::DomainServerAddedNode, this, "processDomainServerAddedNode"); - packetReceiver.registerPacketListener(PacketType::DomainServerRequireDTLS, &_domainHandler, "processDTLSRequirementPacket"); - packetReceiver.registerPacketListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathQueryResponse"); - packetReceiver.registerPacketListener(PacketType::ICEServerPeerInformation, &_domainHandler, "processICEResponsePacket"); - packetReceiver.registerPacketListener(PacketType::Ping, this, "processPingPacket"); - packetReceiver.registerPacketListener(PacketType::PingReply, this, "processPingReplyPacket"); - packetReceiver.registerPacketListener(PacketType::ICEPing, this, "processICEPingPacket"); - packetReceiver.registerPacketListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); + packetReceiver.registerListener(PacketType::DomainList, this, "processDomainServerList"); + packetReceiver.registerListener(PacketType::DomainServerAddedNode, this, "processDomainServerAddedNode"); + packetReceiver.registerListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathQueryResponse"); + packetReceiver.registerListener(PacketType::Ping, this, "processPingPacket"); + packetReceiver.registerListener(PacketType::PingReply, this, "processPingReplyPacket"); + packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); + packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { diff --git a/libraries/networking/src/PacketListener.cpp b/libraries/networking/src/PacketListener.cpp new file mode 100644 index 0000000000..a3d628c05b --- /dev/null +++ b/libraries/networking/src/PacketListener.cpp @@ -0,0 +1,18 @@ +// +// 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() { + DependencyManager::get()->getPacketReceiver().unregisterListener(this); +} diff --git a/libraries/networking/src/PacketListener.h b/libraries/networking/src/PacketListener.h new file mode 100644 index 0000000000..ad0f1c6f7f --- /dev/null +++ b/libraries/networking/src/PacketListener.h @@ -0,0 +1,22 @@ +// +// 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 7d40ba9187..20cc5c5b15 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -24,7 +24,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : } -void PacketReceiver::registerPacketListenerForTypes(const QSet& types, QObject* object, const char* slot) { +void PacketReceiver::registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot) { QSet nonSourcedTypes; QSet sourcedTypes; @@ -36,6 +36,9 @@ void PacketReceiver::registerPacketListenerForTypes(const QSet(listener); + Q_ASSERT(object); + if (nonSourcedTypes.size() > 0) { QMetaMethod nonSourcedMethod = matchingMethodForListener(*nonSourcedTypes.begin(), object, slot); foreach(PacketType::Value type, nonSourcedTypes) { @@ -51,8 +54,12 @@ void PacketReceiver::registerPacketListenerForTypes(const QSet(listener); + Q_ASSERT(object); + QMetaMethod matchingMethod = matchingMethodForListener(type, object, slot); + if (matchingMethod.isValid()) { registerVerifiedListener(type, object, matchingMethod); } @@ -62,28 +69,35 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO Q_ASSERT(object); // normalize the slot with the expected parameters - QString normalizedSlot; - - if (NON_SOURCED_PACKETS.contains(type)) { - const QString NON_SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer"; - - QString nonNormalizedSignature = QString("%1(%2)").arg(slot).arg(NON_SOURCED_PACKET_LISTENER_PARAMETERS); - normalizedSlot = - QMetaObject::normalizedSignature(nonNormalizedSignature.toStdString().c_str()); - } else { - const QString SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; - QString nonNormalizedSignature = QString("%1(%2)").arg(slot).arg(SOURCED_PACKET_LISTENER_PARAMETERS); - normalizedSlot = - QMetaObject::normalizedSignature(nonNormalizedSignature.toStdString().c_str()); + const QString NON_SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer"; + + QSet possibleSignatures { QString("%1(%2)").arg(slot).arg(NON_SOURCED_PACKET_LISTENER_PARAMETERS) }; + + if (!NON_SOURCED_PACKETS.contains(type)) { + const QString SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; + + // a sourced packet must take the shared pointer to the packet but optionally could include + // a shared pointer to the node + + possibleSignatures << QString("%1(%2)").arg(slot).arg(SOURCED_PACKET_LISTENER_PARAMETERS); } - // does the constructed normalized method exist? - int methodIndex = object->metaObject()->indexOfSlot(normalizedSlot.toStdString().c_str()); - + int methodIndex = -1; + + foreach(const QString& signature, possibleSignatures) { + QByteArray normalizedSlot = + QMetaObject::normalizedSignature(signature.toStdString().c_str()); + + // does the constructed normalized method exist? + methodIndex = object->metaObject()->indexOfSlot(normalizedSlot.toStdString().c_str()); + + break; + } + if (methodIndex < 0) { - qDebug() << "PacketReceiver::registerPacketListener expected a method with a normalized signature of" - << normalizedSlot << "but such a method was not found."; + qDebug() << "PacketReceiver::registerListener expected a method with one of the following signatures:" + << possibleSignatures << "- but such a method was not found."; } Q_ASSERT(methodIndex >= 0); @@ -107,12 +121,29 @@ void PacketReceiver::registerVerifiedListener(PacketType::Value type, QObject* o } // add the mapping - _packetListenerMap[type] = ObjectMethodPair(QPointer(object), slot); + _packetListenerMap[type] = ObjectMethodPair(object, slot); _packetListenerLock.unlock(); } +void PacketReceiver::unregisterListener(PacketListener* listener) { + _packetListenerLock.lock(); + + auto it = _packetListenerMap.begin(); + + while (it != _packetListenerMap.end()) { + if (it.value().first == dynamic_cast(listener)) { + // this listener matches - erase it + it = _packetListenerMap.erase(it); + } else { + ++it; + } + } + + _packetListenerLock.unlock(); +} + bool PacketReceiver::packetVersionMatch(const NLPacket& packet) { if (packet.getVersion() != versionForPacketType(packet.getType()) @@ -149,7 +180,7 @@ void PacketReceiver::processDatagrams() { auto nodeList = DependencyManager::get(); - while (DependencyManager::get()->getNodeSocket().hasPendingDatagrams()) { + while (nodeList->getNodeSocket().hasPendingDatagrams()) { // setup a buffer to read the packet into int packetSizeWithHeader = nodeList->getNodeSocket().pendingDatagramSize(); std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); @@ -186,7 +217,7 @@ void PacketReceiver::processDatagrams() { auto listener = it.value(); - if (!listener.first.isNull()) { + if (listener.first) { if (matchingNode) { emit dataReceived(matchingNode->getType(), packet->getSizeWithHeader()); diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 21c27bcdac..c84b5ef432 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -22,6 +22,8 @@ #include "NLPacket.h" #include "PacketHeaders.h" +class PacketListener; + class PacketReceiver : public QObject { Q_OBJECT public: @@ -33,12 +35,13 @@ public: int getInPacketCount() const { return _inPacketCount; } int getInByteCount() const { return _inByteCount; } - void resetCounters() { _inPacketCount = 0; _outPacketCount = 0; _inByteCount = 0; _outByteCount = 0; } + void resetCounters() { _inPacketCount = 0; _inByteCount = 0; } void shutdown() { _isShuttingDown = true; } - void registerPacketListenerForTypes(const QSet& types, QObject* listener, const char* slot); - void registerPacketListener(PacketType::Value type, QObject* listener, const char* slot); + void registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot); + void registerListener(PacketType::Value type, PacketListener* listener, const char* slot); + void unregisterListener(PacketListener* listener); public slots: void processDatagrams(); @@ -54,7 +57,7 @@ private: 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, QMetaMethod>; + using ObjectMethodPair = std::pair; QMutex _packetListenerLock; QHash _packetListenerMap; diff --git a/libraries/networking/src/PacketReceiverListener.cpp b/libraries/networking/src/PacketReceiverListener.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/networking/src/PacketReceiverListener.h b/libraries/networking/src/PacketReceiverListener.h new file mode 100644 index 0000000000..ad0f1c6f7f --- /dev/null +++ b/libraries/networking/src/PacketReceiverListener.h @@ -0,0 +1,22 @@ +// +// 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/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index c4c6127b7b..922a34b3e4 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -1,6 +1,6 @@ // // ThreadedAssignment.h -// libraries/shared/src +// libraries/networking/src // // Created by Stephen Birarda on 12/3/2013. // Copyright 2013 High Fidelity, Inc. @@ -14,9 +14,11 @@ #include +#include "PacketListener.h" + #include "Assignment.h" -class ThreadedAssignment : public Assignment { +class ThreadedAssignment : public Assignment, public PacketListener { Q_OBJECT public: ThreadedAssignment(NLPacket& packet); From fa9372875e48f0d465236c7cdb94b0ca452c927f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 13:54:10 -0700 Subject: [PATCH 346/582] fix headers in AvatarHashMap --- libraries/avatars/src/AvatarHashMap.cpp | 2 +- libraries/avatars/src/AvatarHashMap.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index b219089f07..3eb5495aec 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -2,7 +2,7 @@ // AvatarHashMap.cpp // libraries/avatars/src // -// Created by AndrewMeadows on 1/28/2014. +// Created by Andrew Meadows on 1/28/2014. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 04988a81e2..fa61788816 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -2,7 +2,7 @@ // AvatarHashMap.h // libraries/avatars/src // -// Created by Stephen AndrewMeadows on 1/28/2014. +// Created by Andrew Meadows on 1/28/2014. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. From fbd287472d2d4b05240f3da78533f9693eb39791 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 14:09:00 -0700 Subject: [PATCH 347/582] make NodeData parseData take only packet --- assignment-client/src/Agent.cpp | 4 ++-- assignment-client/src/Agent.h | 2 +- assignment-client/src/AssignmentClientChildData.h | 7 ++----- assignment-client/src/audio/AudioMixerClientData.cpp | 4 ++-- assignment-client/src/audio/AudioMixerClientData.h | 2 +- .../src/avatars/AvatarMixerClientData.cpp | 2 +- assignment-client/src/avatars/AvatarMixerClientData.h | 2 +- domain-server/src/DomainServerNodeData.h | 1 - libraries/audio-client/src/AudioClient.cpp | 10 +++++----- libraries/audio-client/src/AudioClient.h | 8 ++++---- libraries/audio/src/InboundAudioStream.cpp | 4 ++-- libraries/audio/src/InboundAudioStream.h | 2 +- libraries/networking/src/Assignment.h | 3 --- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/NodeData.h | 2 +- libraries/octree/src/OctreeQuery.cpp | 2 +- libraries/octree/src/OctreeQuery.h | 2 +- 17 files changed, 26 insertions(+), 33 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c25a0dc434..051ae68ff2 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -99,8 +99,8 @@ void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNode } } -void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode) { - _receivedAudioStream.parseData(*packet, senderNode); +void Agent::handleAudioPacket(QSharedPointer packet) { + _receivedAudioStream.parseData(*packet); _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 840c1d6d22..241e14439c 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -55,7 +55,7 @@ public slots: void playAvatarSound(Sound* avatarSound) { _scriptEngine.setAvatarSound(avatarSound); } private slots: - void handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleAudioPacket(QSharedPointer packet); void handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode); void handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode); diff --git a/assignment-client/src/AssignmentClientChildData.h b/assignment-client/src/AssignmentClientChildData.h index 926a160d08..7858ede448 100644 --- a/assignment-client/src/AssignmentClientChildData.h +++ b/assignment-client/src/AssignmentClientChildData.h @@ -16,16 +16,13 @@ class AssignmentClientChildData : public NodeData { - public: +public: AssignmentClientChildData(Assignment::Type childType); Assignment::Type getChildType() { return _childType; } void setChildType(Assignment::Type childType) { _childType = childType; } - // implement parseData to return 0 so we can be a subclass of NodeData - int parseData(NLPacket& packet, QSharedPointer sendingNode) { return 0; } - - private: +private: Assignment::Type _childType; }; diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index dc2d60be51..c929d39224 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -49,7 +49,7 @@ AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() const { return NULL; } -int AudioMixerClientData::parseData(NLPacket& packet, SharedNodePointer sendingNode) { +int AudioMixerClientData::parseData(NLPacket& packet) { PacketType::Value packetType = packet.getType(); if (packetType == PacketType::AudioStreamStats) { @@ -107,7 +107,7 @@ int AudioMixerClientData::parseData(NLPacket& packet, SharedNodePointer sendingN // seek to the beginning of the packet so that the next reader is in the right spot packet.seek(0); - return matchingStream->parseData(packet, sendingNode); + return matchingStream->parseData(packet); } return 0; } diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 99f8683b70..20bcaf5627 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -42,7 +42,7 @@ public: const QHash& getAudioStreams() const { return _audioStreams; } AvatarAudioStream* getAvatarAudioStream() const; - int parseData(NLPacket& packet, QSharedPointer sendingNode); + int parseData(NLPacket& packet); void checkBuffersBeforeFrameSend(); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 9f658e1b48..51543f0d5e 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -13,7 +13,7 @@ #include "AvatarMixerClientData.h" -int AvatarMixerClientData::parseData(NLPacket& packet, SharedNodePointer sendingNode) { +int AvatarMixerClientData::parseData(NLPacket& packet) { // compute the offset to the data payload return _avatar.parseDataFromBuffer(QByteArray::fromRawData(packet.getPayload(), packet.getSizeUsed())); } diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index 4497f17da7..5aef1b7822 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -31,7 +31,7 @@ const QString OUTBOUND_AVATAR_DATA_STATS_KEY = "outbound_av_data_kbps"; class AvatarMixerClientData : public NodeData { Q_OBJECT public: - int parseData(NLPacket& packet, SharedNodePointer sendingNode); + int parseData(NLPacket& packet); AvatarData& getAvatar() { return _avatar; } bool checkAndSetHasReceivedFirstPackets(); diff --git a/domain-server/src/DomainServerNodeData.h b/domain-server/src/DomainServerNodeData.h index 00c5f659ca..57ed96acab 100644 --- a/domain-server/src/DomainServerNodeData.h +++ b/domain-server/src/DomainServerNodeData.h @@ -24,7 +24,6 @@ class DomainServerNodeData : public NodeData { public: DomainServerNodeData(); - int parseData(NLPacket& packet, QSharedPointer sendingNode) { return 0; } const QJsonObject& getStatsJSONObject() const { return _statsJSONObject; } diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a9e60f85e2..6ae8402d5e 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -535,7 +535,7 @@ void AudioClient::stop() { } } -void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer sendingNode) { +void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer packet) { char bitset; packet->readPrimitive(&bitset); @@ -552,7 +552,7 @@ void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer pack } } -void AudioClient::handleAudioDataPacket(QSharedPointer packet, SharedNodePointer sendingNode) { +void AudioClient::handleAudioDataPacket(QSharedPointer packet) { auto nodeList = DependencyManager::get(); nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveFirstAudioPacket); @@ -566,11 +566,11 @@ void AudioClient::handleAudioDataPacket(QSharedPointer packet, SharedN } // Audio output must exist and be correctly set up if we're going to process received audio - _receivedAudioStream.parseData(*packet, sendingNode); + _receivedAudioStream.parseData(*packet); } } -void AudioClient::handleNoisyMutePacket(QSharedPointer packet, SharedNodePointer sendingNode) { +void AudioClient::handleNoisyMutePacket(QSharedPointer packet) { if (!_muted) { toggleMute(); @@ -579,7 +579,7 @@ void AudioClient::handleNoisyMutePacket(QSharedPointer packet, SharedN } } -void AudioClient::handleMuteEnvironmentPacket(QSharedPointer packet, SharedNodePointer sendingNode) { +void AudioClient::handleMuteEnvironmentPacket(QSharedPointer packet) { glm::vec3 position; float radius; diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index dc9c40acf7..79a044601d 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -140,10 +140,10 @@ public slots: void start(); void stop(); - void handleAudioEnvironmentDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleAudioDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleNoisyMutePacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleMuteEnvironmentPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleAudioEnvironmentDataPacket(QSharedPointer packet); + void handleAudioDataPacket(QSharedPointer packet); + void handleNoisyMutePacket(QSharedPointer packet); + void handleMuteEnvironmentPacket(QSharedPointer packet); void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); } void handleAudioInput(); diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 1c061b3aaa..8df42ff76f 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -99,13 +99,13 @@ void InboundAudioStream::perSecondCallbackForUpdatingStats() { _timeGapStatsForStatsPacket.currentIntervalComplete(); } -int InboundAudioStream::parseData(NLPacket& packet, SharedNodePointer sendingNode) { +int InboundAudioStream::parseData(NLPacket& packet) { // parse sequence number and track it quint16 sequence; packet.readPrimitive(&sequence); SequenceNumberStats::ArrivalInfo arrivalInfo = _incomingSequenceNumberStats.sequenceNumberReceived(sequence, - sendingNode->getUUID()); + packet.getSourceID()); packetReceivedUpdateTimingStats(); diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 106caa11ef..6cd719d233 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -107,7 +107,7 @@ public: virtual void resetStats(); void clearBuffer(); - virtual int parseData(NLPacket& packet, QSharedPointer sendingNode); + virtual int parseData(NLPacket& packet); int popFrames(int maxFrames, bool allOrNothing, bool starveIfNoFramesPopped = true); int popSamples(int maxSamples, bool allOrNothing, bool starveIfNoSamplesPopped = true); diff --git a/libraries/networking/src/Assignment.h b/libraries/networking/src/Assignment.h index 1e4c985583..67f861f850 100644 --- a/libraries/networking/src/Assignment.h +++ b/libraries/networking/src/Assignment.h @@ -85,9 +85,6 @@ public: const char* getTypeName() const; - // implement parseData to return 0 so we can be a subclass of NodeData - int parseData(NLPacket& packet, SharedNodePointer sendingNode) { return 0; } - friend QDebug operator<<(QDebug debug, const Assignment& assignment); friend QDataStream& operator<<(QDataStream &out, const Assignment& assignment); friend QDataStream& operator>>(QDataStream &in, Assignment& assignment); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index d03a3c9f07..f0193a1789 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -247,7 +247,7 @@ int LimitedNodeList::updateNodeWithDataFromPacket(QSharedPointer packe if (linkedData) { QMutexLocker linkedDataLocker(&linkedData->getMutex()); - return linkedData->parseData(*packet, sendingNode); + return linkedData->parseData(*packet); } return 0; diff --git a/libraries/networking/src/NodeData.h b/libraries/networking/src/NodeData.h index d323c72184..78ef446938 100644 --- a/libraries/networking/src/NodeData.h +++ b/libraries/networking/src/NodeData.h @@ -25,7 +25,7 @@ class NodeData : public QObject { public: NodeData(); virtual ~NodeData() = 0; - virtual int parseData(NLPacket& packet, QSharedPointer sendingNode) = 0; + virtual int parseData(NLPacket& packet) { return 0; } QMutex& getMutex() { return _mutex; } diff --git a/libraries/octree/src/OctreeQuery.cpp b/libraries/octree/src/OctreeQuery.cpp index ea568387f5..cdda3a7a0e 100644 --- a/libraries/octree/src/OctreeQuery.cpp +++ b/libraries/octree/src/OctreeQuery.cpp @@ -64,7 +64,7 @@ int OctreeQuery::getBroadcastData(unsigned char* destinationBuffer) { } // called on the other nodes - assigns it to my views of the others -int OctreeQuery::parseData(NLPacket& packet, QSharedPointer sendingNode) { +int OctreeQuery::parseData(NLPacket& packet) { const unsigned char* startPosition = reinterpret_cast(packet.getPayload()); const unsigned char* sourceBuffer = startPosition; diff --git a/libraries/octree/src/OctreeQuery.h b/libraries/octree/src/OctreeQuery.h index 83cb828112..86474ffc02 100644 --- a/libraries/octree/src/OctreeQuery.h +++ b/libraries/octree/src/OctreeQuery.h @@ -48,7 +48,7 @@ public: virtual ~OctreeQuery() {} int getBroadcastData(unsigned char* destinationBuffer); - int parseData(NLPacket& packet, QSharedPointer sendingNode); + int parseData(NLPacket& packet); // getters for camera details const glm::vec3& getCameraPosition() const { return _cameraPosition; } From 64bed72ae667645553d7c3dcc1ffc71fc37aad20 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:23:10 -0700 Subject: [PATCH 348/582] Add Packet::peekPrimitive --- libraries/networking/src/Packet.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/networking/src/Packet.h b/libraries/networking/src/Packet.h index 4ad6ffa6f3..dfd98b6726 100644 --- a/libraries/networking/src/Packet.h +++ b/libraries/networking/src/Packet.h @@ -65,6 +65,7 @@ public: virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } virtual qint64 size() const { return _capacity; } + template qint64 peekPrimitive(T* data); template qint64 readPrimitive(T* data); template qint64 writePrimitive(const T& data); @@ -103,6 +104,10 @@ protected: }; +template qint64 Packet::peekPrimitive(T* data) { + return QIODevice::peek(reinterpret_cast(data), sizeof(T)); +} + template qint64 Packet::readPrimitive(T* data) { return QIODevice::read(reinterpret_cast(data), sizeof(T)); } From 5cb8c1541a166d8247b13e87b9dc7108f959e4c1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:23:31 -0700 Subject: [PATCH 349/582] Update Agent to use peekPrimitive --- assignment-client/src/Agent.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index a333f4afdd..ef1aa7ab4c 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -88,16 +88,14 @@ void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointe void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode) { NodeType_t nodeType; - packet->peek(reinterpret_cast(&nodeType), sizeof(nodeType)); - + packet->peekPrimitive(&nodeType); + // PacketType_JURISDICTION, first byte is the node type... - switch (nodeType) { - case NodeType::EntityServer: - DependencyManager::get()->getJurisdictionListener()-> - queueReceivedPacket(packet, senderNode); - break; + if (nodeType == NodeType::EntityServer) { + DependencyManager::get()->getJurisdictionListener()-> + queueReceivedPacket(packet, senderNode); } -} +} void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode) { _receivedAudioStream.parseData(*packet, senderNode); From 1af01c9003a594d2aae1d89261944c6177ac8970 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:23:53 -0700 Subject: [PATCH 350/582] Fix style issue in AssignmentClientMonitor --- assignment-client/src/AssignmentClientMonitor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index df912ef519..430aa2990f 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -173,7 +173,7 @@ void AssignmentClientMonitor::checkSpares() { nodeList->removeSilentNodes(); nodeList->eachNode([&](const SharedNodePointer& node) { - AssignmentClientChildData *childData = static_cast(node->getLinkedData()); + AssignmentClientChildData* childData = static_cast(node->getLinkedData()); totalCount ++; if (childData->getChildType() == Assignment::Type::AllTypes) { spareCount ++; @@ -210,7 +210,7 @@ void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer p SharedNodePointer matchingNode = nodeList->nodeWithUUID(senderID); const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); - AssignmentClientChildData *childData = nullptr; + AssignmentClientChildData* childData = nullptr; if (!matchingNode) { // The parent only expects to be talking with prorams running on this same machine. From f7c1eaf967a2adb3b30acded9ebf8476217ebd01 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:24:08 -0700 Subject: [PATCH 351/582] Update AssignmentFactory to use peekPrimitive --- assignment-client/src/AssignmentFactory.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/AssignmentFactory.cpp b/assignment-client/src/AssignmentFactory.cpp index 705ff5179b..746dea3bf3 100644 --- a/assignment-client/src/AssignmentFactory.cpp +++ b/assignment-client/src/AssignmentFactory.cpp @@ -20,10 +20,10 @@ ThreadedAssignment* AssignmentFactory::unpackAssignment(NLPacket& packet) { quint8 packedType; - packet.peek(reinterpret_cast(&packedType), sizeof(packedType)); - + packet.peekPrimitive(&packedType); + Assignment::Type unpackedType = (Assignment::Type) packedType; - + switch (unpackedType) { case Assignment::AudioMixerType: return new AudioMixer(packet); From 921ee024149e7cbcfe020e3f316bd023d4e1320a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:25:09 -0700 Subject: [PATCH 352/582] Update EntityServer to use only 1 packet callback for all packet types --- .../src/entities/EntityServer.cpp | 20 ++++--------------- assignment-client/src/entities/EntityServer.h | 4 +--- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 6bb16b7c46..cd9a56c83d 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -26,9 +26,9 @@ EntityServer::EntityServer(NLPacket& packet) : _entitySimulation(NULL) { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::EntityAdd, this, "handleEntityAddPacket"); - packetReceiver.registerPacketListener(PacketType::EntityEdit, this, "handleEntityEditPacket"); - packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleEntityErasePacket"); + packetReceiver.registerPacketListener( + { PacketType::EntityAdd, PacketType::EntityEdit, PacketType::EntityErase }, + this, "handleEntityPacket"); } EntityServer::~EntityServer() { @@ -41,19 +41,7 @@ EntityServer::~EntityServer() { tree->removeNewlyCreatedHook(this); } -void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode) { - if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); - } -} - -void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode) { - if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); - } -} - -void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode) { +void EntityServer::handleEntityPacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index dde68dfebd..1c4eda3cc0 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -50,9 +50,7 @@ protected: virtual Octree* createTree(); private slots: - void handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode); - void handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode); - void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleEntityPacket(QSharedPointer packet, SharedNodePointer senderNode); private: EntitySimulation* _entitySimulation; From 10c558962985f408db9076abd96b13bfe498d289 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:26:06 -0700 Subject: [PATCH 353/582] Update OctreeServer to use dynamic_cast --- assignment-client/src/octree/OctreeServer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 7fa82df0d7..83cc22d7b4 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -818,7 +818,7 @@ void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, Shar auto nodeList = DependencyManager::get(); nodeList->updateNodeWithDataFromPacket(packet, senderNode); - OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); + OctreeQueryNode* nodeData = dynamic_cast(senderNode->getLinkedData()); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { nodeData->initializeOctreeSendThread(this, senderNode); } @@ -827,7 +827,7 @@ void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, Shar void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode) { // If we got a nack packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. - OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); + OctreeQueryNode* nodeData = dynamic_cast(senderNode->getLinkedData()); if (nodeData) { nodeData->parseNackPacket(packet->getData()); } @@ -1122,7 +1122,7 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { _octreeInboundPacketProcessor->nodeKilled(node); qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; - OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); + OctreeQueryNode* nodeData = dynamic_cast(node->getLinkedData()); if (nodeData) { nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down } else { @@ -1140,7 +1140,7 @@ void OctreeServer::forceNodeShutdown(SharedNodePointer node) { quint64 start = usecTimestampNow(); qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; - OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); + OctreeQueryNode* nodeData = dynamic_cast(node->getLinkedData()); if (nodeData) { nodeData->forceNodeShutdown(); // tell our node data and sending threads that we'd like to shut down } else { From d617b71232cce6e3d8c43500e649f4d7559fa764 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 14:27:26 -0700 Subject: [PATCH 354/582] remove SharedNodePointer from some packet callbacks --- assignment-client/src/AssignmentClient.cpp | 8 ++++--- assignment-client/src/AssignmentClient.h | 4 ++-- assignment-client/src/avatars/AvatarMixer.cpp | 5 ++--- assignment-client/src/avatars/AvatarMixer.h | 2 +- .../src/entities/EntityServer.cpp | 19 +++------------- assignment-client/src/entities/EntityServer.h | 4 +--- domain-server/src/DomainServer.cpp | 2 +- interface/src/Application.cpp | 2 +- interface/src/Application.h | 2 +- .../entities/src/EntityEditPacketSender.cpp | 2 +- .../entities/src/EntityEditPacketSender.h | 2 +- libraries/networking/src/DomainHandler.cpp | 19 ++++++++++++++++ libraries/networking/src/DomainHandler.h | 8 ++++--- libraries/networking/src/NodeList.cpp | 22 ------------------- libraries/networking/src/NodeList.h | 1 - 15 files changed, 43 insertions(+), 59 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index aab5d6af3b..6da3786ef7 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -210,7 +210,7 @@ void AssignmentClient::sendAssignmentRequest() { } } -void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer packet) { qDebug() << "Received a PacketType::CreateAssignment - attempting to unpack."; // construct the deployed assignment from the packet data @@ -223,7 +223,7 @@ void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer pac // switch our DomainHandler hostname and port to whoever sent us the assignment - nodeList->getDomainHandler().setSockAddr(senderSockAddr, _assignmentServerHostname); + nodeList->getDomainHandler().setSockAddr(packet->getSenderSockAddr(), _assignmentServerHostname); nodeList->getDomainHandler().setAssignmentUUID(_currentAssignment->getUUID()); qDebug() << "Destination IP for assignment is" << nodeList->getDomainHandler().getIP().toString(); @@ -261,7 +261,9 @@ void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer pac } } -void AssignmentClient::handleStopNodePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void AssignmentClient::handleStopNodePacket(QSharedPointer packet) { + const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { qDebug() << "AssignmentClientMonitor at" << senderSockAddr << "requested stop via PacketType::StopNode."; diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index e18e8eea4d..348255751c 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -39,8 +39,8 @@ public slots: void aboutToQuit(); private slots: - void handleCreateAssignmentPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleStopNodePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleCreateAssignmentPacket(QSharedPointer packet); + void handleStopNodePacket(QSharedPointer packet); private: void setUpStatusToMonitor(); diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 02202100be..b0a50403c6 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -432,9 +432,8 @@ void AvatarMixer::handleAvatarBillboardPacket(QSharedPointer packet, S } } -void AvatarMixer::handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer senderNode) { - auto nodeList = DependencyManager::get(); - nodeList->processKillNode(*packet); +void AvatarMixer::handleKillAvatarPacket(QSharedPointer packet) { + DependencyManager::get()->processKillNode(*packet); } void AvatarMixer::sendStatsPacket() { diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index d0ced8cdfd..034269f7fa 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -35,7 +35,7 @@ private slots: void handleAvatarDataPacket(QSharedPointer packet, SharedNodePointer senderNode); void handleAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer senderNode); void handleAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer senderNode); - void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleKillAvatarPacket(QSharedPointer packet); private: void broadcastAvatarData(); diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 2a6815c2d5..c9c999077c 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -26,9 +26,8 @@ EntityServer::EntityServer(NLPacket& packet) : _entitySimulation(NULL) { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerListener(PacketType::EntityAdd, this, "handleEntityAddPacket"); - packetReceiver.registerListener(PacketType::EntityEdit, this, "handleEntityEditPacket"); - packetReceiver.registerListener(PacketType::EntityErase, this, "handleEntityErasePacket"); + packetReceiver.registerListenerForTypes({ PacketType::EntityAdd, PacketType::EntityEdit, PacketType::EntityErase }, + this, "handleEntityPacket"); } EntityServer::~EntityServer() { @@ -41,19 +40,7 @@ EntityServer::~EntityServer() { tree->removeNewlyCreatedHook(this); } -void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode) { - if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); - } -} - -void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode) { - if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); - } -} - -void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode) { +void EntityServer::handleEntityPacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index dde68dfebd..1c4eda3cc0 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -50,9 +50,7 @@ protected: virtual Octree* createTree(); private slots: - void handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode); - void handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode); - void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleEntityPacket(QSharedPointer packet, SharedNodePointer senderNode); private: EntitySimulation* _entitySimulation; diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 579ec1a002..21b2ce0f58 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1415,7 +1415,7 @@ void DomainServer::processICEPingReplyPacket(QSharedPointer packet) { void DomainServer::processNodeJSONStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode) { if (sendingNode->getLinkedData()) { - reinterpret_cast(sendingNode->getLinkedData())->processJSONStatsPacket(*packet); + dynamic_cast(sendingNode->getLinkedData())->processJSONStatsPacket(*packet); } } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7886041ff6..f06e01f4c5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3821,7 +3821,7 @@ void Application::domainChanged(const QString& domainHostname) { _domainConnectionRefusals.clear(); } -void Application::handleDomainConnectionDeniedPacket(QSharedPointer packet, SharedNodePointer senderNode) { +void Application::handleDomainConnectionDeniedPacket(QSharedPointer packet) { QDataStream packetStream(packet.data()); QString reason; diff --git a/interface/src/Application.h b/interface/src/Application.h index 4580e762e6..754698acc8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -447,7 +447,7 @@ public slots: void notifyPacketVersionMismatch(); - void handleDomainConnectionDeniedPacket(QSharedPointer, SharedNodePointer senderNode); + void handleDomainConnectionDeniedPacket(QSharedPointer packet); void cameraMenuChanged(); diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 0dd3465b33..160e8721f1 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -22,7 +22,7 @@ EntityEditPacketSender::EntityEditPacketSender() { packetReceiver.registerListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); } -void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet) { // if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); // } diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 39bd4cdffc..235e340da2 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -32,7 +32,7 @@ public: void queueEraseEntityMessage(const EntityItemID& entityItemID); - void processEntityEditNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void processEntityEditNackPacket(QSharedPointer packet); // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 174fbe8cb3..20d13169a3 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -43,6 +43,7 @@ DomainHandler::DomainHandler(QObject* parent) : packetReceiver.registerListener(PacketType::ICEServerPeerInformation, this, "processICEResponsePacket"); packetReceiver.registerListener(PacketType::DomainServerRequireDTLS, this, "processDTLSRequirementPacket"); + packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); } void DomainHandler::clearConnectionInfo() { @@ -286,6 +287,24 @@ void DomainHandler::settingsRequestFinished() { settingsReply->deleteLater(); } +void DomainHandler::processICEPingReplyPacket(QSharedPointer packet) { + const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); + qCDebug(networking) << "Received reply from domain-server on" << senderSockAddr; + + if (getIP().isNull()) { + // for now we're unsafely assuming this came back from the domain + if (senderSockAddr == _icePeer.getLocalSocket()) { + qCDebug(networking) << "Connecting to domain using local socket"; + activateICELocalSocket(); + } else if (senderSockAddr == _icePeer.getPublicSocket()) { + qCDebug(networking) << "Conecting to domain using public socket"; + activateICEPublicSocket(); + } else { + qCDebug(networking) << "Reply does not match either local or public socket for domain. Will not connect."; + } + } +} + void DomainHandler::processDTLSRequirementPacket(QSharedPointer dtlsRequirementPacket) { // figure out the port that the DS wants us to use for us to talk to them with DTLS unsigned short dtlsPort; diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 82b0c163de..43453e46c5 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -71,9 +71,7 @@ public: void requestDomainSettings(); const QJsonObject& getSettingsObject() const { return _settingsObject; } - void processDTLSRequirementPacket(QSharedPointer dtlsRequirementPacket); - void processICEResponsePacket(QSharedPointer icePacket); - + void setPendingPath(const QString& pendingPath) { _pendingPath = pendingPath; } const QString& getPendingPath() { return _pendingPath; } void clearPendingPath() { _pendingPath.clear(); } @@ -85,6 +83,10 @@ public slots: void setHostnameAndPort(const QString& hostname, quint16 port = DEFAULT_DOMAIN_SERVER_PORT); void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id); + void processICEPingReplyPacket(QSharedPointer packet); + void processDTLSRequirementPacket(QSharedPointer dtlsRequirementPacket); + void processICEResponsePacket(QSharedPointer icePacket); + private slots: void completedHostnameLookup(const QHostInfo& hostInfo); void completedIceServerHostnameLookup(); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index b0de65ab85..3773a8a540 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -93,12 +93,9 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned auto& packetReceiver = getPacketReceiver(); packetReceiver.registerListener(PacketType::DomainList, this, "processDomainServerList"); - packetReceiver.registerListener(PacketType::DomainServerAddedNode, this, "processDomainServerAddedNode"); - packetReceiver.registerListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathQueryResponse"); packetReceiver.registerListener(PacketType::Ping, this, "processPingPacket"); packetReceiver.registerListener(PacketType::PingReply, this, "processPingReplyPacket"); packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); - packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { @@ -190,25 +187,6 @@ void NodeList::processICEPingPacket(QSharedPointer packet) { sendPacket(std::move(replyPacket), packet->getSenderSockAddr()); } -void NodeList::processICEPingReplyPacket(QSharedPointer packet) { - const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); - qCDebug(networking) << "Received reply from domain-server on" << senderSockAddr; - - if (_domainHandler.getIP().isNull()) { - // for now we're unsafely assuming this came back from the domain - if (senderSockAddr == _domainHandler.getICEPeer().getLocalSocket()) { - qCDebug(networking) << "Connecting to domain using local socket"; - _domainHandler.activateICELocalSocket(); - } else if (senderSockAddr == _domainHandler.getICEPeer().getPublicSocket()) { - qCDebug(networking) << "Conecting to domain using public socket"; - _domainHandler.activateICEPublicSocket(); - } else { - qCDebug(networking) << "Reply does not match either local or public socket for domain. Will not connect."; - } - - } -} - void NodeList::reset() { LimitedNodeList::reset(); diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 65bd6a6983..b9f782f717 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -80,7 +80,6 @@ public slots: void processPingReplyPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processICEPingPacket(QSharedPointer packet); - void processICEPingReplyPacket(QSharedPointer packet); signals: void limitOfSilentDomainCheckInsReached(); private slots: From 1f4ac0f17c44aaac921d8d90258bfc1331731eb3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 14:30:46 -0700 Subject: [PATCH 355/582] emit mutedByMixer signal for a noisy mute --- interface/src/Application.cpp | 1 + libraries/audio-client/src/AudioClient.cpp | 4 ++-- libraries/audio-client/src/AudioClient.h | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f06e01f4c5..7be2b93645 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -420,6 +420,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : connect(audioIO.data(), &AudioClient::destroyed, audioThread, &QThread::quit); connect(audioThread, &QThread::finished, audioThread, &QThread::deleteLater); connect(audioIO.data(), &AudioClient::muteToggled, this, &Application::audioMuteToggled); + connect(audioIO.data(), &AudioClient::mutedByMixer, this, &AudioScriptingInterface::mutedByMixer); connect(audioIO.data(), &AudioClient::receivedFirstPacket, &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::receivedFirstPacket); connect(audioIO.data(), &AudioClient::disconnected, diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 6ae8402d5e..c6c20a4ab2 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -574,8 +574,8 @@ void AudioClient::handleNoisyMutePacket(QSharedPointer packet) { if (!_muted) { toggleMute(); - // TODO reimplement on interface side - //AudioScriptingInterface::getInstance().mutedByMixer(); + // have the audio scripting interface emit a signal to say we were muted by the mixer + emit mutedByMixer(); } } diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 79a044601d..5292e51d91 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -188,6 +188,7 @@ public slots: signals: bool muteToggled(); + void mutedByMixer(); void inputReceived(const QByteArray& inputSamples); void outputBytesToNetwork(int numBytes); void inputBytesFromNetwork(int numBytes); From 8d4c9458749c7bd6d1e7ccc78e4995c9d470c45a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 14:34:39 -0700 Subject: [PATCH 356/582] cleanup audioIO connections in Application --- interface/src/Application.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7be2b93645..d02f5daea6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -416,15 +416,16 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : audioIO->setOrientationGetter(getOrientationForAudio); audioIO->moveToThread(audioThread); + + auto& audioScriptingInterface = AudioScriptingInterface::getInstance(); + connect(audioThread, &QThread::started, audioIO.data(), &AudioClient::start); connect(audioIO.data(), &AudioClient::destroyed, audioThread, &QThread::quit); connect(audioThread, &QThread::finished, audioThread, &QThread::deleteLater); connect(audioIO.data(), &AudioClient::muteToggled, this, &Application::audioMuteToggled); - connect(audioIO.data(), &AudioClient::mutedByMixer, this, &AudioScriptingInterface::mutedByMixer); - connect(audioIO.data(), &AudioClient::receivedFirstPacket, - &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::receivedFirstPacket); - connect(audioIO.data(), &AudioClient::disconnected, - &AudioScriptingInterface::getInstance(), &AudioScriptingInterface::disconnected); + connect(audioIO.data(), &AudioClient::mutedByMixer, &audioScriptingInterface, &AudioScriptingInterface::mutedByMixer); + connect(audioIO.data(), &AudioClient::receivedFirstPacket, &audioScriptingInterface, &AudioScriptingInterface::receivedFirstPacket); + connect(audioIO.data(), &AudioClient::disconnected, &audioScriptingInterface, &AudioScriptingInterface::disconnected); connect(audioIO.data(), &AudioClient::muteEnvironmentRequested, [](glm::vec3 position, float radius) { auto audioClient = DependencyManager::get(); float distance = glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), From 027d131b2adf05a33dffb67e44515673d26e0927 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:40:39 -0700 Subject: [PATCH 357/582] Move sequence number updating to PacketReceiver --- libraries/networking/src/LimitedNodeList.cpp | 6 ------ libraries/networking/src/PacketReceiver.cpp | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a91076d6ca..0b76de6304 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -234,12 +234,6 @@ PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid int LimitedNodeList::updateNodeWithDataFromPacket(QSharedPointer packet, SharedNodePointer sendingNode) { QMutexLocker locker(&sendingNode->getMutex()); - // if this was a sequence numbered packet we should store the last seq number for - // a packet of this type for this node - if (SEQUENCE_NUMBERED_PACKETS.contains(packet->getType())) { - sendingNode->setLastSequenceNumberForPacketType(packet->readSequenceNumber(), packet->getType()); - } - NodeData* linkedData = sendingNode->getLinkedData(); if (!linkedData && linkedDataCreateCallback) { linkedDataCreateCallback(sendingNode.data()); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 7d40ba9187..f7e369ee17 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -194,6 +194,12 @@ void PacketReceiver::processDatagrams() { emit dataReceived(NodeType::Unassigned, packet->getSizeWithHeader()); } + // if this was a sequence numbered packet we should store the last seq number for + // a packet of this type for this node + if (SEQUENCE_NUMBERED_PACKETS.contains(packet->getType())) { + matchingNode->setLastSequenceNumberForPacketType(packet->readSequenceNumber(), packet->getType()); + } + bool success = false; if (matchingNode) { From 24dddac6b228520e9eef7085cfbf70b70c716312 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:41:28 -0700 Subject: [PATCH 358/582] Fix call to register for multiple packet types --- assignment-client/src/entities/EntityServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index cd9a56c83d..f363600c22 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -26,7 +26,7 @@ EntityServer::EntityServer(NLPacket& packet) : _entitySimulation(NULL) { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener( + packetReceiver.registerPacketListenerForTypes( { PacketType::EntityAdd, PacketType::EntityEdit, PacketType::EntityErase }, this, "handleEntityPacket"); } From d49c71d1321361adc5b3aef28bddb93624558e85 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:42:03 -0700 Subject: [PATCH 359/582] Update a shared ptr NLPacket parameter to use NLPacket& --- libraries/networking/src/LimitedNodeList.cpp | 8 ++++---- libraries/networking/src/LimitedNodeList.h | 4 ++-- libraries/networking/src/NodeList.cpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 0b76de6304..55443b6265 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -360,8 +360,8 @@ std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingTy return pingPacket; } -std::unique_ptr LimitedNodeList::constructPingReplyPacket(QSharedPointer pingPacket) { - QDataStream pingPacketStream(pingPacket.data()); +std::unique_ptr LimitedNodeList::constructPingReplyPacket(NLPacket& pingPacket) { + QDataStream pingPacketStream(&pingPacket); PingType_t typeFromOriginalPing; pingPacketStream >> typeFromOriginalPing; @@ -390,11 +390,11 @@ std::unique_ptr LimitedNodeList::constructICEPingPacket(PingType_t pin return icePingPacket; } -std::unique_ptr LimitedNodeList::constructICEPingReplyPacket(QSharedPointer pingPacket, const QUuid& iceID) { +std::unique_ptr LimitedNodeList::constructICEPingReplyPacket(NLPacket& pingPacket, const QUuid& iceID) { // pull out the ping type so we can reply back with that PingType_t pingType; - memcpy(&pingType, pingPacket->getPayload() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); + memcpy(&pingType, pingPacket.getPayload() + NUM_BYTES_RFC4122_UUID, sizeof(PingType_t)); int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); auto icePingReplyPacket = NLPacket::create(PacketType::ICEPingReply, packetSize); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 07d1eed644..09bb439e18 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -165,10 +165,10 @@ public: void resetPacketStats(); std::unique_ptr constructPingPacket(PingType_t pingType = PingType::Agnostic); - std::unique_ptr constructPingReplyPacket(QSharedPointer pingPacket); + std::unique_ptr constructPingReplyPacket(NLPacket& pingPacket); std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUuid& iceID); - std::unique_ptr constructICEPingReplyPacket(QSharedPointer pingPacket, const QUuid& iceID); + std::unique_ptr constructICEPingReplyPacket(NLPacket& pingPacket, const QUuid& iceID); virtual bool processSTUNResponse(QSharedPointer packet); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 1daf8a1c02..3fed4bf67b 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -164,7 +164,7 @@ void NodeList::timePingReply(QSharedPointer packet, const SharedNodePo void NodeList::processPingPacket(QSharedPointer packet, SharedNodePointer sendingNode) { // send back a reply - auto replyPacket = constructPingReplyPacket(packet); + auto replyPacket = constructPingReplyPacket(*packet); const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); sendPacket(std::move(replyPacket), sendingNode, senderSockAddr); @@ -188,7 +188,7 @@ void NodeList::processPingReplyPacket(QSharedPointer packet, SharedNod void NodeList::processICEPingPacket(QSharedPointer packet) { // send back a reply - auto replyPacket = constructICEPingReplyPacket(packet, _domainHandler.getICEClientID()); + auto replyPacket = constructICEPingReplyPacket(*packet, _domainHandler.getICEClientID()); sendPacket(std::move(replyPacket), packet->getSenderSockAddr()); } From 23548a99bc0155e5d2629628120b146360dac956 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 14:43:01 -0700 Subject: [PATCH 360/582] move NACK packet disabling to EntityEditPacketSender --- interface/src/Application.h | 1 + interface/src/Menu.cpp | 6 ++++-- interface/src/Menu.h | 2 +- libraries/entities/src/EntityEditPacketSender.cpp | 4 ++-- libraries/entities/src/EntityEditPacketSender.h | 6 ++++++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index 754698acc8..e6eee75b04 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -217,6 +217,7 @@ public: OctreeQuery& getOctreeQuery() { return _octreeQuery; } EntityTree* getEntityClipboard() { return &_entityClipboard; } EntityTreeRenderer* getEntityClipboardRenderer() { return &_entityClipboardRenderer; } + EntityEditPacketSender* getEntityEditPacketSender() { return &_entityEditSender; } bool isMousePressed() const { return _mousePressed; } bool isMouseHidden() const { return !_cursorVisible; } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 9f49361f79..0f7df50245 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -499,7 +499,9 @@ Menu::Menu() { #endif MenuWrapper* networkMenu = developerMenu->addMenu("Network"); - addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableNackPackets, 0, false); + addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableNackPackets, 0, falsem + qApp()->getEntityEditPacketSender(), + SLOT(toggleNackPackets())); addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableActivityLogger, 0, @@ -542,7 +544,7 @@ Menu::Menu() { SLOT(toggleAudioNoiseReduction())); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoServerAudio, 0, false, - audioIO.data(), SLOT(toggleServerEcho())); + NackaudioIO.data(), SLOT(toggleServerEcho())); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoLocalAudio, 0, false, audioIO.data(), SLOT(toggleLocalEcho())); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::MuteAudio, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 043bb53a7f..a0ffb05a4f 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -169,7 +169,7 @@ namespace MenuOption { const QString DeleteBookmark = "Delete Bookmark..."; const QString DisableActivityLogger = "Disable Activity Logger"; const QString DisableLightEntities = "Disable Light Entities"; - const QString DisableNackPackets = "Disable NACK Packets"; + const QString DisableNackPackets = "Disable Entity NACK Packets"; const QString DiskCacheEditor = "Disk Cache Editor"; const QString DisplayHands = "Show Hand Info"; const QString DisplayHandTargets = "Show Hand Targets"; diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 160e8721f1..78bf787d54 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -23,9 +23,9 @@ EntityEditPacketSender::EntityEditPacketSender() { } void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet) { - // if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableNackPackets)) { + if (_shouldNack) { processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - // } + } } void EntityEditPacketSender::adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew) { diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 235e340da2..2e49a80f4f 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -37,5 +37,11 @@ public: // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } virtual void adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew); + +public slots: + void toggleNackPackets() { _shouldNack = !_shouldNack; } + +private: + bool _shouldNack = false; }; #endif // hifi_EntityEditPacketSender_h From 4dd3dd63867e8702654fb66ed4f5c5b60a34acc5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 14:44:04 -0700 Subject: [PATCH 361/582] swap m for comma in Menu --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 0f7df50245..9edf996e2b 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -499,7 +499,7 @@ Menu::Menu() { #endif MenuWrapper* networkMenu = developerMenu->addMenu("Network"); - addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableNackPackets, 0, falsem + addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableNackPackets, 0, false, qApp()->getEntityEditPacketSender(), SLOT(toggleNackPackets())); addCheckableActionToQMenuAndActionHash(networkMenu, From e2188415fe8bc53fd2e821cd4e3bd487adc7ca8d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 14:45:26 -0700 Subject: [PATCH 362/582] fix ref to qApp, connection to audioIO --- interface/src/Menu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 9edf996e2b..6c82fcb9d7 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -500,7 +500,7 @@ Menu::Menu() { MenuWrapper* networkMenu = developerMenu->addMenu("Network"); addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableNackPackets, 0, false, - qApp()->getEntityEditPacketSender(), + qApp->getEntityEditPacketSender(), SLOT(toggleNackPackets())); addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableActivityLogger, @@ -544,7 +544,7 @@ Menu::Menu() { SLOT(toggleAudioNoiseReduction())); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoServerAudio, 0, false, - NackaudioIO.data(), SLOT(toggleServerEcho())); + audioIO.data(), SLOT(toggleServerEcho())); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoLocalAudio, 0, false, audioIO.data(), SLOT(toggleLocalEcho())); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::MuteAudio, From 90407e2720f7b6b7cb9151aa3c6ce9c6e51c40c5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:45:32 -0700 Subject: [PATCH 363/582] Remove redundant check in if --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d6d6956a12..0f0b1b2c3c 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -734,7 +734,7 @@ void DomainServer::processListRequestPacket(QSharedPointer packet) { SharedNodePointer checkInNode = limitedNodeList->nodeWithUUID(nodeUUID); - if (!nodeUUID.isNull() && checkInNode) { + if (checkInNode) { NodeType_t throwawayNodeType; HifiSockAddr nodePublicAddress, nodeLocalAddress; From 84796b20e0722fcc8ae11156c2ef45b43a539e95 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:45:45 -0700 Subject: [PATCH 364/582] Fix call to constructICEPingReplyPacket --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 0f0b1b2c3c..a0c51564d4 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1393,7 +1393,7 @@ void DomainServer::processICEPeerInformationPacket(QSharedPointer pack void DomainServer::processICEPingPacket(QSharedPointer packet) { auto limitedNodeList = DependencyManager::get(); - auto pingReplyPacket = limitedNodeList->constructICEPingReplyPacket(packet, limitedNodeList->getSessionUUID()); + auto pingReplyPacket = limitedNodeList->constructICEPingReplyPacket(*packet, limitedNodeList->getSessionUUID()); limitedNodeList->sendPacket(std::move(pingReplyPacket), packet->getSenderSockAddr()); } From 4d9b28688de2848379092757736467d0017b22cc Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:49:51 -0700 Subject: [PATCH 365/582] Update reinterpret_cast call that should be dynamic_cast --- domain-server/src/DomainServer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index a0c51564d4..173f206665 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1413,8 +1413,9 @@ void DomainServer::processICEPingReplyPacket(QSharedPointer packet) { } void DomainServer::processNodeJSONStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - if (sendingNode->getLinkedData()) { - reinterpret_cast(sendingNode->getLinkedData())->processJSONStatsPacket(*packet); + auto nodeData = dynamic_cast(sendingNode->getLinkedData()); + if (nodeData) { + nodeData->processJSONStatsPacket(*packet); } } From 677ffb706868fbf9f35c1873bc98d22c0889a33d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:50:36 -0700 Subject: [PATCH 366/582] Remove redundant lookup for packetType --- interface/src/octree/OctreePacketProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 80528612b6..dcfc2bbeb1 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -75,7 +75,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer packet, Share static QMultiMap versionDebugSuppressMap; const QUuid& senderUUID = packet->getSourceID(); - if (!versionDebugSuppressMap.contains(senderUUID, packet->getType())) { + if (!versionDebugSuppressMap.contains(senderUUID, packetType)) { qDebug() << "Packet version mismatch on" << packetType << "- Sender" << senderUUID << "sent" << (int) packetType << "but" From dcb9c8d1255ed664cb0f42b0798743ad46eb44d2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 14:51:37 -0700 Subject: [PATCH 367/582] Fix AvatarMixer call to reinterpret_cast to use dynamic_cast --- assignment-client/src/avatars/AvatarMixer.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 35cd3d4885..022ae5b3df 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -407,13 +407,15 @@ void AvatarMixer::handleAvatarDataPacket(QSharedPointer packet, Shared void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer senderNode) { if (senderNode->getLinkedData()) { - AvatarMixerClientData* nodeData = reinterpret_cast(senderNode->getLinkedData()); - AvatarData& avatar = nodeData->getAvatar(); + AvatarMixerClientData* nodeData = dynamic_cast(senderNode->getLinkedData()); + if (nodeData != nullptr) { + AvatarData& avatar = nodeData->getAvatar(); - // parse the identity packet and update the change timestamp if appropriate - if (avatar.hasIdentityChangedAfterParsing(*packet)) { - QMutexLocker nodeDataLocker(&nodeData->getMutex()); - nodeData->setIdentityChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); + // parse the identity packet and update the change timestamp if appropriate + if (avatar.hasIdentityChangedAfterParsing(*packet)) { + QMutexLocker nodeDataLocker(&nodeData->getMutex()); + nodeData->setIdentityChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); + } } } } From 9d9ac6eefcec57140d3b9f33bdd4e8338871e55d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:00:36 -0700 Subject: [PATCH 368/582] Rename packetSizeWithHeader to be more descriptive --- assignment-client/src/Agent.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 130e4a47fb..b922629391 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -67,12 +67,12 @@ void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointe int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(packet, senderNode); if (packet->getSizeUsed() > statsMessageLength) { // pull out the piggybacked packet and create a new QSharedPointer for it - int packetSizeWithHeader = packet->getSizeUsed() - statsMessageLength; + int piggyBackedSizeWithHeader = packet->getSizeUsed() - statsMessageLength; - std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); - memcpy(buffer.get(), packet->getPayload() + statsMessageLength, packetSizeWithHeader); + std::unique_ptr buffer = std::unique_ptr(new char[piggyBackedSizeWithHeader]); + memcpy(buffer.get(), packet->getPayload() + statsMessageLength, piggyBackedSizeWithHeader); - auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, packet->getSenderSockAddr()); + auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), piggyBackedSizeWithHeader, packet->getSenderSockAddr()); packet = QSharedPointer(newPacket.release()); } else { return; // bail since no piggyback data From 7e70e25db8df0d8f778f0aca27286b23e4e06aef Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:01:56 -0700 Subject: [PATCH 369/582] Update cast to dynamic_cast in AvatarMixer --- assignment-client/src/avatars/AvatarMixer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index d24bdf409d..73b3da554f 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -421,8 +421,8 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer packet, Sh } void AvatarMixer::handleAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer senderNode) { - if (senderNode->getLinkedData()) { - AvatarMixerClientData* nodeData = static_cast(senderNode->getLinkedData()); + AvatarMixerClientData* nodeData = dynamic_cast(senderNode->getLinkedData()); + if (nodeData) { AvatarData& avatar = nodeData->getAvatar(); // parse the billboard packet and update the change timestamp if appropriate From 0c02933e668b4e1c0cbbe4d4c863271d3bff0193 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:09:45 -0700 Subject: [PATCH 370/582] Remove LimitedNodeList::processKillNode(const QByteArray& datagram) --- libraries/networking/src/LimitedNodeList.cpp | 6 +----- libraries/networking/src/LimitedNodeList.h | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 8cca09c971..0fd17eb4df 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -296,12 +296,8 @@ void LimitedNodeList::killNodeWithUUID(const QUuid& nodeUUID) { } void LimitedNodeList::processKillNode(NLPacket& packet) { - processKillNode(QByteArray::fromRawData(packet.getData(), packet.getSizeWithHeader())); -} - -void LimitedNodeList::processKillNode(const QByteArray& dataByteArray) { // read the node id - QUuid nodeUUID = QUuid::fromRfc4122(dataByteArray.mid(numBytesForPacketHeader(dataByteArray), NUM_BYTES_RFC4122_UUID)); + QUuid nodeUUID = QUuid::fromRfc4122(packet.read(NUM_BYTES_RFC4122_UUID)); // kill the node with this UUID, if it exists killNodeWithUUID(nodeUUID); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 0fb18bc834..b61fe6ea4e 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -155,7 +155,6 @@ public: const HifiSockAddr& getSTUNSockAddr() const { return _stunSockAddr; } void processKillNode(NLPacket& packet); - void processKillNode(const QByteArray& datagram); int updateNodeWithDataFromPacket(QSharedPointer packet, SharedNodePointer matchingNode); From 86e4d5f6318ca3f8192f5e0de7fc52d267471c0a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:12:32 -0700 Subject: [PATCH 371/582] Remove PacketReceiverListener --- .../networking/src/PacketReceiverListener.cpp | 0 .../networking/src/PacketReceiverListener.h | 22 ------------------- 2 files changed, 22 deletions(-) delete mode 100644 libraries/networking/src/PacketReceiverListener.cpp delete mode 100644 libraries/networking/src/PacketReceiverListener.h diff --git a/libraries/networking/src/PacketReceiverListener.cpp b/libraries/networking/src/PacketReceiverListener.cpp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libraries/networking/src/PacketReceiverListener.h b/libraries/networking/src/PacketReceiverListener.h deleted file mode 100644 index ad0f1c6f7f..0000000000 --- a/libraries/networking/src/PacketReceiverListener.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 From 7bd10afbf2a916c373f78917766fafe9683a2f49 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:22:16 -0700 Subject: [PATCH 372/582] Remove packetVersionMatch from LimitedNodeList --- libraries/networking/src/LimitedNodeList.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index b61fe6ea4e..80973f8d46 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -117,7 +117,6 @@ public: QUdpSocket& getNodeSocket() { return _nodeSocket; } QUdpSocket& getDTLSSocket(); - bool packetVersionMatch(const NLPacket& packet); bool packetSourceAndHashMatch(const NLPacket& packet, SharedNodePointer& matchingNode); PacketReceiver& getPacketReceiver() { return _packetReceiver; } From 96bd650b55a44d9add5c516273c3a9e346641eb0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:22:35 -0700 Subject: [PATCH 373/582] Fix NLPacket::localHeaderSize --- libraries/networking/src/NLPacket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 456c75cf0c..6fa7c73d39 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -13,7 +13,7 @@ qint64 NLPacket::localHeaderSize(PacketType::Value type) { qint64 size = ((NON_SOURCED_PACKETS.contains(type)) ? 0 : NUM_BYTES_RFC4122_UUID) + - ((NON_VERIFIED_PACKETS.contains(type) || NON_VERIFIED_PACKETS.contains(type)) ? 0 : NUM_BYTES_MD5_HASH); + ((NON_SOURCED_PACKETS.contains(type) || NON_VERIFIED_PACKETS.contains(type)) ? 0 : NUM_BYTES_MD5_HASH); return size; } From 47f3aad437bca64298cab4880713fa3c5a072c17 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:23:41 -0700 Subject: [PATCH 374/582] Update use of sendingNode->getUUID() to use packet->getSourceID instead --- libraries/octree/src/JurisdictionListener.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index 7f4cb2d474..c8bb111a1e 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -57,10 +57,10 @@ bool JurisdictionListener::queueJurisdictionRequest() { } void JurisdictionListener::processPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - if (packet->getType() == PacketType::Jurisdiction && sendingNode) { + if (packet->getType() == PacketType::Jurisdiction) { JurisdictionMap map; map.unpackFromPacket(*packet); - _jurisdictions[sendingNode->getUUID()] = map; + _jurisdictions[packet->getSourceID()] = map; } } From ef7a91af8f1dac7425a7d0384575055a05902843 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:27:38 -0700 Subject: [PATCH 375/582] Make NLPacket read SourceID/VerificaitionHash methods protected --- libraries/networking/src/NLPacket.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 8652bb3371..f269b27ec2 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -29,9 +29,6 @@ public: virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers virtual qint64 localHeaderSize() const; // Current level's header size - void readSourceID(); - void readVerificationHash(); - const QUuid& getSourceID() const { return _sourceID; } const QByteArray& getVerificationHash() const { return _verificationHash; } @@ -42,7 +39,10 @@ protected: NLPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); NLPacket(const NLPacket& other); + void readSourceID(); void setSourceID(const QUuid& sourceID); + + void readVerificationHash(); void setVerificationHash(const QByteArray& verificationHash); QUuid _sourceID; From 789235b8c7e31e4efe512b886a0886b0a4e91537 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:28:38 -0700 Subject: [PATCH 376/582] make NodeList deleter be deleteLater --- assignment-client/src/AssignmentClient.cpp | 25 ++++++++-- assignment-client/src/AssignmentClient.h | 2 +- assignment-client/src/audio/AudioMixer.cpp | 5 -- .../src/audio/AudioMixerDatagramProcessor.cpp | 47 ------------------- .../src/audio/AudioMixerDatagramProcessor.h | 32 ------------- assignment-client/src/octree/OctreeServer.cpp | 34 +------------- assignment-client/src/octree/OctreeServer.h | 2 - interface/src/Application.cpp | 9 ++-- libraries/networking/src/NodeList.cpp | 5 ++ libraries/networking/src/NodeList.h | 2 - .../networking/src/PacketReceiverListener.cpp | 0 .../networking/src/PacketReceiverListener.h | 22 --------- .../networking/src/ThreadedAssignment.cpp | 39 +-------------- libraries/networking/src/ThreadedAssignment.h | 2 - 14 files changed, 33 insertions(+), 193 deletions(-) delete mode 100644 assignment-client/src/audio/AudioMixerDatagramProcessor.cpp delete mode 100644 assignment-client/src/audio/AudioMixerDatagramProcessor.h delete mode 100644 libraries/networking/src/PacketReceiverListener.cpp delete mode 100644 libraries/networking/src/PacketReceiverListener.h diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 6da3786ef7..c81a521552 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -62,6 +62,17 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri DependencyManager::registerInheritance(); auto actionFactory = DependencyManager::set(); + // setup a thread for the NodeList and its PacketReceiver + QThread* nodeThread = new QThread(this); + nodeThread->setObjectName("NodeList Thread"); + nodeThread->start(); + + // make sure the node thread is given highest priority + nodeThread->setPriority(QThread::TimeCriticalPriority); + + // put the NodeList on the node thread + nodeList->moveToThread(nodeThread); + // make up a uuid for this child so the parent can tell us apart. This id will be changed // when the domain server hands over an assignment. QUuid nodeUUID = QUuid::createUuid(); @@ -124,7 +135,6 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri packetReceiver.registerListener(PacketType::CreateAssignment, this, "handleCreateAssignmentPacket"); packetReceiver.registerListener(PacketType::StopNode, this, "handleStopNodePacket"); } - void AssignmentClient::stopAssignmentClient() { qDebug() << "Forced stop of assignment-client."; @@ -150,6 +160,16 @@ void AssignmentClient::stopAssignmentClient() { } } +AssignmentClient::~AssignmentClient() { + QThread* nodeThread = DependencyManager::get()->thread(); + + // remove the NodeList from the DependencyManager + DependencyManager::destroy(); + + // ask the node thread to quit and wait until it is done + nodeThread->quit(); + nodeThread->wait(); +} void AssignmentClient::aboutToQuit() { stopAssignmentClient(); @@ -251,9 +271,6 @@ void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer pac _currentAssignment->moveToThread(workerThread); - // move the NodeList to the thread used for the _current assignment - nodeList->moveToThread(workerThread); - // Starts an event loop, and emits workerThread->started() workerThread->start(); } else { diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 348255751c..e74cd50065 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -24,10 +24,10 @@ class QSharedMemory; class AssignmentClient : public QObject, public PacketListener { Q_OBJECT public: - AssignmentClient(Assignment::Type requestAssignmentType, QString assignmentPool, QUuid walletUUID, QString assignmentServerHostname, quint16 assignmentServerPort, quint16 assignmentMonitorPort); + ~AssignmentClient(); private slots: void sendAssignmentRequest(); void assignmentCompleted(); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index a44759ae8d..d43601707d 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -52,7 +52,6 @@ #include "AudioRingBuffer.h" #include "AudioMixerClientData.h" -#include "AudioMixerDatagramProcessor.h" #include "AvatarAudioStream.h" #include "InjectedAudioStream.h" @@ -657,10 +656,6 @@ void AudioMixer::run() { // we do not want this event loop to be the handler for UDP datagrams, so disconnect disconnect(&nodeList->getNodeSocket(), 0, this, 0); - // setup a QThread with us as parent that will house the AudioMixerDatagramProcessor - _datagramProcessingThread = new QThread(this); - _datagramProcessingThread->setObjectName("Datagram Processor Thread"); - nodeList->addNodeTypeToInterestSet(NodeType::Agent); nodeList->linkedDataCreateCallback = [](Node* node) { diff --git a/assignment-client/src/audio/AudioMixerDatagramProcessor.cpp b/assignment-client/src/audio/AudioMixerDatagramProcessor.cpp deleted file mode 100644 index 73a4e01844..0000000000 --- a/assignment-client/src/audio/AudioMixerDatagramProcessor.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// AudioMixerDatagramProcessor.cpp -// assignment-client/src -// -// Created by Stephen Birarda on 2014-08-14. -// Copyright 2014 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 - -#include -#include - -#include "AudioMixerDatagramProcessor.h" - -AudioMixerDatagramProcessor::AudioMixerDatagramProcessor(QUdpSocket& nodeSocket, QThread* previousNodeSocketThread) : - _nodeSocket(nodeSocket), - _previousNodeSocketThread(previousNodeSocketThread) -{ - -} - -AudioMixerDatagramProcessor::~AudioMixerDatagramProcessor() { - // return the node socket to its previous thread - _nodeSocket.moveToThread(_previousNodeSocketThread); -} - -void AudioMixerDatagramProcessor::readPendingDatagrams() { - - HifiSockAddr senderSockAddr; - static QByteArray incomingPacket; - - // read everything that is available - while (_nodeSocket.hasPendingDatagrams()) { - incomingPacket.resize(_nodeSocket.pendingDatagramSize()); - - // just get this packet off the stack - _nodeSocket.readDatagram(incomingPacket.data(), incomingPacket.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - - // emit the signal to tell AudioMixer it needs to process a packet - emit packetRequiresProcessing(incomingPacket, senderSockAddr); - } -} diff --git a/assignment-client/src/audio/AudioMixerDatagramProcessor.h b/assignment-client/src/audio/AudioMixerDatagramProcessor.h deleted file mode 100644 index 94233a1373..0000000000 --- a/assignment-client/src/audio/AudioMixerDatagramProcessor.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// AudioMixerDatagramProcessor.h -// assignment-client/src -// -// Created by Stephen Birarda on 2014-08-14. -// Copyright 2014 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_AudioMixerDatagramProcessor_h -#define hifi_AudioMixerDatagramProcessor_h - -#include -#include - -class AudioMixerDatagramProcessor : public QObject { - Q_OBJECT -public: - AudioMixerDatagramProcessor(QUdpSocket& nodeSocket, QThread* previousNodeSocketThread); - ~AudioMixerDatagramProcessor(); -public slots: - void readPendingDatagrams(); -signals: - void packetRequiresProcessing(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); -private: - QUdpSocket& _nodeSocket; - QThread* _previousNodeSocketThread; -}; - -#endif // hifi_AudioMixerDatagramProcessor_h \ No newline at end of file diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index efcde790f9..dfb832eed4 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -838,36 +838,6 @@ void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer pack _jurisdictionSender->queueReceivedPacket(packet, senderNode); } -void OctreeServer::setupDatagramProcessingThread() { - auto nodeList = DependencyManager::get(); - - // we do not want this event loop to be the handler for UDP datagrams, so disconnect - disconnect(&nodeList->getNodeSocket(), 0, this, 0); - - // setup a QThread with us as parent that will house the OctreeServerDatagramProcessor - _datagramProcessingThread = new QThread(this); - _datagramProcessingThread->setObjectName("Octree Datagram Processor"); - - // create an OctreeServerDatagramProcessor and move it to that thread - OctreeServerDatagramProcessor* datagramProcessor = new OctreeServerDatagramProcessor(nodeList->getNodeSocket(), thread()); - datagramProcessor->moveToThread(_datagramProcessingThread); - - // remove the NodeList as the parent of the node socket - nodeList->getNodeSocket().setParent(NULL); - nodeList->getNodeSocket().moveToThread(_datagramProcessingThread); - - // let the datagram processor handle readyRead from node socket - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, - datagramProcessor, &OctreeServerDatagramProcessor::readPendingDatagrams); - - // delete the datagram processor and the associated thread when the QThread quits - connect(_datagramProcessingThread, &QThread::finished, datagramProcessor, &QObject::deleteLater); - connect(datagramProcessor, &QObject::destroyed, _datagramProcessingThread, &QThread::deleteLater); - - // start the datagram processing thread - _datagramProcessingThread->start(); -} - bool OctreeServer::readOptionBool(const QString& optionName, const QJsonObject& settingsSectionObject, bool& result) { result = false; // assume it doesn't exist bool optionAvailable = false; @@ -1079,15 +1049,13 @@ void OctreeServer::run() { // use common init to setup common timers and logging commonInit(getMyLoggingServerTargetName(), getMyNodeType()); - setupDatagramProcessingThread(); - // read the configuration from either the payload or the domain server configuration readConfiguration(); beforeRun(); // after payload has been processed connect(nodeList.data(), SIGNAL(nodeAdded(SharedNodePointer)), SLOT(nodeAdded(SharedNodePointer))); - connect(nodeList.data(), SIGNAL(nodeKilled(SharedNodePointer)),SLOT(nodeKilled(SharedNodePointer))); + connect(nodeList.data(), SIGNAL(nodeKilled(SharedNodePointer)), SLOT(nodeKilled(SharedNodePointer))); // we need to ask the DS about agents so we can ping/reply with them diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index bcc9f8cc43..419cdabc58 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -145,8 +145,6 @@ protected: QString getConfiguration(); QString getStatusLink(); - void setupDatagramProcessingThread(); - int _argc; const char** _argv; char** _parsedArgV; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d02f5daea6..57f2b7c523 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -380,17 +380,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // start the nodeThread so its event loop is running QThread* nodeThread = new QThread(this); - nodeThread->setObjectName("Datagram Processor Thread"); + nodeThread->setObjectName("NodeList Thread"); nodeThread->start(); // make sure the node thread is given highest priority nodeThread->setPriority(QThread::TimeCriticalPriority); - // have the NodeList use deleteLater from DM customDeleter - nodeList->setCustomDeleter([](Dependency* dependency) { - static_cast(dependency)->deleteLater(); - }); - // setup a timer for domain-server check ins QTimer* domainCheckInTimer = new QTimer(nodeList.data()); connect(domainCheckInTimer, &QTimer::timeout, nodeList.data(), &NodeList::sendDomainServerCheckIn); @@ -748,6 +743,8 @@ Application::~Application() { DependencyManager::destroy(); QThread* nodeThread = DependencyManager::get()->thread(); + + // remove the NodeList from the DependencyManager DependencyManager::destroy(); // ask the node thread to quit and wait until it is done diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 3773a8a540..45fdb2590b 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -45,6 +45,11 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned qRegisterMetaType(); firstCall = false; } + + setCustomDeleter([](Dependency* dependency){ + static_cast(dependency)->deleteLater(); + }); + auto addressManager = DependencyManager::get(); // handle domain change signals from AddressManager diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index b9f782f717..72e8d577e0 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -112,8 +112,6 @@ private: DomainHandler _domainHandler; int _numNoReplyDomainCheckIns; HifiSockAddr _assignmentServerSocket; - - friend class Application; }; #endif // hifi_NodeList_h diff --git a/libraries/networking/src/PacketReceiverListener.cpp b/libraries/networking/src/PacketReceiverListener.cpp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libraries/networking/src/PacketReceiverListener.h b/libraries/networking/src/PacketReceiverListener.h deleted file mode 100644 index ad0f1c6f7f..0000000000 --- a/libraries/networking/src/PacketReceiverListener.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/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index b1c4bdbc7f..fe63348e02 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -20,8 +20,8 @@ ThreadedAssignment::ThreadedAssignment(NLPacket& packet) : Assignment(packet), - _isFinished(false), - _datagramProcessingThread(NULL) + _isFinished(false) + { } @@ -42,31 +42,9 @@ void ThreadedAssignment::setFinished(bool isFinished) { _statsTimer->stop(); } - // stop processing datagrams from the node socket - // this ensures we won't process a domain list while we are going down - auto nodeList = DependencyManager::get(); - disconnect(&nodeList->getNodeSocket(), 0, this, 0); - // call our virtual aboutToFinish method - this gives the ThreadedAssignment subclass a chance to cleanup aboutToFinish(); - // if we have a datagram processing thread, quit it and wait on it to make sure that - // the node socket is back on the same thread as the NodeList - - - if (_datagramProcessingThread) { - // tell the datagram processing thread to quit and wait until it is done, - // then return the node socket to the NodeList - _datagramProcessingThread->quit(); - _datagramProcessingThread->wait(); - - // set node socket parent back to NodeList - nodeList->getNodeSocket().setParent(nodeList.data()); - } - - // move the NodeList back to the QCoreApplication instance's thread - nodeList->moveToThread(QCoreApplication::instance()->thread()); - emit finished(); } } @@ -120,16 +98,3 @@ void ThreadedAssignment::checkInWithDomainServerOrExit() { DependencyManager::get()->sendDomainServerCheckIn(); } } - -bool ThreadedAssignment::readAvailableDatagram(QByteArray& destinationByteArray, HifiSockAddr& senderSockAddr) { - auto nodeList = DependencyManager::get(); - - if (nodeList->getNodeSocket().hasPendingDatagrams()) { - destinationByteArray.resize(nodeList->getNodeSocket().pendingDatagramSize()); - nodeList->getNodeSocket().readDatagram(destinationByteArray.data(), destinationByteArray.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - return true; - } else { - return false; - } -} diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index 922a34b3e4..cfe2363c98 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -38,10 +38,8 @@ signals: void finished(); protected: - bool readAvailableDatagram(QByteArray& destinationByteArray, HifiSockAddr& senderSockAddr); void commonInit(const QString& targetName, NodeType_t nodeType, bool shouldSendStats = true); bool _isFinished; - QThread* _datagramProcessingThread; QTimer* _domainServerTimer = nullptr; QTimer* _statsTimer = nullptr; From 19c1ce2d6f3381de1cfdc5a2fb4de06f2f4002ee Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:29:41 -0700 Subject: [PATCH 377/582] remove the QUDPSocket readyRead hack --- libraries/networking/src/ThreadedAssignment.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index fe63348e02..7631a76a76 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -57,9 +57,6 @@ void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeTy auto nodeList = DependencyManager::get(); nodeList->setOwnerType(nodeType); - // this is a temp fix for Qt 5.3 - rebinding the node socket gives us readyRead for the socket on this thread - nodeList->rebindNodeSocket(); - _domainServerTimer = new QTimer(); connect(_domainServerTimer, SIGNAL(timeout()), this, SLOT(checkInWithDomainServerOrExit())); _domainServerTimer->start(DOMAIN_SERVER_CHECK_IN_MSECS); From c05105e2f9d556358d529c5798e03edb10f22fd7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 14 Jul 2015 15:29:49 -0700 Subject: [PATCH 378/582] Added takeFront method to PacketList --- libraries/networking/src/LimitedNodeList.cpp | 6 ++---- libraries/networking/src/udt/PacketList.h | 13 +++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index d54fbd093b..005499cc53 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -288,10 +288,8 @@ qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& des qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) { qint64 bytesSent{ 0 }; - auto& packets = packetList._packets; - while (!packets.empty()) { - bytesSent += sendPacket(std::move(packets.front()), sockAddr); - packets.pop_front(); + while (!packetList._packets.empty()) { + bytesSent += sendPacket(std::move(packetList.takeFront()), sockAddr); } return bytesSent; diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index cbd2870ed8..173e8c75fb 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -47,6 +47,10 @@ private: PacketList(const PacketList& other) = delete; PacketList& operator=(const PacketList& other) = delete; + // Takes the first packet of the list and returns it. + template std::unique_ptr takeFront(); + + // Creates a new packet, can be overriden to change return underlying type virtual std::unique_ptr createPacket(); std::unique_ptr createPacketWithExtendedHeader(); @@ -62,6 +66,7 @@ private: }; template qint64 PacketList::readPrimitive(T* data) { + static_assert(!std::is_pointer::value, "T must not be a pointer"); return QIODevice::read(reinterpret_cast(data), sizeof(T)); } @@ -70,4 +75,12 @@ template qint64 PacketList::writePrimitive(const T& data) { return QIODevice::write(reinterpret_cast(&data), sizeof(T)); } +template std::unique_ptr PacketList::takeFront() { + static_assert(std::is_base_of::value, "T must derive from Packet."); + + auto packet = std::move(_packets.front()); + _packets.pop_front(); + return std::move(std::unique_ptr(dynamic_cast(packet.release()))); +} + #endif // hifi_PacketList_h \ No newline at end of file From fd1648c0d7efb2203b8f55bbda0e6ef949d2b807 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 14 Jul 2015 15:30:41 -0700 Subject: [PATCH 379/582] Code cleanup --- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 2 -- libraries/networking/src/udt/Packet.cpp | 37 ++++++++++---------- libraries/networking/src/udt/PacketHeaders.h | 1 + 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 005499cc53..677dab7a03 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -275,7 +275,7 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) { - return writeDatagram(packet->getData(), sockAddr); + return writeDatagram({packet->getData(), static_cast(packet->getSizeWithHeader())}, sockAddr); } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 3d9f85aa08..64fa6daae0 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -42,8 +42,6 @@ #include "NLPacketList.h" #include "UUIDHasher.h" -const int MAX_PACKET_SIZE = 1450; - const quint64 NODE_SILENCE_THRESHOLD_MSECS = 2 * 1000; extern const char SOLO_NODE_TYPES[2]; diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index f7a52b068a..f5253a0628 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -11,8 +11,6 @@ #include "Packet.h" -#include "../LimitedNodeList.h" - qint64 Packet::localHeaderSize(PacketType::Value type) { qint64 size = numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion) + ((SEQUENCE_NUMBERED_PACKETS.contains(type)) ? sizeof(SequenceNumber) : 0); @@ -44,23 +42,24 @@ Packet::Packet(PacketType::Value type, qint64 size) : _packetSize(localHeaderSize(_type) + size), _packet(new char(_packetSize)), _payloadStart(_packet.get() + localHeaderSize(_type)), - _capacity(size) { - auto maxPayload = maxPayloadSize(type); - if (size == -1) { - // default size of -1, means biggest packet possible - size = maxPayload; - } - - // Sanity check - Q_ASSERT(size >= 0 || size < maxPayload); - - // copy packet type and version in header - writePacketTypeAndVersion(type); - - // Set control bit and sequence number to 0 if necessary - if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { - writeSequenceNumber(0); - } + _capacity(size) +{ + auto maxPayload = maxPayloadSize(type); + if (size == -1) { + // default size of -1, means biggest packet possible + size = maxPayload; + } + + // Sanity check + Q_ASSERT(size >= 0 || size < maxPayload); + + // copy packet type and version in header + writePacketTypeAndVersion(type); + + // Set control bit and sequence number to 0 if necessary + if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { + writeSequenceNumber(0); + } } Packet::Packet(const Packet& other) { diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 0108e3e03a..317fafec46 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -83,6 +83,7 @@ namespace PacketType { ICEPingReply }; }; +const int MAX_PACKET_SIZE = 1450; typedef char PacketVersion; From e749b9727f1e0cdd7719f65009f33f973a00cfeb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:33:05 -0700 Subject: [PATCH 380/582] have threaded assignment de-register for packets in finished --- libraries/networking/src/ThreadedAssignment.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 7631a76a76..44d1aaf280 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -34,6 +34,9 @@ void ThreadedAssignment::setFinished(bool isFinished) { qDebug() << "ThreadedAssignment::setFinished(true) called - finishing up."; + // we should de-register immediately for any of our packets + DependencyManager::get()->getPacketReceiver().unregisterListener(this); + if (_domainServerTimer) { _domainServerTimer->stop(); } From 774a0626b374fcc31a3d00dd6ec356ed9b79ac81 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 14 Jul 2015 15:36:56 -0700 Subject: [PATCH 381/582] Bump all packet version --- .../networking/src/udt/PacketHeaders.cpp | 44 +++++++++---------- libraries/networking/src/udt/PacketHeaders.h | 1 + 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index bea061ae74..b329125896 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -66,48 +66,48 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { switch (packetType) { case MicrophoneAudioNoEcho: case MicrophoneAudioWithEcho: - return 2; + return 3; case SilentAudioFrame: - return 4; + return 5; case MixedAudio: - return 1; - case InjectAudio: - return 1; - case AvatarData: - return 6; - case AvatarIdentity: - return 1; - case EnvironmentData: return 2; + case InjectAudio: + return 2; + case AvatarData: + return 7; + case AvatarIdentity: + return 2; + case EnvironmentData: + return 3; case DomainList: case DomainListRequest: - return 5; + return 6; case DomainConnectRequest: - return 1; + return 2; case CreateAssignment: case RequestAssignment: - return 2; + return 3; case OctreeStats: - return 1; + return 2; case OctreeDataNack: - return 1; + return 2; case StopNode: - return 1; + return 2; case EntityAdd: case EntityEdit: case EntityData: - return VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE; + return VERSION_ENTITIES_NEW_PROTOCOL_LAYER; case EntityEditNack: - return 1; - case EntityErase: return 2; + case EntityErase: + return 3; case AudioStreamStats: - return 1; + return 2; case ICEServerHeartbeat: case ICEServerQuery: - return 1; + return 2; default: - return 0; + return 1; } } diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 317fafec46..d072d3831f 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -168,5 +168,6 @@ const PacketVersion VERSION_ENTITIES_FACE_CAMERA = 30; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP = 31; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE = 33; +const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 34; #endif // hifi_PacketHeaders_h From 55eb24e69ef9a0268aa8c4a4ae9e93b9ab95961e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:41:31 -0700 Subject: [PATCH 382/582] call right method from packetReceiver --- libraries/networking/src/PacketReceiver.cpp | 32 ++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 20cc5c5b15..31460de3b9 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -218,24 +218,32 @@ void PacketReceiver::processDatagrams() { auto listener = it.value(); if (listener.first) { + + bool success = false; if (matchingNode) { emit dataReceived(matchingNode->getType(), packet->getSizeWithHeader()); + QMetaMethod metaMethod = listener.second; + + static const QByteArray SHARED_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer"); + + if (metaMethod.parameterTypes().contains(SHARED_NODE_NORMALIZED)) { + success = metaMethod.invoke(listener.first, + Q_ARG(QSharedPointer, QSharedPointer(packet.release())), + Q_ARG(SharedNodePointer, matchingNode)); + + } else { + success = metaMethod.invoke(listener.first, + Q_ARG(QSharedPointer, QSharedPointer(packet.release()))); + } + } else { emit dataReceived(NodeType::Unassigned, packet->getSizeWithHeader()); - } - - bool success = false; - if (matchingNode) { success = listener.second.invoke(listener.first, Q_ARG(QSharedPointer, QSharedPointer(packet.release()))); - } else { - success = listener.second.invoke(listener.first, - Q_ARG(QSharedPointer, QSharedPointer(packet.release())), - Q_ARG(SharedNodePointer, matchingNode)); } - + if (!success) { qDebug() << "Error delivering packet " << nameForPacketType(packet->getType()) << " to listener: " << listener.first->objectName() << "::" << listener.second.name(); @@ -247,13 +255,11 @@ void PacketReceiver::processDatagrams() { << "has been destroyed - removing mapping."; _packetListenerMap.erase(it); } - - _packetListenerLock.unlock(); - } else { - _packetListenerLock.unlock(); qDebug() << "No listener found for packet type " << nameForPacketType(packet->getType()); } + + _packetListenerLock.unlock(); } } } From ca47165d72473818444dce42212e8573030886cf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:42:28 -0700 Subject: [PATCH 383/582] compare bytesAvailable to 0 --- libraries/octree/src/OctreeRenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 54ce95b803..9f4cd0d1a1 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -108,7 +108,7 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN bool error = false; - while (packet.bytesAvailable() && !error) { + while (packet.bytesAvailable() > 0 && !error) { if (packetIsCompressed) { if (packet.bytesAvailable() > (qint64) sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE)) { packet.readPrimitive(§ionLength); From 71866d52ed329656717dee2befabd27d79140b9d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:43:00 -0700 Subject: [PATCH 384/582] Update packet reading to use fromRawData for reading uuid --- assignment-client/src/AssignmentClientMonitor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 3ec457598c..aa5b2f4749 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -203,7 +203,7 @@ void AssignmentClientMonitor::checkSpares() { } void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { - QUuid senderID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); + QUuid senderID = QUuid::fromRfc4122(QByteArray::fromRawData(packet->getData(), NUM_BYTES_RFC4122_UUID)); auto nodeList = DependencyManager::get(); From b7b2cb73efa87e5d96274673e7c7a1206ff28f06 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:43:10 -0700 Subject: [PATCH 385/582] remove check for shutting down --- libraries/networking/src/PacketReceiver.cpp | 4 ---- libraries/networking/src/PacketReceiver.h | 2 -- 2 files changed, 6 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 31460de3b9..1f163cdaf3 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -174,10 +174,6 @@ void PacketReceiver::processDatagrams() { //PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), //"PacketReceiver::processDatagrams()"); - if (_isShuttingDown) { - return; // bail early... we're shutting down. - } - auto nodeList = DependencyManager::get(); while (nodeList->getNodeSocket().hasPendingDatagrams()) { diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index c84b5ef432..bf5889af1e 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -37,8 +37,6 @@ public: void resetCounters() { _inPacketCount = 0; _inByteCount = 0; } - void shutdown() { _isShuttingDown = true; } - void registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot); void registerListener(PacketType::Value type, PacketListener* listener, const char* slot); void unregisterListener(PacketListener* listener); From 38591a8edbe535eec7460f3b64dffe5b6c75c72d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:43:15 -0700 Subject: [PATCH 386/582] Update avatar billboard loading to use packet.readAll() --- libraries/avatars/src/AvatarData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 25a1247691..f036c0ca8f 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -911,7 +911,7 @@ QByteArray AvatarData::identityByteArray() { } bool AvatarData::hasBillboardChangedAfterParsing(NLPacket& packet) { - QByteArray newBillboard = QByteArray(packet.getPayload()); + QByteArray newBillboard = packet.readAll(); if (newBillboard == _billboard) { return false; } From fb7cb7ff5368b8c0077055835c372204c8070207 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:49:54 -0700 Subject: [PATCH 387/582] add the option for PacketReceiver to drop packets --- assignment-client/src/AssignmentClient.cpp | 3 +++ interface/src/Application.cpp | 9 ++++----- libraries/networking/src/PacketReceiver.cpp | 5 +++++ libraries/networking/src/PacketReceiver.h | 4 +++- libraries/networking/src/ThreadedAssignment.cpp | 7 ++++++- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index c81a521552..bc2b18cb53 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -330,6 +330,9 @@ void AssignmentClient::assignmentCompleted() { auto nodeList = DependencyManager::get(); + // tell the packet receiver to stop dropping packets + nodeList->getPacketReceiver().setShouldDropPackets(false); + // reset our NodeList by switching back to unassigned and clearing the list nodeList->setOwnerType(NodeType::Unassigned); nodeList->reset(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 57f2b7c523..824de916d5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -663,12 +663,11 @@ void Application::aboutToQuit() { void Application::cleanupBeforeQuit() { - // stop handling packets we've asked to handle - DependencyManager::get()->getPacketReceiver().unregisterListener(this); - _entities.clear(); // this will allow entity scripts to properly shutdown - - //_datagramProcessor->shutdown(); // tell the datagram processor we're shutting down, so it can short circuit + + // tell the packet receiver we're shutting down, so it can drop packets + DependencyManager::get()->getPacketReceiver().setShouldDropPackets(true); + _entities.shutdown(); // tell the entities system we're shutting down, so it will stop running scripts ScriptEngine::stopAllScripts(this); // stop all currently running global scripts diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 1f163cdaf3..4c3f268d06 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -180,6 +180,11 @@ void PacketReceiver::processDatagrams() { // setup a buffer to read the packet into int packetSizeWithHeader = nodeList->getNodeSocket().pendingDatagramSize(); std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); + + // if we're supposed to drop this packet then break out here + if (_shouldDropPackets) { + break; + } // setup a HifiSockAddr to read into HifiSockAddr senderSockAddr; diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index bf5889af1e..448ca07876 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -34,6 +34,8 @@ public: int getInPacketCount() const { return _inPacketCount; } int getInByteCount() const { return _inByteCount; } + + void setShouldDropPackets(bool shouldDropPackets) { _shouldDropPackets = shouldDropPackets; } void resetCounters() { _inPacketCount = 0; _inByteCount = 0; } @@ -61,7 +63,7 @@ private: QHash _packetListenerMap; int _inPacketCount = 0; int _inByteCount = 0; - bool _isShuttingDown = false; + bool _shouldDropPackets = false; }; #endif // hifi_PacketReceiver_h diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 44d1aaf280..1c425806c9 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -34,8 +34,13 @@ void ThreadedAssignment::setFinished(bool isFinished) { qDebug() << "ThreadedAssignment::setFinished(true) called - finishing up."; + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + // we should de-register immediately for any of our packets - DependencyManager::get()->getPacketReceiver().unregisterListener(this); + packetReceiver.unregisterListener(this); + + // we should also tell the packet receiver to drop packets while we're cleaning up + packetReceiver.setShouldDropPackets(true); if (_domainServerTimer) { _domainServerTimer->stop(); From bbe5a3d682174464b4dc8ad33462b1a4657e3db7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:51:32 -0700 Subject: [PATCH 388/582] remove commented out call to resetCounters --- interface/src/Application.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 824de916d5..f9ac9e3a2c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1797,7 +1797,6 @@ void Application::checkFPS() { _fps = (float)_frameCount / diffTime; _frameCount = 0; - //_datagramProcessor->resetCounters(); _timerStart.start(); } From b4d01c464408855e7a50ec9bd4ff459d2863ba79 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:52:16 -0700 Subject: [PATCH 389/582] fix variable name for coding standard --- libraries/networking/src/PacketReceiver.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 448ca07876..f0066115e0 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -47,8 +47,8 @@ public slots: void processDatagrams(); signals: - void dataSent(quint8 channel_type, int bytes); - void dataReceived(quint8 channel_type, int bytes); + void dataSent(quint8 channelType, int bytes); + void dataReceived(quint8 channelType, int bytes); void packetVersionMismatch(PacketType::Value type); private: From a61fbff01870124b46444780ca3c6331aedf5106 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:52:28 -0700 Subject: [PATCH 390/582] Add error handling when reading path query response --- libraries/networking/src/NodeList.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 0bf478856e..f69b655306 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -370,14 +370,19 @@ void NodeList::processDomainServerPathQueryResponse(QSharedPointer pac packet->readPrimitive(&numViewpointBytes); // pull the viewpoint from the packet - QString viewpoint = QString::fromUtf8(packet->read(numViewpointBytes)); + auto stringData = packet->read(numViewpointBytes) + if (stringData.size() == numViewpointBytes) { + QString viewpoint = QString::fromUtf8(stringData); - // Hand it off to the AddressManager so it can handle it as a relative viewpoint - if (DependencyManager::get()->goToViewpointForPath(viewpoint, pathQuery)) { - qCDebug(networking) << "Going to viewpoint" << viewpoint << "which was the lookup result for path" << pathQuery; + // Hand it off to the AddressManager so it can handle it as a relative viewpoint + if (DependencyManager::get()->goToViewpointForPath(viewpoint, pathQuery)) { + qCDebug(networking) << "Going to viewpoint" << viewpoint << "which was the lookup result for path" << pathQuery; + } else { + qCDebug(networking) << "Could not go to viewpoint" << viewpoint + << "which was the lookup result for path" << pathQuery; + } } else { - qCDebug(networking) << "Could not go to viewpoint" << viewpoint - << "which was the lookup result for path" << pathQuery; + qCDebug(networking) << "Error loading viewpoint from path query response"; } } From 5edb809cd1509192e3b3ca3dbfd595bb45a9b5f1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 15:54:23 -0700 Subject: [PATCH 391/582] remove header packet methods from LimitedNodeList --- libraries/networking/src/LimitedNodeList.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 5e23b2e93c..d397d5dea8 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -122,13 +122,6 @@ public: PacketReceiver& getPacketReceiver() { return _packetReceiver; } - // QByteArray byteArrayWithPopulatedHeader(PacketType::Value packetType) - // { return byteArrayWithUUIDPopulatedHeader(packetType, _sessionUUID); } - // int populatePacketHeader(QByteArray& packet, PacketType::Value packetType) - // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - // int populatePacketHeader(char* packet, PacketType::Value packetType) - // { return populatePacketHeaderWithUUID(packet, packetType, _sessionUUID); } - qint64 sendUnreliablePacket(const NLPacket& packet, const SharedNodePointer& destinationNode) { assert(false); return 0; } qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { assert(false); return 0; } From e99df5b56d551cf939c5a38b2b04b905ee05a6ae Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 15:55:39 -0700 Subject: [PATCH 392/582] Fix size of statusPacket in AssignmentClient --- assignment-client/src/AssignmentClient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 6da3786ef7..8507f5c898 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -168,8 +168,6 @@ void AssignmentClient::setUpStatusToMonitor() { void AssignmentClient::sendStatusPacketToACM() { // tell the assignment client monitor what this assignment client is doing (if anything) auto nodeList = DependencyManager::get(); - - auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, 1 + NUM_BYTES_RFC4122_UUID); quint8 assignmentType = Assignment::Type::AllTypes; @@ -177,6 +175,8 @@ void AssignmentClient::sendStatusPacketToACM() { assignmentType = _currentAssignment->getType(); } + auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, typeof(assignmentType) + NUM_BYTES_RFC4122_UUID); + statusPacket->write(nodeList->getSessionUUID().toRfc4122()); statusPacket->writePrimitive(assignmentType); From aca759aa2f04065db1cc29020f05d3cf01858112 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 14 Jul 2015 16:03:42 -0700 Subject: [PATCH 393/582] Implement brodcastToNodes --- libraries/networking/src/LimitedNodeList.cpp | 22 ++++++++++++++++++-- libraries/networking/src/LimitedNodeList.h | 5 +++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 677dab7a03..98d690a029 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -234,6 +234,11 @@ qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* a return result; } + +qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr) { + return writeDatagram({packet.getData(), static_cast(packet.getSizeWithHeader())}, destinationSockAddr); +} + qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { // XXX can BandwidthRecorder be used for this? // stat collection for packets @@ -261,7 +266,7 @@ qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& } qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { - return writeDatagram(packet.getData(), sockAddr); + return writeDatagram(packet, sockAddr); } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& destinationNode) { @@ -275,7 +280,7 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) { - return writeDatagram({packet->getData(), static_cast(packet->getSizeWithHeader())}, sockAddr); + return writeDatagram(*packet, sockAddr); } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { @@ -519,6 +524,19 @@ std::unique_ptr LimitedNodeList::constructICEPingReplyPacket(const QBy return icePingReplyPacket; } +unsigned int LimitedNodeList::broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) { + unsigned int n = 0; + + eachNode([&](const SharedNodePointer& node){ + if (destinationNodeTypes.contains(node->getType())) { + writeDatagram(*packet, *node->getActiveSocket()); + ++n; + } + }); + + return n; +} + SharedNodePointer LimitedNodeList::soloNodeOfType(char nodeType) { return nodeMatchingPredicate([&](const SharedNodePointer& node){ return node->getType() == nodeType; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 64fa6daae0..f60319f97d 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -153,7 +153,7 @@ public: int updateNodeWithDataFromPacket(const SharedNodePointer& matchingNode, const QByteArray& packet); int findNodeAndUpdateWithDataFromPacket(const QByteArray& packet); - unsigned broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes) { assert(false); return 0; } + unsigned int broadcastToNodes(std::unique_ptr packet, const NodeSet& destinationNodeTypes); SharedNodePointer soloNodeOfType(char nodeType); void getPacketStats(float &packetsPerSecond, float &bytesPerSecond); @@ -254,7 +254,8 @@ protected: LimitedNodeList(unsigned short socketListenPort = 0, unsigned short dtlsListenPort = 0); LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton - + + qint64 writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr); qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); PacketSequenceNumber getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType); From 3cd2887a089ad752f6c6d6f04a7743158cd1aeeb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 16:11:29 -0700 Subject: [PATCH 394/582] add initial packet tests --- tests/networking/src/PacketTests.cpp | 14 ++++++++++++++ tests/networking/src/PacketTests.h | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 tests/networking/src/PacketTests.cpp create mode 100644 tests/networking/src/PacketTests.h diff --git a/tests/networking/src/PacketTests.cpp b/tests/networking/src/PacketTests.cpp new file mode 100644 index 0000000000..c8c88679fb --- /dev/null +++ b/tests/networking/src/PacketTests.cpp @@ -0,0 +1,14 @@ +// +// PacketTests.cpp +// tests/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 "PacketTests.h" + +QTEST_MAIN(PacketTests) diff --git a/tests/networking/src/PacketTests.h b/tests/networking/src/PacketTests.h new file mode 100644 index 0000000000..498fddf39a --- /dev/null +++ b/tests/networking/src/PacketTests.h @@ -0,0 +1,25 @@ +// +// PacketTests.h +// tests/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_PacketTests_h +#define hifi_PacketTests_h + +#pragma once + +#include + +class PacketTests : public QObject { + Q_OBJECT +private slots: + void readTest(); +}; + +#endif // hifi_PacketTests_h From 6d6b9b81171782119bb8c0c9060c6ab47c2eaf27 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 16:11:48 -0700 Subject: [PATCH 395/582] pass sending node to processListRequestPacket --- domain-server/src/DomainServer.cpp | 29 ++++++++++------------------- domain-server/src/DomainServer.h | 2 +- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 21b2ce0f58..0a546d45db 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -726,31 +726,22 @@ void DomainServer::processConnectRequestPacket(QSharedPointer packet) } } -void DomainServer::processListRequestPacket(QSharedPointer packet) { - QDataStream packetStream(packet.data()); +void DomainServer::processListRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - const QUuid& nodeUUID = packet->getSourceID(); + NodeType_t throwawayNodeType; + HifiSockAddr nodePublicAddress, nodeLocalAddress; - auto limitedNodeList = DependencyManager::get(); + QDataStream packetStream(packet.data()); - SharedNodePointer checkInNode = limitedNodeList->nodeWithUUID(nodeUUID); + parseNodeData(packetStream, throwawayNodeType, nodePublicAddress, nodeLocalAddress, packet->getSenderSockAddr()); - if (!nodeUUID.isNull() && checkInNode) { - NodeType_t throwawayNodeType; - HifiSockAddr nodePublicAddress, nodeLocalAddress; + sendingNode->setPublicSocket(nodePublicAddress); + sendingNode->setLocalSocket(nodeLocalAddress); - QDataStream packetStream(packet.data()); + QList nodeInterestList; + packetStream >> nodeInterestList; - parseNodeData(packetStream, throwawayNodeType, nodePublicAddress, nodeLocalAddress, packet->getSenderSockAddr()); - - checkInNode->setPublicSocket(nodePublicAddress); - checkInNode->setLocalSocket(nodeLocalAddress); - - QList nodeInterestList; - packetStream >> nodeInterestList; - - sendDomainListToNode(checkInNode, packet->getSenderSockAddr(), nodeInterestList.toSet()); - } + sendDomainListToNode(sendingNode, packet->getSenderSockAddr(), nodeInterestList.toSet()); } unsigned int DomainServer::countConnectedUsers() { diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 7f7cba7445..c2d5db367f 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -58,7 +58,7 @@ public slots: void processRequestAssignmentPacket(QSharedPointer packet); void processConnectRequestPacket(QSharedPointer packet); - void processListRequestPacket(QSharedPointer packet); + void processListRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processNodeJSONStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processPathQueryPacket(QSharedPointer packet); void processICEPingPacket(QSharedPointer packet); From d36ed9cd0d6f1a9bde48e1c76d3e2cfeb5a9821a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 16:12:47 -0700 Subject: [PATCH 396/582] Fix missing semicolon --- libraries/networking/src/NodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 8a3aa618a4..9d0e6d566e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -375,7 +375,7 @@ void NodeList::processDomainServerPathQueryResponse(QSharedPointer pac packet->readPrimitive(&numViewpointBytes); // pull the viewpoint from the packet - auto stringData = packet->read(numViewpointBytes) + auto stringData = packet->read(numViewpointBytes); if (stringData.size() == numViewpointBytes) { QString viewpoint = QString::fromUtf8(stringData); From e4849d29ec56c7e2de2519a19f21a6f556a0dc29 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 16:14:43 -0700 Subject: [PATCH 397/582] re-use iterator when checking _octreeServerSceneStats --- interface/src/Application.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f9ac9e3a2c..46f14319d1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3939,8 +3939,9 @@ int Application::processOctreeStats(NLPacket& packet, SharedNodePointer sendingN // now that we know the node ID, let's add these stats to the stats for that node... _octreeSceneStatsLock.lockForWrite(); - if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { - octreeStats = &_octreeServerSceneStats[nodeUUID]; + auto it = _octreeServerSceneStats.find(nodeUUID); + if (it != _octreeServerSceneStats.end()) { + octreeStats = &it.value(); statsMessageLength = octreeStats->unpackFromPacket(packet); } else { OctreeSceneStats temp; From cb9e12f76a2e29bd01e50d07e27907dbc35f2141 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 14 Jul 2015 16:20:36 -0700 Subject: [PATCH 398/582] Fix using typeof when should be using sizeof --- assignment-client/src/AssignmentClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index d94ba703df..926a0da786 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -195,7 +195,7 @@ void AssignmentClient::sendStatusPacketToACM() { assignmentType = _currentAssignment->getType(); } - auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, typeof(assignmentType) + NUM_BYTES_RFC4122_UUID); + auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, sizeof(assignmentType) + NUM_BYTES_RFC4122_UUID); statusPacket->write(nodeList->getSessionUUID().toRfc4122()); statusPacket->writePrimitive(assignmentType); From e596733c8b3e6ca0c9bf03e381faa554b099d421 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 16:21:34 -0700 Subject: [PATCH 399/582] fix for stats grab from iterator --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 46f14319d1..362fd3660f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3941,7 +3941,7 @@ int Application::processOctreeStats(NLPacket& packet, SharedNodePointer sendingN _octreeSceneStatsLock.lockForWrite(); auto it = _octreeServerSceneStats.find(nodeUUID); if (it != _octreeServerSceneStats.end()) { - octreeStats = &it.value(); + octreeStats = &it->second; statsMessageLength = octreeStats->unpackFromPacket(packet); } else { OctreeSceneStats temp; From b1650c0d8cc29d80d0ef515aba4f5051f8b5c73f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 16:36:05 -0700 Subject: [PATCH 400/582] fix ::get in DS code, make processSTUNResponse a slot --- libraries/networking/src/LimitedNodeList.h | 3 +-- libraries/networking/src/PacketListener.cpp | 2 +- libraries/networking/src/PacketReceiver.cpp | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 4812a706df..465e592a9e 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -162,8 +162,6 @@ public: std::unique_ptr constructICEPingPacket(PingType_t pingType, const QUuid& iceID); std::unique_ptr constructICEPingReplyPacket(NLPacket& pingPacket, const QUuid& iceID); - virtual bool processSTUNResponse(QSharedPointer packet); - void sendHeartbeatToIceServer(const HifiSockAddr& iceServerSockAddr); void sendPeerQueryToIceServer(const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerID); @@ -229,6 +227,7 @@ public slots: void startSTUNPublicSocketUpdate(); virtual void sendSTUNRequest(); + bool processSTUNResponse(QSharedPointer packet); void killNodeWithUUID(const QUuid& nodeUUID); diff --git a/libraries/networking/src/PacketListener.cpp b/libraries/networking/src/PacketListener.cpp index a3d628c05b..3036afc7cb 100644 --- a/libraries/networking/src/PacketListener.cpp +++ b/libraries/networking/src/PacketListener.cpp @@ -14,5 +14,5 @@ #include "NodeList.h" PacketListener::~PacketListener() { - DependencyManager::get()->getPacketReceiver().unregisterListener(this); + DependencyManager::get()->getPacketReceiver().unregisterListener(this); } diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index e1ed8ce8ef..354c04d659 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -97,7 +97,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO if (methodIndex < 0) { qDebug() << "PacketReceiver::registerListener expected a method with one of the following signatures:" - << possibleSignatures << "- but such a method was not found."; + << possibleSignatures.toList() << "- but such a method was not found."; } Q_ASSERT(methodIndex >= 0); @@ -174,7 +174,7 @@ void PacketReceiver::processDatagrams() { //PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), //"PacketReceiver::processDatagrams()"); - auto nodeList = DependencyManager::get(); + auto nodeList = DependencyManager::get(); while (nodeList->getNodeSocket().hasPendingDatagrams()) { // setup a buffer to read the packet into From 15ca129005ecf702974ff2052f7d3cb1d11fdc3b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 16:46:17 -0700 Subject: [PATCH 401/582] fix for registration of methods with typedef --- domain-server/src/DomainServer.cpp | 2 +- libraries/networking/src/PacketReceiver.cpp | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index dbcf65e192..0a407e6f53 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -282,7 +282,7 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { // register as the packet receiver for the types we want PacketReceiver& packetReceiver = nodeList->getPacketReceiver(); packetReceiver.registerListener(PacketType::RequestAssignment, this, "processRequestAssignmentPacket"); - packetReceiver.registerListener(PacketType::DomainConnectRequest, this, "processConnectRequestPackets"); + packetReceiver.registerListener(PacketType::DomainConnectRequest, this, "processConnectRequestPacket"); packetReceiver.registerListener(PacketType::DomainListRequest, this, "processListRequestPacket"); packetReceiver.registerListener(PacketType::DomainServerPathQuery, this, "processPathQueryPacket"); packetReceiver.registerListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket"); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 354c04d659..f9fe5a9c23 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -75,11 +75,13 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO QSet possibleSignatures { QString("%1(%2)").arg(slot).arg(NON_SOURCED_PACKET_LISTENER_PARAMETERS) }; if (!NON_SOURCED_PACKETS.contains(type)) { - const QString SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; + static const QString SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; + static const QString TYPEDEF_SOURCED_PACKET_LISTENER_PARAMETERS = "QSharedPointer,SharedNodePointer"; // a sourced packet must take the shared pointer to the packet but optionally could include // a shared pointer to the node + possibleSignatures << QString("%1(%2)").arg(slot).arg(TYPEDEF_SOURCED_PACKET_LISTENER_PARAMETERS); possibleSignatures << QString("%1(%2)").arg(slot).arg(SOURCED_PACKET_LISTENER_PARAMETERS); } @@ -88,11 +90,13 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO foreach(const QString& signature, possibleSignatures) { QByteArray normalizedSlot = QMetaObject::normalizedSignature(signature.toStdString().c_str()); - + // does the constructed normalized method exist? methodIndex = object->metaObject()->indexOfSlot(normalizedSlot.toStdString().c_str()); - break; + if (methodIndex >= 0) { + break; + } } if (methodIndex < 0) { @@ -100,7 +104,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO << possibleSignatures.toList() << "- but such a method was not found."; } - Q_ASSERT(methodIndex >= 0); + assert(methodIndex >= 0); // return the converted QMetaMethod if (methodIndex >= 0) { From 251387159a32b0a15dc4158f26780d61253e1fd2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 16:48:55 -0700 Subject: [PATCH 402/582] go back to Q_ASSERT for methodIndex --- libraries/networking/src/PacketReceiver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index f9fe5a9c23..462678d76a 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -104,7 +104,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO << possibleSignatures.toList() << "- but such a method was not found."; } - assert(methodIndex >= 0); + Q_ASSERT(methodIndex >= 0); // return the converted QMetaMethod if (methodIndex >= 0) { From 3cb4be6c021b70cacc72b2b698b81dec35ec5586 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:04:45 -0700 Subject: [PATCH 403/582] fix order of setup at startup --- assignment-client/src/AssignmentClient.cpp | 8 ++++---- assignment-client/src/AssignmentClientApp.cpp | 6 +++--- libraries/networking/src/DomainHandler.cpp | 6 ------ libraries/networking/src/NodeList.cpp | 4 ++++ libraries/networking/src/PacketReceiver.cpp | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 926a0da786..71a90d2c53 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -49,11 +49,11 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri LogUtils::init(); QSettings::setDefaultFormat(QSettings::IniFormat); - - // create a NodeList as an unassigned client - DependencyManager::registerInheritance(); + auto addressManager = DependencyManager::set(); - auto nodeList = DependencyManager::set(NodeType::Unassigned); // Order is important + + // create a NodeList as an unassigned client, must be after addressManager + auto nodeList = DependencyManager::set(NodeType::Unassigned); auto animationCache = DependencyManager::set(); auto avatarHashMap = DependencyManager::set(); diff --git a/assignment-client/src/AssignmentClientApp.cpp b/assignment-client/src/AssignmentClientApp.cpp index 796e8ed3b0..7268f9281b 100644 --- a/assignment-client/src/AssignmentClientApp.cpp +++ b/assignment-client/src/AssignmentClientApp.cpp @@ -184,15 +184,15 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : DependencyManager::registerInheritance(); if (numForks || minForks || maxForks) { - AssignmentClientMonitor* monitor = new AssignmentClientMonitor(numForks, minForks, maxForks, + AssignmentClientMonitor* monitor = new AssignmentClientMonitor(numForks, minForks, maxForks, requestAssignmentType, assignmentPool, - walletUUID, assignmentServerHostname, + walletUUID, assignmentServerHostname, assignmentServerPort); monitor->setParent(this); connect(this, &QCoreApplication::aboutToQuit, monitor, &AssignmentClientMonitor::aboutToQuit); } else { AssignmentClient* client = new AssignmentClient(requestAssignmentType, assignmentPool, - walletUUID, assignmentServerHostname, + walletUUID, assignmentServerHostname, assignmentServerPort, monitorPort); client->setParent(this); connect(this, &QCoreApplication::aboutToQuit, client, &AssignmentClient::aboutToQuit); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 20d13169a3..643d55ae6f 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -38,12 +38,6 @@ DomainHandler::DomainHandler(QObject* parent) : { // if we get a socket that make sure our NetworkPeer ping timer stops connect(this, &DomainHandler::completedSocketDiscovery, &_icePeer, &NetworkPeer::stopPingTimer); - - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - - packetReceiver.registerListener(PacketType::ICEServerPeerInformation, this, "processICEResponsePacket"); - packetReceiver.registerListener(PacketType::DomainServerRequireDTLS, this, "processDTLSRequirementPacket"); - packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); } void DomainHandler::clearConnectionInfo() { diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9d0e6d566e..87aad0630e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -101,6 +101,10 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned packetReceiver.registerListener(PacketType::Ping, this, "processPingPacket"); packetReceiver.registerListener(PacketType::PingReply, this, "processPingReplyPacket"); packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); + + packetReceiver.registerListener(PacketType::ICEServerPeerInformation, &_domainHandler, "processICEResponsePacket"); + packetReceiver.registerListener(PacketType::DomainServerRequireDTLS, &_domainHandler, "processDTLSRequirementPacket"); + packetReceiver.registerListener(PacketType::ICEPingReply, &_domainHandler, "processICEPingReplyPacket"); } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 462678d76a..f9fe5a9c23 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -104,7 +104,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO << possibleSignatures.toList() << "- but such a method was not found."; } - Q_ASSERT(methodIndex >= 0); + assert(methodIndex >= 0); // return the converted QMetaMethod if (methodIndex >= 0) { From bc309e5b594f4dc8ac3e5e168964dd9a2c0bb3ff Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:06:10 -0700 Subject: [PATCH 404/582] put back Q_ASSERT instead of assert --- libraries/networking/src/PacketReceiver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index f9fe5a9c23..462678d76a 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -104,7 +104,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO << possibleSignatures.toList() << "- but such a method was not found."; } - assert(methodIndex >= 0); + Q_ASSERT(methodIndex >= 0); // return the converted QMetaMethod if (methodIndex >= 0) { From 02e1eaf45294ac92282f7e46edcf625d3c0e48b5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 14 Jul 2015 17:08:36 -0700 Subject: [PATCH 405/582] Merge fixes --- libraries/networking/src/LimitedNodeList.cpp | 14 -------------- libraries/networking/src/NodeList.cpp | 2 +- libraries/networking/src/PacketReceiver.h | 2 +- libraries/networking/src/udt/Packet.h | 2 +- 4 files changed, 3 insertions(+), 17 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 311d95030e..f474b1766b 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -208,20 +208,6 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod return false; } -qint64 LimitedNodeList::readDatagram(QByteArray& incomingPacket, QHostAddress* address = 0, quint16* port = 0) { - qint64 result = getNodeSocket().readDatagram(incomingPacket.data(), incomingPacket.size(), address, port); - - SharedNodePointer sendingNode = sendingNodeForPacket(incomingPacket); - if (sendingNode) { - emit dataReceived(sendingNode->getType(), incomingPacket.size()); - } else { - emit dataReceived(NodeType::Unassigned, incomingPacket.size()); - } - - return result; -} - - qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr) { return writeDatagram({packet.getData(), static_cast(packet.getSizeWithHeader())}, destinationSockAddr); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 5d25654f2d..69dc1052ac 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -170,7 +170,7 @@ void NodeList::processPingPacket(QSharedPointer packet, SharedNodePoin // send back a reply auto replyPacket = constructPingReplyPacket(*packet); const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); - sendPacket(std::move(replyPacket), sendingNode, senderSockAddr); + sendPacket(std::move(replyPacket), *sendingNode, senderSockAddr); // If we don't have a symmetric socket for this node and this socket doesn't match // what we have for public and local then set it as the symmetric. diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index f0066115e0..3d4cd18946 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -20,7 +20,7 @@ #include #include "NLPacket.h" -#include "PacketHeaders.h" +#include "udt/PacketHeaders.h" class PacketListener; diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index dfd98b6726..3d64c814aa 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -16,7 +16,7 @@ #include -#include "HifiSockAddr.h" +#include "../HifiSockAddr.h" #include "PacketHeaders.h" class Packet : public QIODevice { From aa696ca8d308ba0be6396c23dccb24373cf68f04 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:14:27 -0700 Subject: [PATCH 406/582] fix listener for AudioStreamStats, more verbose debug --- libraries/audio-client/src/AudioClient.cpp | 2 +- libraries/audio-client/src/AudioIOStats.h | 3 +++ libraries/networking/src/PacketReceiver.cpp | 6 ++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index c6c20a4ab2..5dab5aa8f5 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -142,7 +142,7 @@ AudioClient::AudioClient() : configureGverbFilter(_gverb); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerListener(PacketType::AudioStreamStats, &_stats, "handleAudioStreamStatsPacket"); + packetReceiver.registerListener(PacketType::AudioStreamStats, &_stats, "processStreamStatsPacket"); packetReceiver.registerListener(PacketType::AudioEnvironment, this, "handleAudioEnvironmentDataPacket"); packetReceiver.registerListener(PacketType::SilentAudioFrame, this, "handleAudioDataPacket"); packetReceiver.registerListener(PacketType::MixedAudio, this, "handleAudioDataPacket"); diff --git a/libraries/audio-client/src/AudioIOStats.h b/libraries/audio-client/src/AudioIOStats.h index c5c2a47ff4..d0ec34e86b 100644 --- a/libraries/audio-client/src/AudioIOStats.h +++ b/libraries/audio-client/src/AudioIOStats.h @@ -44,7 +44,10 @@ public: const MovingMinMaxAvg& getPacketSentTimeGaps() const { return _packetSentTimeGaps; } void sendDownstreamAudioStatsPacket(); + +public slots: void processStreamStatsPacket(QSharedPointer packet, SharedNodePointer sendingNode); + private: MixedProcessedAudioStream* _receivedAudioStream; diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 462678d76a..57a50e062e 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -100,8 +100,10 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO } if (methodIndex < 0) { - qDebug() << "PacketReceiver::registerListener expected a method with one of the following signatures:" - << possibleSignatures.toList() << "- but such a method was not found."; + qDebug() << "PacketReceiver::registerListener expected a slot with one of the following signatures:" + << possibleSignatures.toList() << "- but such a slot was not found." + << "Could not complete listener registration for" + << type << "-" << nameForPacketType(type); } Q_ASSERT(methodIndex >= 0); From 5163354dd73d5fbcc9ce64bf5054edc9cb2c7864 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:15:18 -0700 Subject: [PATCH 407/582] more cleanup for PacketReceiver error message --- libraries/networking/src/PacketReceiver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 57a50e062e..06b61a3391 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -102,7 +102,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType::Value type, QO if (methodIndex < 0) { qDebug() << "PacketReceiver::registerListener expected a slot with one of the following signatures:" << possibleSignatures.toList() << "- but such a slot was not found." - << "Could not complete listener registration for" + << "Could not complete listener registration for type" << type << "-" << nameForPacketType(type); } @@ -122,7 +122,7 @@ void PacketReceiver::registerVerifiedListener(PacketType::Value type, QObject* o _packetListenerLock.lock(); if (_packetListenerMap.contains(type)) { - qDebug() << "Warning: Registering a packet listener for packet type " << type + qDebug() << "Warning: Registering a packet listener for packet type" << type << "that will remove a previously registered listener"; } From 1450036b59037f3af1c6e44a5a3fa32db0c9c2e3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:18:28 -0700 Subject: [PATCH 408/582] move EntityEditPacketSender method to slot --- libraries/entities/src/EntityEditPacketSender.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 2e49a80f4f..2a982fecec 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -32,13 +32,12 @@ public: void queueEraseEntityMessage(const EntityItemID& entityItemID); - void processEntityEditNackPacket(QSharedPointer packet); - // My server type is the model server virtual char getMyNodeType() const { return NodeType::EntityServer; } virtual void adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew); public slots: + void processEntityEditNackPacket(QSharedPointer packet); void toggleNackPackets() { _shouldNack = !_shouldNack; } private: From 2bec2f05906bd2e56fd7f8d31a07fea2326d1355 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:21:46 -0700 Subject: [PATCH 409/582] make model depend on octree for ViewFrustum --- libraries/model/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/model/CMakeLists.txt b/libraries/model/CMakeLists.txt index 278c40c435..7ede1c5746 100755 --- a/libraries/model/CMakeLists.txt +++ b/libraries/model/CMakeLists.txt @@ -9,4 +9,4 @@ add_dependency_external_projects(glm) find_package(GLM REQUIRED) target_include_directories(${TARGET_NAME} PUBLIC ${GLM_INCLUDE_DIRS}) -link_hifi_libraries(shared gpu) \ No newline at end of file +link_hifi_libraries(shared gpu octree) From 3bf93063d7327735c5cdfa37e8e00523e14162a8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:22:42 -0700 Subject: [PATCH 410/582] remove the OctreeServerDatagramProcessor --- .../octree/OctreeServerDatagramProcessor.cpp | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 assignment-client/src/octree/OctreeServerDatagramProcessor.cpp diff --git a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp b/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp deleted file mode 100644 index 084fd13ab5..0000000000 --- a/assignment-client/src/octree/OctreeServerDatagramProcessor.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// -// OctreeServerDatagramProcessor.cpp -// assignment-client/src -// -// Created by Brad Hefta-Gaub on 2014-09-05 -// Copyright 2014 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 - -#include -#include -#include -#include - -#include "OctreeServerDatagramProcessor.h" - -OctreeServerDatagramProcessor::OctreeServerDatagramProcessor(QUdpSocket& nodeSocket, QThread* previousNodeSocketThread) : - _nodeSocket(nodeSocket), - _previousNodeSocketThread(previousNodeSocketThread) -{ - -} - -OctreeServerDatagramProcessor::~OctreeServerDatagramProcessor() { - // return the node socket to its previous thread - _nodeSocket.moveToThread(_previousNodeSocketThread); -} - -void OctreeServerDatagramProcessor::readPendingDatagrams() { - - HifiSockAddr senderSockAddr; - static QByteArray incomingPacket; - - // read everything that is available - while (_nodeSocket.hasPendingDatagrams()) { - incomingPacket.resize(_nodeSocket.pendingDatagramSize()); - - // just get this packet off the stack - _nodeSocket.readDatagram(incomingPacket.data(), incomingPacket.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); - - PacketType::Value packetType = packetTypeForPacket(incomingPacket); - if (packetType == PacketType::Ping) { - DependencyManager::get()->processNodeData(senderSockAddr, incomingPacket); - return; // don't emit - } - - // emit the signal to tell AudioMixer it needs to process a packet - emit packetRequiresProcessing(incomingPacket, senderSockAddr); - } -} From 3858e6933fee0e2b2add6cf7832daa4a99d6da39 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 17:30:01 -0700 Subject: [PATCH 411/582] open packets for reading and writing --- libraries/networking/src/NLPacket.cpp | 20 +++++++++++++++++--- libraries/networking/src/udt/Packet.cpp | 20 +++++++++++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 6fa7c73d39..db4322bccd 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -30,7 +30,11 @@ qint64 NLPacket::localHeaderSize() const { } std::unique_ptr NLPacket::create(PacketType::Value type, qint64 size) { - return std::unique_ptr(new NLPacket(type, size)); + auto packet = std::unique_ptr(new NLPacket(type, size)); + + packet->open(QIODevice::WriteOnly); + + return packet; } std::unique_ptr NLPacket::fromReceivedPacket(std::unique_ptr data, qint64 size, @@ -42,12 +46,22 @@ std::unique_ptr NLPacket::fromReceivedPacket(std::unique_ptr dat Q_ASSERT(size >= 0); // allocate memory - return std::unique_ptr(new NLPacket(std::move(data), size, senderSockAddr)); + auto packet = std::unique_ptr(new NLPacket(std::move(data), size, senderSockAddr)); + + packet->open(QIODevice::ReadOnly); + + return packet; } std::unique_ptr NLPacket::createCopy(const NLPacket& other) { - return std::unique_ptr(new NLPacket(other)); + auto packet = std::unique_ptr(new NLPacket(other)); + + if (other.isOpen()) { + packet->open(other.openMode()); + } + + return packet; } NLPacket::NLPacket(PacketType::Value type, qint64 size) : Packet(type, localHeaderSize(type) + size) { diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index f24da23edd..55c51d7665 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -22,7 +22,11 @@ qint64 Packet::maxPayloadSize(PacketType::Value type) { } std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { - return std::unique_ptr(new Packet(type, size)); + auto packet = std::unique_ptr(new Packet(type, size)); + + packet->open(QIODevice::WriteOnly); + + return packet; } std::unique_ptr Packet::fromReceivedPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr) { @@ -30,11 +34,21 @@ std::unique_ptr Packet::fromReceivedPacket(std::unique_ptr data, q Q_ASSERT(size >= 0); // allocate memory - return std::unique_ptr(new Packet(std::move(data), size, senderSockAddr)); + auto packet = std::unique_ptr(new Packet(std::move(data), size, senderSockAddr)); + + packet->open(QIODevice::ReadOnly); + + return packet; } std::unique_ptr Packet::createCopy(const Packet& other) { - return std::unique_ptr(new Packet(other)); + auto packet = std::unique_ptr(new Packet(other)); + + if (other.isOpen()) { + packet->open(other.openMode()); + } + + return packet; } qint64 Packet::totalHeadersSize() const { From 88f419dfd7c60406eb8aadfdf3789847873f6fa6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 18:59:33 -0700 Subject: [PATCH 412/582] repairs to packet sending/receiving --- libraries/networking/src/LimitedNodeList.cpp | 32 +++++++++++-------- libraries/networking/src/NLPacket.cpp | 30 +++++++++++++++-- libraries/networking/src/NLPacket.h | 3 ++ libraries/networking/src/NodeList.cpp | 8 ----- libraries/networking/src/PacketReceiver.cpp | 27 +++++++++++----- libraries/networking/src/udt/Packet.cpp | 4 +-- libraries/networking/src/udt/Packet.h | 4 ++- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketList.cpp | 5 ++- 9 files changed, 78 insertions(+), 37 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index f474b1766b..fe4efb3de1 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -62,7 +62,9 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short NodeType::init(); // register the SharedNodePointer meta-type for signals/slots + qRegisterMetaType>(); qRegisterMetaType(); + firstCall = false; } @@ -175,24 +177,30 @@ void LimitedNodeList::changeSocketBufferSizes(int numBytes) { bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNodePointer& matchingNode) { - if (!NON_VERIFIED_PACKETS.contains(packet.getType()) && !NON_SOURCED_PACKETS.contains(packet.getType())) { + if (NON_SOURCED_PACKETS.contains(packet.getType())) { + return true; + } else { // figure out which node this is from matchingNode = nodeWithUUID(packet.getSourceID()); if (matchingNode) { - // check if the md5 hash in the header matches the hash we would expect - if (packet.getVerificationHash() == packet.payloadHashWithConnectionUUID(matchingNode->getConnectionSecret())) { - return true; - } else { - static QMultiMap hashDebugSuppressMap; - - const QUuid& senderID = packet.getSourceID(); + if (!NON_VERIFIED_PACKETS.contains(packet.getType())) { + // check if the md5 hash in the header matches the hash we would expect + if (packet.getVerificationHash() != packet.payloadHashWithConnectionUUID(matchingNode->getConnectionSecret())) { + static QMultiMap hashDebugSuppressMap; + + const QUuid& senderID = packet.getSourceID(); - if (!hashDebugSuppressMap.contains(senderID, packet.getType())) { - qCDebug(networking) << "Packet hash mismatch on" << packet.getType() << "- Sender" << senderID; + if (!hashDebugSuppressMap.contains(senderID, packet.getType())) { + qCDebug(networking) << "Packet hash mismatch on" << packet.getType() << "- Sender" << senderID; - hashDebugSuppressMap.insert(senderID, packet.getType()); + hashDebugSuppressMap.insert(senderID, packet.getType()); + } + + return false; } + + return true; } } else { static QString repeatedMessage @@ -201,8 +209,6 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod qCDebug(networking) << "Packet of type" << packet.getType() << "received from unknown node with UUID" << qPrintable(uuidStringWithoutCurlyBraces(packet.getSourceID())); } - } else { - return true; } return false; diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index db4322bccd..d1fabb1c15 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -30,8 +30,17 @@ qint64 NLPacket::localHeaderSize() const { } std::unique_ptr NLPacket::create(PacketType::Value type, qint64 size) { - auto packet = std::unique_ptr(new NLPacket(type, size)); + std::unique_ptr packet; + if (size == -1) { + packet = std::unique_ptr(new NLPacket(type)); + } else { + // Fail with invalid size + Q_ASSERT(size >= 0); + + packet = std::unique_ptr(new NLPacket(type, size)); + } + packet->open(QIODevice::WriteOnly); return packet; @@ -44,7 +53,7 @@ std::unique_ptr NLPacket::fromReceivedPacket(std::unique_ptr dat // Fail with invalid size Q_ASSERT(size >= 0); - + // allocate memory auto packet = std::unique_ptr(new NLPacket(std::move(data), size, senderSockAddr)); @@ -64,7 +73,22 @@ std::unique_ptr NLPacket::createCopy(const NLPacket& other) { return packet; } -NLPacket::NLPacket(PacketType::Value type, qint64 size) : Packet(type, localHeaderSize(type) + size) { +NLPacket::NLPacket(PacketType::Value type, qint64 size) : + Packet(type, localHeaderSize(type) + size) +{ + Q_ASSERT(size >= 0); + + qint64 headerSize = localHeaderSize(type); + _payloadStart += headerSize; + _capacity -= headerSize; +} + +NLPacket::NLPacket(PacketType::Value type) : + Packet(type, -1) +{ + qint64 headerSize = localHeaderSize(type); + _payloadStart += headerSize; + _capacity -= headerSize; } NLPacket::NLPacket(const NLPacket& other) : Packet(other) { diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index c11ca0790b..0c9d31c66e 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -12,6 +12,8 @@ #ifndef hifi_NLPacket_h #define hifi_NLPacket_h +#include + #include "udt/Packet.h" class NLPacket : public Packet { @@ -35,6 +37,7 @@ public: QByteArray payloadHashWithConnectionUUID(const QUuid& connectionUUID) const; protected: + NLPacket(PacketType::Value type); NLPacket(PacketType::Value type, qint64 size); NLPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); NLPacket(const NLPacket& other); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 69dc1052ac..2e6763dc3a 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -38,14 +38,6 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned _numNoReplyDomainCheckIns(0), _assignmentServerSocket() { - static bool firstCall = true; - if (firstCall) { - NodeType::init(); - // register the SharedNodePointer meta-type for signals/slots - qRegisterMetaType(); - firstCall = false; - } - setCustomDeleter([](Dependency* dependency){ static_cast(dependency)->deleteLater(); }); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 06b61a3391..7af4905834 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -21,7 +21,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : QObject(parent), _packetListenerMap() { - + qRegisterMetaType>(); } void PacketReceiver::registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot) { @@ -206,7 +206,7 @@ void PacketReceiver::processDatagrams() { _inByteCount += packetSizeWithHeader; if (packetVersionMatch(*packet)) { - + SharedNodePointer matchingNode; if (nodeList->packetSourceAndHashMatch(*packet, matchingNode)) { @@ -227,6 +227,7 @@ void PacketReceiver::processDatagrams() { if (listener.first) { bool success = false; + PacketType::Value packetType = packet->getType(); if (matchingNode) { // if this was a sequence numbered packet we should store the last seq number for @@ -238,12 +239,20 @@ void PacketReceiver::processDatagrams() { emit dataReceived(matchingNode->getType(), packet->getSizeWithHeader()); QMetaMethod metaMethod = listener.second; - static const QByteArray SHARED_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer"); + static const QByteArray QSHAREDPOINTER_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer"); + static const QByteArray SHARED_NODE_NORMALIZED = QMetaObject::normalizedType("SharedNodePointer"); if (metaMethod.parameterTypes().contains(SHARED_NODE_NORMALIZED)) { + qDebug() << "invoking with matchingNode" << matchingNode; success = metaMethod.invoke(listener.first, - Q_ARG(QSharedPointer, QSharedPointer(packet.release())), - Q_ARG(SharedNodePointer, matchingNode)); + Q_ARG(QSharedPointer, QSharedPointer(packet.release())), + Q_ARG(SharedNodePointer, matchingNode)); + + } else if (metaMethod.parameterTypes().contains(QSHAREDPOINTER_NODE_NORMALIZED)) { + qDebug() << "invoking with matchingNode" << matchingNode; + success = metaMethod.invoke(listener.first, + Q_ARG(QSharedPointer, QSharedPointer(packet.release())), + Q_ARG(QSharedPointer, matchingNode)); } else { success = metaMethod.invoke(listener.first, @@ -257,13 +266,15 @@ void PacketReceiver::processDatagrams() { } if (!success) { - qDebug() << "Error delivering packet " << nameForPacketType(packet->getType()) << " to listener: " - << listener.first->objectName() << "::" << listener.second.name(); + qDebug().nospace() << "Error delivering packet " << packetType + << " (" << qPrintable(nameForPacketType(packetType)) << ") to listener " + << listener.first << "::" << qPrintable(listener.second.methodSignature()); } } else { // we have a dead listener - remove this mapping from the _packetListenerMap - qDebug() << "Listener for packet type" << nameForPacketType(packet->getType()) + qDebug() << "Listener for packet type" << packet->getType() << "(" + << qPrintable(nameForPacketType(packet->getType())) << ")" << "has been destroyed - removing mapping."; _packetListenerMap.erase(it); } diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 55c51d7665..f96de7a20b 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -192,7 +192,7 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { static const qint64 PACKET_WRITE_ERROR = -1; qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block - if (maxSize <= bytesAvailable()) { + if (maxSize <= bytesAvailableForWrite()) { qint64 currentPos = pos(); // good to go - write the data @@ -202,7 +202,7 @@ qint64 Packet::writeData(const char* data, qint64 maxSize) { seek(currentPos + maxSize); // keep track of _sizeUsed so we can just write the actual data when packet is about to be sent - _sizeUsed = std::max(pos() + 1, _sizeUsed); + _sizeUsed = std::max(pos(), _sizeUsed); // return the number of bytes written return maxSize; diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 3d64c814aa..1e18dde117 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -49,10 +49,12 @@ public: PacketVersion getVersion() const { return _version; } - qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } + qint64 getSizeWithHeader() const { return totalHeadersSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } + qint64 bytesAvailableForWrite() const { return _capacity - _sizeUsed; } + HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 0085a0e64d..211677f6a6 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -18,7 +18,6 @@ using namespace PacketType; const QSet NON_VERIFIED_PACKETS = QSet() - << CreateAssignment << RequestAssignment << StunResponse << NodeJsonStats << EntityQuery << OctreeDataNack << EntityEditNack << DomainListRequest @@ -28,6 +27,7 @@ const QSet NON_VERIFIED_PACKETS = QSet() const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; const QSet NON_SOURCED_PACKETS = QSet() + << StunResponse << CreateAssignment << RequestAssignment << DomainServerRequireDTLS << DomainConnectRequest << DomainList << DomainConnectionDenied << DomainServerPathQuery << DomainServerPathResponse diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 43e0b2a4ea..e48ffa0f69 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -15,7 +15,10 @@ #include "Packet.h" -PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType) { +PacketList::PacketList(PacketType::Value packetType) : + _packetType(packetType) +{ + QIODevice::open(WriteOnly); } void PacketList::startSegment() { From a5ca1f7125d6c469ca720ddca85acc13d4674b1a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 19:15:18 -0700 Subject: [PATCH 413/582] fix variable setup in Packet constructor --- domain-server/src/DomainServer.cpp | 6 +++++- libraries/networking/src/NodeList.cpp | 3 +-- libraries/networking/src/udt/Packet.cpp | 12 +++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index f3638370b3..b493684f45 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -288,7 +288,6 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { packetReceiver.registerListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket"); packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); - packetReceiver.registerListener(PacketType::ICEServerPeerInformation, this, "processICEPeerInformationPacket"); // add whatever static assignments that have been parsed to the queue addStaticAssignmentsToQueue(); @@ -580,6 +579,11 @@ void DomainServer::processConnectRequestPacket(QSharedPointer packet) NodeType_t nodeType; HifiSockAddr publicSockAddr, localSockAddr; + if (packet->getSizeUsed() == 0) { + // TODO: We know what size the connect packet should be (minimally) - check for that here + return; + } + QDataStream packetStream(packet.data()); QUuid connectUUID; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 2e6763dc3a..89013ece60 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -512,7 +512,7 @@ void NodeList::parseNodeFromPacketStream(QDataStream& packetStream) { } void NodeList::sendAssignment(Assignment& assignment) { - + PacketType::Value assignmentPacketType = assignment.getCommand() == Assignment::CreateCommand ? PacketType::CreateAssignment : PacketType::RequestAssignment; @@ -520,7 +520,6 @@ void NodeList::sendAssignment(Assignment& assignment) { auto assignmentPacket = NLPacket::create(assignmentPacketType); QDataStream packetStream(assignmentPacket.get()); - packetStream << assignment; // TODO: should this be a non sourced packet? diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index f96de7a20b..9645c5afcc 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -61,17 +61,18 @@ qint64 Packet::localHeaderSize() const { Packet::Packet(PacketType::Value type, qint64 size) : _type(type), - _version(0), - _packetSize(localHeaderSize(_type) + size), - _packet(new char(_packetSize)), - _payloadStart(_packet.get() + localHeaderSize(_type)), - _capacity(size) + _version(0) { auto maxPayload = maxPayloadSize(type); if (size == -1) { // default size of -1, means biggest packet possible size = maxPayload; } + + _packetSize = localHeaderSize(type) + size; + _packet.reset(new char(_packetSize)); + _capacity = size; + _payloadStart = _packet.get() + (_packetSize - _capacity); // Sanity check Q_ASSERT(size >= 0 || size < maxPayload); @@ -191,6 +192,7 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { static const qint64 PACKET_WRITE_ERROR = -1; qint64 Packet::writeData(const char* data, qint64 maxSize) { + // make sure we have the space required to write this block if (maxSize <= bytesAvailableForWrite()) { qint64 currentPos = pos(); From c210b0db1c289560c64228d45a12657cab484877 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 20:18:28 -0700 Subject: [PATCH 414/582] don't double seek in Packet::writeData --- libraries/networking/src/udt/Packet.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 9645c5afcc..1b53756f5e 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -196,15 +196,14 @@ qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block if (maxSize <= bytesAvailableForWrite()) { qint64 currentPos = pos(); + + Q_ASSERT(currentPos < _capacity); // good to go - write the data memcpy(_payloadStart + currentPos, data, maxSize); - // seek to the new position based on where our write just finished - seek(currentPos + maxSize); - // keep track of _sizeUsed so we can just write the actual data when packet is about to be sent - _sizeUsed = std::max(pos(), _sizeUsed); + _sizeUsed = std::max(currentPos + maxSize, _sizeUsed); // return the number of bytes written return maxSize; From 0327a8d4777e381f64565cfd7ec25c302bfb4804 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 20:47:16 -0700 Subject: [PATCH 415/582] fix bytesAvailable, don't double seek in Packet --- assignment-client/src/octree/OctreeQueryNode.cpp | 2 +- assignment-client/src/octree/OctreeQueryNode.h | 2 +- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- libraries/entities/src/EntityTree.cpp | 2 +- libraries/networking/src/NodeList.cpp | 4 ++-- libraries/networking/src/udt/Packet.cpp | 5 +---- libraries/networking/src/udt/PacketList.cpp | 6 +++--- libraries/octree/src/OctreeEditPacketSender.cpp | 2 +- 8 files changed, 11 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 2f1a554b8c..65ee0e26f8 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -218,7 +218,7 @@ void OctreeQueryNode::writeToPacket(const unsigned char* buffer, unsigned int by OCTREE_PACKET_INTERNAL_SECTION_SIZE sectionSize = bytes; _octreePacket->writePrimitive(sectionSize); } - if (bytes <= _octreePacket->bytesAvailable()) { + if (bytes <= _octreePacket->bytesAvailableForWrite()) { _octreePacket->write(reinterpret_cast(buffer), bytes); _octreePacketWaiting = true; } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 6316cc5e86..d752b8d0e8 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -46,7 +46,7 @@ public: bool packetIsDuplicate() const; bool shouldSuppressDuplicatePacket(); - unsigned int getAvailable() const { return _octreePacket->bytesAvailable(); } + unsigned int getAvailable() const { return _octreePacket->bytesAvailableForWrite(); } int getMaxSearchLevel() const { return _maxSearchLevel; } void resetMaxSearchLevel() { _maxSearchLevel = 1; } void incrementMaxSearchLevel() { _maxSearchLevel++; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 6a5d76d4b9..7937604825 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -147,7 +147,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes NLPacket& statsPacket = nodeData->stats.getStatsMessage(); // If the size of the stats message and the octree message will fit in a packet, then piggyback them - if (nodeData->getPacket().getSizeWithHeader() <= statsPacket.bytesAvailable()) { + if (nodeData->getPacket().getSizeWithHeader() <= statsPacket.bytesAvailableForWrite()) { // copy octree message to back of stats message statsPacket.write(nodeData->getPacket().getData(), nodeData->getPacket().getSizeWithHeader()); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index a5c5d58936..cb4011c799 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -796,7 +796,7 @@ std::unique_ptr EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_S ++numberOfIDs; // check to make sure we have room for one more ID - if (NUM_BYTES_RFC4122_UUID > deletesPacket->bytesAvailable()) { + if (NUM_BYTES_RFC4122_UUID > deletesPacket->bytesAvailableForWrite()) { hasFilledPacket = true; break; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 89013ece60..58720afe2c 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -284,7 +284,7 @@ void NodeList::sendDomainServerCheckIn() { flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendDSCheckIn); - if (!isUsingDTLS) { + if (!isUsingDTLS) { sendPacket(std::move(domainPacket), _domainHandler.getSockAddr()); } @@ -336,7 +336,7 @@ void NodeList::sendDSPathQuery(const QString& newPath) { // get the size of the UTF8 representation of the desired path qint64 numPathBytes = pathQueryUTF8.size(); - if (numPathBytes + ((qint64) sizeof(numPathBytes)) < pathQueryPacket->bytesAvailable()) { + if (numPathBytes + ((qint64) sizeof(numPathBytes)) < pathQueryPacket->bytesAvailableForWrite()) { // append the size of the path to the query packet pathQueryPacket->writePrimitive(numPathBytes); diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 1b53756f5e..975c137f27 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -70,7 +70,7 @@ Packet::Packet(PacketType::Value type, qint64 size) : } _packetSize = localHeaderSize(type) + size; - _packet.reset(new char(_packetSize)); + _packet.reset(new char[_packetSize]); _capacity = size; _payloadStart = _packet.get() + (_packetSize - _capacity); @@ -222,9 +222,6 @@ qint64 Packet::readData(char* dest, qint64 maxSize) { // read out the data memcpy(dest, _payloadStart + currentPosition, numBytesToRead); - - // seek to the end of the read - seek(currentPosition + numBytesToRead); } return numBytesToRead; diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index e48ffa0f69..2c41f61d0f 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -56,7 +56,7 @@ qint64 PacketList::writeData(const char* data, qint64 maxSize) { } // check if this block of data can fit into the currentPacket - if (maxSize <= _currentPacket->bytesAvailable()) { + if (maxSize <= _currentPacket->bytesAvailableForWrite()) { // it fits, just write it to the current packet _currentPacket->write(data, maxSize); @@ -73,7 +73,7 @@ qint64 PacketList::writeData(const char* data, qint64 maxSize) { // We need to try and pull the first part of the segment out to our new packet // check now to see if this is an unsupported write - int numBytesToEnd = _currentPacket->bytesAvailable(); + int numBytesToEnd = _currentPacket->bytesAvailableForWrite(); if ((newPacket->size() - numBytesToEnd) < maxSize) { // this is an unsupported case - the segment is bigger than the size of an individual packet @@ -108,7 +108,7 @@ qint64 PacketList::writeData(const char* data, qint64 maxSize) { // we're an ordered PacketList - let's fit what we can into the current packet and then put the leftover // into a new packet - int numBytesToEnd = _currentPacket->bytesAvailable(); + int numBytesToEnd = _currentPacket->bytesAvailableForWrite(); _currentPacket->write(data, numBytesToEnd); // move the current packet to our list of packets diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 6bbfdc5024..6f2780d871 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -255,7 +255,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, QByt } else { // If we're switching type, then we send the last one and start over if ((type != bufferedPacket->getType() && bufferedPacket->getSizeUsed() > 0) || - (editMessage.size() >= bufferedPacket->bytesAvailable())) { + (editMessage.size() >= bufferedPacket->bytesAvailableForWrite())) { // create the new packet and swap it with the packet in _pendingEditPackets auto packetToRelease = initializePacket(type, node->getClockSkewUsec()); From 89c44ded38a2bce88bdf9dcc127ee09f0d713f04 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 21:01:26 -0700 Subject: [PATCH 416/582] repairs for domain-server PacketList sending --- domain-server/src/DomainServer.cpp | 3 +++ libraries/networking/src/LimitedNodeList.cpp | 11 ++++++++--- libraries/networking/src/udt/PacketList.cpp | 12 +++++++++--- libraries/networking/src/udt/PacketList.h | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index b493684f45..4023fbcd1f 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1007,6 +1007,9 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif }); } } + + // send an empty list to the node, in case there were no other nodes + domainListPackets.closeCurrentPacket(true); // write the PacketList to this node limitedNodeList->sendPacketList(domainListPackets, *node); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index fe4efb3de1..33139e66e8 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -263,15 +263,20 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiS } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { - if (!destinationNode.getActiveSocket()) { + const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); + if (!activeSocket) { // we don't have a socket to send to, return 0 return 0; } - return sendPacketList(packetList, *destinationNode.getActiveSocket()); + return sendPacketList(packetList, *activeSocket); } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) { - qint64 bytesSent{ 0 }; + qint64 bytesSent { 0 }; + + // close the last packet in the list + packetList.closeCurrentPacket(); + while (!packetList._packets.empty()) { bytesSent += sendPacket(std::move(packetList.takeFront()), sockAddr); } diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 2c41f61d0f..675645abc2 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -120,7 +120,13 @@ qint64 PacketList::writeData(const char* data, qint64 maxSize) { } } -void PacketList::closeCurrentPacket() { - // move the current packet to our list of packets - _packets.push_back(std::move(_currentPacket)); +void PacketList::closeCurrentPacket(bool shouldSendEmpty) { + if (shouldSendEmpty && !_currentPacket) { + _currentPacket = createPacketWithExtendedHeader(); + } + + if (_currentPacket) { + // move the current packet to our list of packets + _packets.push_back(std::move(_currentPacket)); + } } diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 173e8c75fb..f4b542155a 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -31,7 +31,7 @@ public: PacketType::Value getType() const { return _packetType; } int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); } - void closeCurrentPacket(); + void closeCurrentPacket(bool shouldSendEmpty = false); void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } From ccc2649d264950a003d7f131530dff32c57e5bcb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 21:14:15 -0700 Subject: [PATCH 417/582] fix packing of domain list header --- domain-server/src/DomainServer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 4023fbcd1f..1824446fca 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -971,10 +971,10 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif // setup the extended header for the domain list packets // this data is at the beginning of each of the domain list packets QByteArray extendedHeader(NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES, 0); - QDataStream extendedHeaderStream(&extendedHeader, QIODevice::Append); + QDataStream extendedHeaderStream(&extendedHeader, QIODevice::WriteOnly); - extendedHeaderStream << limitedNodeList->getSessionUUID().toRfc4122(); - extendedHeaderStream << node->getUUID().toRfc4122(); + extendedHeaderStream << limitedNodeList->getSessionUUID(); + extendedHeaderStream << node->getUUID(); extendedHeaderStream << (quint8) node->getCanAdjustLocks(); extendedHeaderStream << (quint8) node->getCanRez(); From e00dc8bfaac6f7dd29bca66adef99dab007f1124 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 21:15:22 -0700 Subject: [PATCH 418/582] remove an Xcode vim accidentalism --- libraries/networking/src/NodeList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 58720afe2c..c6d46e88a7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -473,6 +473,7 @@ void NodeList::processDomainServerList(QSharedPointer packet) { quint8 thisNodeCanRez; packetStream >> thisNodeCanRez; setThisNodeCanRez((bool) thisNodeCanRez); + // pull each node in the packet while (packetStream.device()->pos() < packet->getSizeUsed()) { From 9204f004c0f7e057ba19246eb86dea4b826a57d4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 14 Jul 2015 21:15:39 -0700 Subject: [PATCH 419/582] remove an extra line --- libraries/networking/src/NodeList.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index c6d46e88a7..dbcc4c3387 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -474,7 +474,6 @@ void NodeList::processDomainServerList(QSharedPointer packet) { packetStream >> thisNodeCanRez; setThisNodeCanRez((bool) thisNodeCanRez); - // pull each node in the packet while (packetStream.device()->pos() < packet->getSizeUsed()) { parseNodeFromPacketStream(packetStream); From 7d313c4a2b696c28ec5ea88467e84b0aa484f3fc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 10:13:57 -0700 Subject: [PATCH 420/582] remove extra debugs in PacketReceiver --- libraries/networking/src/PacketReceiver.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 7af4905834..d7d2fdcd6b 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -243,13 +243,11 @@ void PacketReceiver::processDatagrams() { static const QByteArray SHARED_NODE_NORMALIZED = QMetaObject::normalizedType("SharedNodePointer"); if (metaMethod.parameterTypes().contains(SHARED_NODE_NORMALIZED)) { - qDebug() << "invoking with matchingNode" << matchingNode; success = metaMethod.invoke(listener.first, Q_ARG(QSharedPointer, QSharedPointer(packet.release())), Q_ARG(SharedNodePointer, matchingNode)); } else if (metaMethod.parameterTypes().contains(QSHAREDPOINTER_NODE_NORMALIZED)) { - qDebug() << "invoking with matchingNode" << matchingNode; success = metaMethod.invoke(listener.first, Q_ARG(QSharedPointer, QSharedPointer(packet.release())), Q_ARG(QSharedPointer, matchingNode)); From e127c5c06d9b8c13fc1d8d053870268272d715cb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 10:40:40 -0700 Subject: [PATCH 421/582] rename Packet methods for clarity --- assignment-client/src/Agent.cpp | 4 +- assignment-client/src/audio/AudioMixer.cpp | 4 +- .../src/avatars/AvatarMixerClientData.cpp | 2 +- .../src/entities/EntityServer.cpp | 2 +- .../octree/OctreeInboundPacketProcessor.cpp | 12 +++--- .../src/octree/OctreeQueryNode.cpp | 6 +-- .../src/octree/OctreeSendThread.cpp | 32 +++++++------- domain-server/src/DomainServer.cpp | 2 +- ice-server/src/IceServer.cpp | 2 +- interface/src/Application.cpp | 2 +- .../src/octree/OctreePacketProcessor.cpp | 2 +- libraries/audio-client/src/AudioClient.cpp | 2 +- libraries/audio/src/AudioInjector.cpp | 2 +- .../entities/src/EntityEditPacketSender.cpp | 2 +- .../entities/src/EntityItemProperties.cpp | 2 +- libraries/networking/src/LimitedNodeList.cpp | 4 +- libraries/networking/src/NLPacket.cpp | 6 +-- libraries/networking/src/NodeList.cpp | 2 +- libraries/networking/src/PacketReceiver.cpp | 4 +- libraries/networking/src/PacketSender.cpp | 4 +- libraries/networking/src/udt/Packet.cpp | 42 +++++++++++++------ libraries/networking/src/udt/Packet.h | 19 +++++---- libraries/networking/src/udt/PacketList.cpp | 2 +- .../octree/src/OctreeEditPacketSender.cpp | 6 +-- libraries/octree/src/OctreeRenderer.cpp | 4 +- libraries/octree/src/OctreeSceneStats.cpp | 6 +-- 26 files changed, 99 insertions(+), 78 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 51b5b0eef2..d57d4ba663 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -65,9 +65,9 @@ void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointe if (packetType == PacketType::OctreeStats) { int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(packet, senderNode); - if (packet->getSizeUsed() > statsMessageLength) { + if (packet->getPayloadSize() > statsMessageLength) { // pull out the piggybacked packet and create a new QSharedPointer for it - int piggyBackedSizeWithHeader = packet->getSizeUsed() - statsMessageLength; + int piggyBackedSizeWithHeader = packet->getPayloadSize() - statsMessageLength; std::unique_ptr buffer = std::unique_ptr(new char[piggyBackedSizeWithHeader]); memcpy(buffer.get(), packet->getPayload() + statsMessageLength, piggyBackedSizeWithHeader); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index bacad4c28f..215459bc2b 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -552,9 +552,9 @@ void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, Sh auto nodeList = DependencyManager::get(); if (sendingNode->getCanAdjustLocks()) { - auto newPacket = NLPacket::create(PacketType::MuteEnvironment, packet->getSizeUsed()); + auto newPacket = NLPacket::create(PacketType::MuteEnvironment, packet->getPayloadSize()); // Copy payload - newPacket->write(packet->getPayload(), packet->getSizeUsed()); + newPacket->write(packet->getPayload(), packet->getPayloadSize()); nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getType() == NodeType::Agent && node->getActiveSocket() && diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index eb61e5ab4b..00ec6ad220 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -15,7 +15,7 @@ int AvatarMixerClientData::parseData(NLPacket& packet) { // compute the offset to the data payload - return _avatar.parseDataFromBuffer(QByteArray::fromRawData(packet.getPayload(), packet.getSizeUsed())); + return _avatar.parseDataFromBuffer(QByteArray::fromRawData(packet.getPayload(), packet.getPayloadSize())); } bool AvatarMixerClientData::checkAndSetHasReceivedFirstPackets() { diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 26a6299b14..feef396c72 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -108,7 +108,7 @@ int EntityServer::sendSpecialPackets(const SharedNodePointer& node, OctreeQueryN queryNode->packetSent(*specialPacket); - totalBytes += specialPacket->getSizeWithHeader(); + totalBytes += specialPacket->getDataSize(); packetsSent++; DependencyManager::get()->sendPacket(std::move(specialPacket), *node); diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 2b31b2f2a2..a2eea557a5 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -85,7 +85,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet if (debugProcessPacket) { qDebug("OctreeInboundPacketProcessor::processPacket() payload=%p payloadLength=%lld", packet->getPayload(), - packet->getSizeUsed()); + packet->getPayloadSize()); } // Ask our tree subclass if it can handle the incoming packet... @@ -117,7 +117,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet if (debugProcessPacket || _myServer->wantsDebugReceiving()) { qDebug() << "PROCESSING THREAD: got '" << packetType << "' packet - " << _receivedPacketCount << " command from client"; - qDebug() << " receivedBytes=" << packet->getSizeWithHeader(); + qDebug() << " receivedBytes=" << packet->getDataSize(); qDebug() << " sequence=" << sequence; qDebug() << " sentAt=" << sentAt << " usecs"; qDebug() << " arrivedAt=" << arrivedAt << " usecs"; @@ -135,7 +135,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet if (debugProcessPacket) { qDebug() << " atByte (in payload)=" << packet->pos(); - qDebug() << " payload size=" << packet->getSizeUsed(); + qDebug() << " payload size=" << packet->getPayloadSize(); if (!packet->bytesAvailable()) { qDebug() << " ----- UNEXPECTED ---- got a packet without any edit details!!!! --------"; } @@ -154,7 +154,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet qDebug() << " maxSize=" << maxSize; qDebug("OctreeInboundPacketProcessor::processPacket() %c " "payload=%p payloadLength=%lld editData=%p payloadPosition=%lld maxSize=%d", - packetType, packet->getPayload(), packet->getSizeUsed(), editData, + packetType, packet->getPayload(), packet->getPayloadSize(), editData, packet->pos(), maxSize); } @@ -184,7 +184,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet if (debugProcessPacket) { qDebug() << " editDataBytesRead=" << editDataBytesRead; qDebug() << " AFTER processEditPacketData payload position=" << packet->pos(); - qDebug() << " AFTER processEditPacketData payload size=" << packet->getSizeUsed(); + qDebug() << " AFTER processEditPacketData payload size=" << packet->getPayloadSize(); } } @@ -192,7 +192,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet if (debugProcessPacket) { qDebug("OctreeInboundPacketProcessor::processPacket() DONE LOOPING FOR %c " "payload=%p payloadLength=%lld editData=%p payloadPosition=%lld", - packetType, packet->getPayload(), packet->getSizeUsed(), editData, packet->pos()); + packetType, packet->getPayload(), packet->getPayloadSize(), editData, packet->pos()); } // Make sure our Node and NodeList knows we've heard from this node. diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 65ee0e26f8..c8330209ce 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -108,10 +108,10 @@ bool OctreeQueryNode::packetIsDuplicate() const { // since our packets now include header information, like sequence number, and createTime, we can't just do a memcmp // of the entire packet, we need to compare only the packet content... - if (_lastOctreePacketLength == _octreePacket->getSizeUsed()) { + if (_lastOctreePacketLength == _octreePacket->getPayloadSize()) { if (memcmp(_lastOctreePayload + OCTREE_PACKET_EXTRA_HEADERS_SIZE, _octreePacket->getPayload() + OCTREE_PACKET_EXTRA_HEADERS_SIZE, - _octreePacket->getSizeUsed() - OCTREE_PACKET_EXTRA_HEADERS_SIZE) == 0) { + _octreePacket->getPayloadSize() - OCTREE_PACKET_EXTRA_HEADERS_SIZE) == 0) { return true; } } @@ -176,7 +176,7 @@ void OctreeQueryNode::resetOctreePacket() { // changed since we last reset it. Since we know that no two packets can ever be identical without being the same // scene information, (e.g. the root node packet of a static scene), we can use this as a strategy for reducing // packet send rate. - _lastOctreePacketLength = _octreePacket->getSizeUsed(); + _lastOctreePacketLength = _octreePacket->getPayloadSize(); memcpy(_lastOctreePayload, _octreePacket->getPayload(), _lastOctreePacketLength); // If we're moving, and the client asked for low res, then we force monochrome, otherwise, use diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 7937604825..62517e698b 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -147,16 +147,16 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes NLPacket& statsPacket = nodeData->stats.getStatsMessage(); // If the size of the stats message and the octree message will fit in a packet, then piggyback them - if (nodeData->getPacket().getSizeWithHeader() <= statsPacket.bytesAvailableForWrite()) { + if (nodeData->getPacket().getDataSize() <= statsPacket.bytesAvailableForWrite()) { // copy octree message to back of stats message - statsPacket.write(nodeData->getPacket().getData(), nodeData->getPacket().getSizeWithHeader()); + statsPacket.write(nodeData->getPacket().getData(), nodeData->getPacket().getDataSize()); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. int thisWastedBytes = 0; _totalWastedBytes += thisWastedBytes; - _totalBytes += statsPacket.getSizeWithHeader(); + _totalBytes += statsPacket.getDataSize(); _totalPackets++; if (debug) { @@ -172,8 +172,8 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes qDebug() << "Adding stats to packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " statsMessageLength: " << statsPacket.getSizeWithHeader() << - " original size: " << nodeData->getPacket().getSizeWithHeader() << " [" << _totalBytes << + " statsMessageLength: " << statsPacket.getDataSize() << + " original size: " << nodeData->getPacket().getDataSize() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } @@ -190,7 +190,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // there was nothing else to send. int thisWastedBytes = 0; _totalWastedBytes += thisWastedBytes; - _totalBytes += statsPacket.getSizeWithHeader(); + _totalBytes += statsPacket.getDataSize(); _totalPackets++; if (debug) { @@ -206,11 +206,11 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes qDebug() << "Sending separate stats packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " size: " << statsPacket.getSizeWithHeader() << " [" << _totalBytes << + " size: " << statsPacket.getDataSize() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } - trueBytesSent += statsPacket.getSizeWithHeader(); + trueBytesSent += statsPacket.getDataSize(); truePacketsSent++; packetsSent++; @@ -218,10 +218,10 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), *_node); packetSent = true; - int packetSizeWithHeader = nodeData->getPacket().getSizeWithHeader(); + int packetSizeWithHeader = nodeData->getPacket().getDataSize(); thisWastedBytes = MAX_PACKET_SIZE - packetSizeWithHeader; _totalWastedBytes += thisWastedBytes; - _totalBytes += nodeData->getPacket().getSizeWithHeader(); + _totalBytes += nodeData->getPacket().getDataSize(); _totalPackets++; if (debug) { @@ -237,7 +237,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence << " timestamp: " << timestamp << - " size: " << nodeData->getPacket().getSizeWithHeader() << " [" << _totalBytes << + " size: " << nodeData->getPacket().getDataSize() << " [" << _totalBytes << "] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]"; } } @@ -250,7 +250,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes DependencyManager::get()->sendUnreliablePacket(nodeData->getPacket(), *_node); packetSent = true; - int packetSizeWithHeader = nodeData->getPacket().getSizeWithHeader(); + int packetSizeWithHeader = nodeData->getPacket().getDataSize(); int thisWastedBytes = MAX_PACKET_SIZE - packetSizeWithHeader; _totalWastedBytes += thisWastedBytes; _totalBytes += packetSizeWithHeader; @@ -277,8 +277,8 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes // remember to track our stats if (packetSent) { - nodeData->stats.packetSent(nodeData->getPacket().getSizeUsed()); - trueBytesSent += nodeData->getPacket().getSizeUsed(); + nodeData->stats.packetSent(nodeData->getPacket().getPayloadSize()); + trueBytesSent += nodeData->getPacket().getPayloadSize(); truePacketsSent++; packetsSent++; nodeData->octreePacketSent(); @@ -596,9 +596,9 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus truePacketsSent++; packetsSentThisInterval++; - _totalBytes += packet->getSizeWithHeader(); + _totalBytes += packet->getDataSize(); _totalPackets++; - _totalWastedBytes += MAX_PACKET_SIZE - packet->getSizeWithHeader(); + _totalWastedBytes += MAX_PACKET_SIZE - packet->getDataSize(); } } diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 1824446fca..95dc2498a1 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -579,7 +579,7 @@ void DomainServer::processConnectRequestPacket(QSharedPointer packet) NodeType_t nodeType; HifiSockAddr publicSockAddr, localSockAddr; - if (packet->getSizeUsed() == 0) { + if (packet->getPayloadSize() == 0) { // TODO: We know what size the connect packet should be (minimally) - check for that here return; } diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 1e9e3e8ec4..7cb22cad3c 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -134,7 +134,7 @@ void IceServer::sendPeerInformationPacket(const NetworkPeer& peer, const HifiSoc peerPacket->write(peer.toByteArray()); // write the current packet - _serverSocket.writeDatagram(peerPacket->getData(), peerPacket->getSizeWithHeader(), + _serverSocket.writeDatagram(peerPacket->getData(), peerPacket->getDataSize(), destinationSockAddr->getAddress(), destinationSockAddr->getPort()); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dfe94f66e5..3b163afe0e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2899,7 +2899,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType::Value packetTyp // encode the query data int packetSize = _octreeQuery.getBroadcastData(reinterpret_cast(queryPacket->getPayload())); - queryPacket->setSizeUsed(packetSize); + queryPacket->setPayloadSize(packetSize); // make sure we still have an active socket nodeList->sendUnreliablePacket(*queryPacket, *node); diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 7b3b2c771b..a7cb1aaa66 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -57,7 +57,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer packet, Share int statsMessageLength = app->processOctreeStats(*packet, sendingNode); wasStatsPacket = true; - int piggybackBytes = packet->getSizeUsed() - statsMessageLength; + int piggybackBytes = packet->getPayloadSize() - statsMessageLength; if (piggybackBytes) { // construct a new packet from the piggybacked one diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 1982f5dd70..42829e2521 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -937,7 +937,7 @@ void AudioClient::handleAudioInput() { if (_audioPacket->getType() != PacketType::SilentAudioFrame) { // audio samples have already been packed (written to networkAudioSamples) - _audioPacket->setSizeUsed(_audioPacket->getSizeUsed() + numNetworkBytes); + _audioPacket->setPayloadSize(_audioPacket->getPayloadSize() + numNetworkBytes); } _stats.sentPacket(); diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 4866bcfad6..4b99597798 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -232,7 +232,7 @@ void AudioInjector::injectToMixer() { audioPacket->write(_audioData.data() + _currentSendPosition, bytesToCopy); // set the correct size used for this packet - audioPacket->setSizeUsed(audioPacket->pos()); + audioPacket->setPayloadSize(audioPacket->pos()); // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 7dc216c261..9375208ac8 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -24,7 +24,7 @@ EntityEditPacketSender::EntityEditPacketSender() { void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet) { if (_shouldNack) { - processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getDataSize())); } } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index a6df04e31e..6e6a9eb0a8 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -907,7 +907,7 @@ bool EntityItemProperties::decodeEntityEditPacket(NLPacket& packet, int& process const unsigned char* data = reinterpret_cast(packet.getPayload()); const unsigned char* dataAt = data; - int bytesToRead = packet.getSizeUsed(); + int bytesToRead = packet.getPayloadSize(); processedBytes = 0; // the first part of the data is an octcode, this is a required element of the edit packet format, but we don't diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 33139e66e8..04ea9b5dfd 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -215,7 +215,7 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod } qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr) { - return writeDatagram({packet.getData(), static_cast(packet.getSizeWithHeader())}, destinationSockAddr); + return writeDatagram({packet.getData(), static_cast(packet.getDataSize())}, destinationSockAddr); } qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { @@ -598,7 +598,7 @@ bool LimitedNodeList::processSTUNResponse(QSharedPointer packet) { sizeof(RFC_5389_MAGIC_COOKIE_NETWORK_ORDER)) == 0) { // enumerate the attributes to find XOR_MAPPED_ADDRESS_TYPE - while (attributeStartIndex < packet->getSizeWithHeader()) { + while (attributeStartIndex < packet->getDataSize()) { if (memcmp(packet->getData() + attributeStartIndex, &XOR_MAPPED_ADDRESS_TYPE, sizeof(XOR_MAPPED_ADDRESS_TYPE)) == 0) { const int NUM_BYTES_STUN_ATTR_TYPE_AND_LENGTH = 4; const int NUM_BYTES_FAMILY_ALIGN = 1; diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index d1fabb1c15..99cf34e951 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -80,7 +80,7 @@ NLPacket::NLPacket(PacketType::Value type, qint64 size) : qint64 headerSize = localHeaderSize(type); _payloadStart += headerSize; - _capacity -= headerSize; + _payloadCapacity -= headerSize; } NLPacket::NLPacket(PacketType::Value type) : @@ -88,7 +88,7 @@ NLPacket::NLPacket(PacketType::Value type) : { qint64 headerSize = localHeaderSize(type); _payloadStart += headerSize; - _capacity -= headerSize; + _payloadCapacity -= headerSize; } NLPacket::NLPacket(const NLPacket& other) : Packet(other) { @@ -137,7 +137,7 @@ QByteArray NLPacket::payloadHashWithConnectionUUID(const QUuid& connectionUUID) QCryptographicHash hash(QCryptographicHash::Md5); // add the packet payload and the connection UUID - hash.addData(_payloadStart, _sizeUsed); + hash.addData(_payloadStart, _payloadSize); hash.addData(connectionUUID.toRfc4122()); // return the hash diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index dbcc4c3387..bd0b6b9458 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -475,7 +475,7 @@ void NodeList::processDomainServerList(QSharedPointer packet) { setThisNodeCanRez((bool) thisNodeCanRez); // pull each node in the packet - while (packetStream.device()->pos() < packet->getSizeUsed()) { + while (packetStream.device()->pos() < packet->getPayloadSize()) { parseNodeFromPacketStream(packetStream); } } diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index d7d2fdcd6b..3e03e689d5 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -236,7 +236,7 @@ void PacketReceiver::processDatagrams() { matchingNode->setLastSequenceNumberForPacketType(packet->readSequenceNumber(), packet->getType()); } - emit dataReceived(matchingNode->getType(), packet->getSizeWithHeader()); + emit dataReceived(matchingNode->getType(), packet->getDataSize()); QMetaMethod metaMethod = listener.second; static const QByteArray QSHAREDPOINTER_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer"); @@ -257,7 +257,7 @@ void PacketReceiver::processDatagrams() { Q_ARG(QSharedPointer, QSharedPointer(packet.release()))); } } else { - emit dataReceived(NodeType::Unassigned, packet->getSizeWithHeader()); + emit dataReceived(NodeType::Unassigned, packet->getDataSize()); success = listener.second.invoke(listener.first, Q_ARG(QSharedPointer, QSharedPointer(packet.release()))); diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index 3313403033..ee3d09cb75 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -54,7 +54,7 @@ void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNod unlock(); _totalPacketsQueued++; - _totalBytesQueued += packet->getSizeWithHeader(); + _totalBytesQueued += packet->getDataSize(); // Make sure to wake our actual processing thread because we now have packets for it to process. _hasPackets.wakeAll(); @@ -278,7 +278,7 @@ bool PacketSender::nonThreadedProcess() { _packetsOverCheckInterval++; _totalPacketsSent++; - int packetSize = packetPair.second->getSizeWithHeader(); + int packetSize = packetPair.second->getDataSize(); _totalBytesSent += packetSize; emit packetSent(packetSize); diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 975c137f27..23967ff997 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -71,8 +71,8 @@ Packet::Packet(PacketType::Value type, qint64 size) : _packetSize = localHeaderSize(type) + size; _packet.reset(new char[_packetSize]); - _capacity = size; - _payloadStart = _packet.get() + (_packetSize - _capacity); + _payloadCapacity = size; + _payloadStart = _packet.get() + (_packetSize - _payloadCapacity); // Sanity check Q_ASSERT(size >= 0 || size < maxPayload); @@ -93,9 +93,9 @@ Packet::Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& send { _type = readType(); _version = readVersion(); - _capacity = _packetSize - localHeaderSize(_type); - _sizeUsed = _capacity; - _payloadStart = _packet.get() + (_packetSize - _capacity); + _payloadCapacity = _packetSize - localHeaderSize(_type); + _payloadSize = _payloadCapacity; + _payloadStart = _packet.get() + (_packetSize - _payloadCapacity); } Packet::Packet(const Packet& other) { @@ -110,9 +110,9 @@ Packet& Packet::operator=(const Packet& other) { memcpy(_packet.get(), other._packet.get(), _packetSize); _payloadStart = _packet.get() + (other._payloadStart - other._packet.get()); - _capacity = other._capacity; + _payloadCapacity = other._payloadCapacity; - _sizeUsed = other._sizeUsed; + _payloadSize = other._payloadSize; return *this; } @@ -128,13 +128,31 @@ Packet& Packet::operator=(Packet&& other) { _packet = std::move(other._packet); _payloadStart = other._payloadStart; - _capacity = other._capacity; + _payloadCapacity = other._payloadCapacity; - _sizeUsed = other._sizeUsed; + _payloadSize = other._payloadSize; return *this; } +void Packet::setPayloadSize(qint64 payloadSize) { + if (isWritable()) { + Q_ASSERT(payloadSize > _payloadCapacity); + _payloadSize = std::max(payloadSize, _payloadCapacity); + } else { + qDebug() << "You can not call setPayloadSize for a non-writeable Packet."; + Q_ASSERT(false); + } +} + +bool Packet::reset() { + if (isWritable()) { + setPayloadSize(0); + } + + return QIODevice::reset(); +} + void Packet::setType(PacketType::Value type) { auto currentHeaderSize = totalHeadersSize(); _type = type; @@ -197,13 +215,13 @@ qint64 Packet::writeData(const char* data, qint64 maxSize) { if (maxSize <= bytesAvailableForWrite()) { qint64 currentPos = pos(); - Q_ASSERT(currentPos < _capacity); + Q_ASSERT(currentPos < _payloadCapacity); // good to go - write the data memcpy(_payloadStart + currentPos, data, maxSize); - // keep track of _sizeUsed so we can just write the actual data when packet is about to be sent - _sizeUsed = std::max(currentPos + maxSize, _sizeUsed); + // keep track of _payloadSize so we can just write the actual data when packet is about to be sent + _payloadSize = std::max(currentPos + maxSize, _payloadSize); // return the number of bytes written return maxSize; diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 1e18dde117..9e68272ccf 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -49,11 +49,14 @@ public: PacketVersion getVersion() const { return _version; } - qint64 getSizeWithHeader() const { return totalHeadersSize() + getSizeUsed(); } - qint64 getSizeUsed() const { return _sizeUsed; } - void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } + qint64 getDataSize() const { return totalHeadersSize() + getPayloadSize(); } + + qint64 getPayloadSize() const { return _payloadSize; } + void setPayloadSize(qint64 payloadSize); - qint64 bytesAvailableForWrite() const { return _capacity - _sizeUsed; } + qint64 getPayloadCapacity() const { return _payloadCapacity; } + + qint64 bytesAvailableForWrite() const { return _payloadCapacity - _payloadSize; } HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } @@ -64,8 +67,8 @@ public: // QIODevice virtual functions // WARNING: Those methods all refer to the payload ONLY and NOT the entire packet virtual bool isSequential() const { return false; } - virtual bool reset() { setSizeUsed(0); return QIODevice::reset(); } - virtual qint64 size() const { return _capacity; } + virtual bool reset(); + virtual qint64 size() const { return _payloadCapacity; } template qint64 peekPrimitive(T* data); template qint64 readPrimitive(T* data); @@ -98,9 +101,9 @@ protected: std::unique_ptr _packet; // Allocated memory char* _payloadStart = nullptr; // Start of the payload - qint64 _capacity = 0; // Total capacity of the payload + qint64 _payloadCapacity = 0; // Total capacity of the payload - qint64 _sizeUsed = 0; // How much of the payload is actually used + qint64 _payloadSize = 0; // How much of the payload is actually used HifiSockAddr _senderSockAddr; // sender address for packet (only used on receiving end) }; diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 675645abc2..909515f8a7 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -90,7 +90,7 @@ qint64 PacketList::writeData(const char* data, qint64 maxSize) { _segmentStartIndex = 0; // shrink the current payload to the actual size of the packet - _currentPacket->setSizeUsed(_segmentStartIndex); + _currentPacket->setPayloadSize(_segmentStartIndex); } // move the current packet to our list of packets diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 6f2780d871..e8a618de26 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -103,7 +103,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu quint64 transitTime = queuedAt - createdAt; qCDebug(octree) << "OctreeEditPacketSender::queuePacketToNode() queued " << packet->getType() - << " - command to node bytes=" << packet->getSizeWithHeader() + << " - command to node bytes=" << packet->getDataSize() << " sequence=" << sequence << " transitTimeSoFar=" << transitTime << " usecs"; } @@ -254,7 +254,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, QByt bufferedPacket = NLPacket::create(type); } else { // If we're switching type, then we send the last one and start over - if ((type != bufferedPacket->getType() && bufferedPacket->getSizeUsed() > 0) || + if ((type != bufferedPacket->getType() && bufferedPacket->getPayloadSize() > 0) || (editMessage.size() >= bufferedPacket->bytesAvailableForWrite())) { // create the new packet and swap it with the packet in _pendingEditPackets @@ -307,7 +307,7 @@ void OctreeEditPacketSender::releaseQueuedMessages() { void OctreeEditPacketSender::releaseQueuedPacket(const QUuid& nodeID, std::unique_ptr packet) { _releaseQueuedPacketMutex.lock(); - if (packet->getSizeUsed() > 0 && packet->getType() != PacketType::Unknown) { + if (packet->getPayloadSize() > 0 && packet->getType() != PacketType::Unknown) { queuePacketToNode(nodeID, std::move(packet)); } _releaseQueuedPacketMutex.unlock(); diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 9f4cd0d1a1..7df9ace530 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -90,7 +90,7 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN qCDebug(octree, "OctreeRenderer::processDatagram() ... Got Packet Section" " color:%s compressed:%s sequence: %u flight:%d usec size:%lld data:%lld", debug::valueOf(packetIsColored), debug::valueOf(packetIsCompressed), - sequence, flightTime, packet.getSizeWithHeader(), packet.bytesAvailable()); + sequence, flightTime, packet.getDataSize(), packet.bytesAvailable()); } _packetsInLastWindow++; @@ -139,7 +139,7 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN " color:%s compressed:%s sequence: %u flight:%d usec size:%lld data:%lld" " subsection:%d sectionLength:%d uncompressed:%d", debug::valueOf(packetIsColored), debug::valueOf(packetIsCompressed), - sequence, flightTime, packet.getSizeWithHeader(), packet.bytesAvailable(), subsection, sectionLength, + sequence, flightTime, packet.getDataSize(), packet.bytesAvailable(), subsection, sectionLength, packetData.getUncompressedSize()); } diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 6507d10727..55213fdb7a 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -439,7 +439,7 @@ int OctreeSceneStats::packIntoPacket() { _statsPacket->writePrimitive(bytes); } - return _statsPacket->getSizeUsed(); + return _statsPacket->getPayloadSize(); } int OctreeSceneStats::unpackFromPacket(NLPacket& packet) { @@ -789,8 +789,8 @@ void OctreeSceneStats::trackIncomingOctreePacket(NLPacket& packet, bool wasStats // track packets here... _incomingPacket++; - _incomingBytes += packet.getSizeWithHeader(); + _incomingBytes += packet.getDataSize(); if (!wasStatsPacket) { - _incomingWastedBytes += (MAX_PACKET_SIZE - packet.getSizeWithHeader()); + _incomingWastedBytes += (MAX_PACKET_SIZE - packet.getDataSize()); } } From 44c99ef89ad9f834fbb5907179e298b1d358286f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Jul 2015 10:44:51 -0700 Subject: [PATCH 422/582] Replace bytesAvailable with bytesLefToRead --- .../src/octree/OctreeInboundPacketProcessor.cpp | 6 +++--- domain-server/src/DomainServer.cpp | 4 ++-- libraries/avatars/src/AvatarHashMap.cpp | 4 ++-- libraries/entities/src/EntityTree.cpp | 2 +- libraries/networking/src/udt/Packet.cpp | 2 +- libraries/networking/src/udt/Packet.h | 3 ++- libraries/octree/src/JurisdictionMap.cpp | 4 ++-- libraries/octree/src/OctreeRenderer.cpp | 10 +++++----- libraries/render-utils/src/Environment.cpp | 4 ++-- 9 files changed, 20 insertions(+), 19 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 2b31b2f2a2..0cb6eae9ed 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -136,18 +136,18 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet if (debugProcessPacket) { qDebug() << " atByte (in payload)=" << packet->pos(); qDebug() << " payload size=" << packet->getSizeUsed(); - if (!packet->bytesAvailable()) { + if (!packet->bytesLeftToRead()) { qDebug() << " ----- UNEXPECTED ---- got a packet without any edit details!!!! --------"; } } const unsigned char* editData = nullptr; - while (packet->bytesAvailable() > 0) { + while (packet->bytesLeftToRead() > 0) { editData = reinterpret_cast(packet->getPayload() + packet->pos()); - int maxSize = packet->bytesAvailable(); + int maxSize = packet->bytesLeftToRead(); if (debugProcessPacket) { qDebug() << " --- inside while loop ---"; diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 1824446fca..625f50d432 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -2190,7 +2190,7 @@ void DomainServer::processPathQueryPacket(QSharedPointer packet) { quint16 numPathBytes; packet->readPrimitive(&numPathBytes); - if (numPathBytes <= packet->bytesAvailable()) { + if (numPathBytes <= packet->bytesLeftToRead()) { // the number of path bytes makes sense for the sent packet - pull out the path QString pathQuery = QString::fromUtf8(packet->getPayload() + packet->pos(), numPathBytes); @@ -2223,7 +2223,7 @@ void DomainServer::processPathQueryPacket(QSharedPointer packet) { // are we going to be able to fit this response viewpoint in a packet? if (numPathBytes + numViewpointBytes + sizeof(numViewpointBytes) + sizeof(numPathBytes) - < (unsigned long) pathResponsePacket->bytesAvailable()) { + < (unsigned long) pathResponsePacket->bytesLeftToRead()) { // append the number of bytes this path is pathResponsePacket->writePrimitive(numPathBytes); diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index ac8982f8e8..ebabb1115b 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -56,7 +56,7 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha // enumerate over all of the avatars in this packet // only add them if mixerWeakPointer points to something (meaning that mixer is still around) - while (packet->bytesAvailable()) { + while (packet->bytesLeftToRead()) { QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); if (sessionUUID != _lastOwnerSessionUUID) { @@ -121,7 +121,7 @@ void AvatarHashMap::processAvatarBillboardPacket(QSharedPointer packet avatar = addAvatar(sessionUUID, sendingNode); } - QByteArray billboard = packet->read(packet->bytesAvailable()); + QByteArray billboard = packet->read(packet->bytesLeftToRead()); if (avatar->getBillboard() != billboard) { avatar->setBillboard(billboard); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index cb4011c799..61bbde6f1a 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -867,7 +867,7 @@ int EntityTree::processEraseMessage(NLPacket& packet, const SharedNodePointer& s for (size_t i = 0; i < numberOfIDs; i++) { - if (NUM_BYTES_RFC4122_UUID > packet.bytesAvailable()) { + if (NUM_BYTES_RFC4122_UUID > packet.bytesLeftToRead()) { qCDebug(entities) << "EntityTree::processEraseMessage().... bailing because not enough bytes in buffer"; break; // bail to prevent buffer overflow } diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 975c137f27..ac98ba9340 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -215,7 +215,7 @@ qint64 Packet::writeData(const char* data, qint64 maxSize) { qint64 Packet::readData(char* dest, qint64 maxSize) { // we're either reading what is left from the current position or what was asked to be read - qint64 numBytesToRead = std::min(bytesAvailable(), maxSize); + qint64 numBytesToRead = std::min(bytesLeftToRead(), maxSize); if (numBytesToRead > 0) { int currentPosition = pos(); diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 1e18dde117..c7933606be 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -53,7 +53,8 @@ public: qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } - qint64 bytesAvailableForWrite() const { return _capacity - _sizeUsed; } + void bytesLeftToRead() const { return _capacity - pos(); } + qint64 bytesAvailableForWrite() const { return _capacity - pos(); } HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 45cc1edef7..35806eb8a7 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -322,7 +322,7 @@ int JurisdictionMap::unpackFromPacket(NLPacket& packet) { int bytes = 0; packet.readPrimitive(&bytes); - if (bytes > 0 && bytes <= packet.bytesAvailable()) { + if (bytes > 0 && bytes <= packet.bytesLeftToRead()) { _rootOctalCode = new unsigned char[bytes]; packet.read(reinterpret_cast(_rootOctalCode), bytes); @@ -334,7 +334,7 @@ int JurisdictionMap::unpackFromPacket(NLPacket& packet) { int bytes = 0; packet.readPrimitive(&bytes); - if (bytes <= packet.bytesAvailable()) { + if (bytes <= packet.bytesLeftToRead()) { unsigned char* endNodeCode = new unsigned char[bytes]; packet.read(reinterpret_cast(endNodeCode), bytes); diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 9f4cd0d1a1..db3ace67ce 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -90,7 +90,7 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN qCDebug(octree, "OctreeRenderer::processDatagram() ... Got Packet Section" " color:%s compressed:%s sequence: %u flight:%d usec size:%lld data:%lld", debug::valueOf(packetIsColored), debug::valueOf(packetIsCompressed), - sequence, flightTime, packet.getSizeWithHeader(), packet.bytesAvailable()); + sequence, flightTime, packet.getSizeWithHeader(), packet.bytesLeftToRead()); } _packetsInLastWindow++; @@ -108,16 +108,16 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN bool error = false; - while (packet.bytesAvailable() > 0 && !error) { + while (packet.bytesLeftToRead() > 0 && !error) { if (packetIsCompressed) { - if (packet.bytesAvailable() > (qint64) sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE)) { + if (packet.bytesLeftToRead() > (qint64) sizeof(OCTREE_PACKET_INTERNAL_SECTION_SIZE)) { packet.readPrimitive(§ionLength); } else { sectionLength = 0; error = true; } } else { - sectionLength = packet.bytesAvailable(); + sectionLength = packet.bytesLeftToRead(); } if (sectionLength) { @@ -139,7 +139,7 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN " color:%s compressed:%s sequence: %u flight:%d usec size:%lld data:%lld" " subsection:%d sectionLength:%d uncompressed:%d", debug::valueOf(packetIsColored), debug::valueOf(packetIsCompressed), - sequence, flightTime, packet.getSizeWithHeader(), packet.bytesAvailable(), subsection, sectionLength, + sequence, flightTime, packet.getSizeWithHeader(), packet.bytesLeftToRead(), subsection, sectionLength, packetData.getUncompressedSize()); } diff --git a/libraries/render-utils/src/Environment.cpp b/libraries/render-utils/src/Environment.cpp index 1c878cf4c6..7b33ac1698 100644 --- a/libraries/render-utils/src/Environment.cpp +++ b/libraries/render-utils/src/Environment.cpp @@ -205,9 +205,9 @@ int Environment::processPacket(NLPacket& packet) { EnvironmentData newData; - while (packet.bytesAvailable() > 0) { + while (packet.bytesLeftToRead() > 0) { int dataLength = newData.parseData(reinterpret_cast(packet.getPayload() + packet.pos()), - packet.bytesAvailable()); + packet.bytesLeftToRead()); packet.seek(packet.pos() + dataLength); // update the mapping by address/ID From 3b8a335c8c5ac424ea8ddccf6b713fd5d54b9472 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Jul 2015 10:51:40 -0700 Subject: [PATCH 423/582] Fix bytesLeftToRead --- libraries/networking/src/udt/Packet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index c7933606be..70a11137db 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -53,7 +53,7 @@ public: qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } - void bytesLeftToRead() const { return _capacity - pos(); } + qint64 bytesLeftToRead() const { return _capacity - pos(); } qint64 bytesAvailableForWrite() const { return _capacity - pos(); } HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } From 95f401fa0f5e3c481e3b58e4f62fac16593410b1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 11:00:33 -0700 Subject: [PATCH 424/582] add comments to Packet methods --- libraries/networking/src/udt/Packet.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 343bb3f858..0ed02d28ee 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -49,9 +49,13 @@ public: PacketVersion getVersion() const { return _version; } + // Returns the size of the packet, including the header qint64 getDataSize() const { return totalHeadersSize() + getPayloadSize(); } + // Returns the size of the payload only qint64 getPayloadSize() const { return _payloadSize; } + + // Allows a writer to change the size of the payload used when writing directly void setPayloadSize(qint64 payloadSize); qint64 getPayloadCapacity() const { return _payloadCapacity; } From ca3285b0e4e8756d32909c418a294d3ab405d67a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 11:02:42 -0700 Subject: [PATCH 425/582] add a comment for getPayloadCapacity() --- libraries/networking/src/udt/Packet.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 0ed02d28ee..40d021f2fc 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -57,7 +57,8 @@ public: // Allows a writer to change the size of the payload used when writing directly void setPayloadSize(qint64 payloadSize); - + + // Returns the number of bytes allocated for the payload qint64 getPayloadCapacity() const { return _payloadCapacity; } qint64 bytesLeftToRead() const { return _payloadCapacity - pos(); } From 8b5026a81701653695c2842cbdc0ca7956fc7cfb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 11:17:26 -0700 Subject: [PATCH 426/582] cleanup some warnings --- interface/CMakeLists.txt | 19 +++++++++++++------ interface/src/ui/FlowLayout.cpp | 4 ++-- libraries/entities-renderer/CMakeLists.txt | 9 ++++++++- libraries/entities/CMakeLists.txt | 9 ++++++++- libraries/physics/CMakeLists.txt | 9 ++++++++- libraries/render-utils/src/TextRenderer.cpp | 4 ++-- tests/entities/src/main.cpp | 4 ++-- tests/physics/CMakeLists.txt | 10 ++++++++-- 8 files changed, 51 insertions(+), 17 deletions(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 017a9d3c5f..e9c1174016 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -105,10 +105,10 @@ if (APPLE) # set where in the bundle to put the resources file SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/icon/${ICON_FILENAME} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - set(DISCOVERED_RESOURCES "") + set(DISCOVERED_RESOURCES "") # use the add_resources_to_os_x_bundle macro to recurse into resources - add_resources_to_os_x_bundle("${CMAKE_CURRENT_SOURCE_DIR}/resources") + add_resources_to_os_x_bundle("${CMAKE_CURRENT_SOURCE_DIR}/resources") # append the discovered resources to our list of interface sources list(APPEND INTERFACE_SRCS ${DISCOVERED_RESOURCES}) @@ -136,12 +136,19 @@ target_include_directories(${TARGET_NAME} PRIVATE ${LIBOVR_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${LIBOVR_LIBRARIES}) find_package(Bullet REQUIRED) -target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) + +# perform the system include hack for OS X to ignore warnings +if (APPLE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${BULLET_INCLUDE_DIRS}") +else() + target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) +endif() + target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) # link required hifi libraries -link_hifi_libraries(shared octree environment gpu model render fbx networking entities avatars - audio audio-client animation script-engine physics +link_hifi_libraries(shared octree environment gpu model render fbx networking entities avatars + audio audio-client animation script-engine physics render-utils entities-renderer ui auto-updater) add_dependency_external_projects(sdl2) @@ -185,7 +192,7 @@ foreach(EXTERNAL ${OPTIONAL_EXTERNALS}) endforeach() # special OS X modifications for RtMidi library -if (RTMIDI_FOUND AND NOT DISABLE_RTMIDI AND APPLE) +if (RTMIDI_FOUND AND NOT DISABLE_RTMIDI AND APPLE) find_library(CoreMIDI CoreMIDI) add_definitions(-D__MACOSX_CORE__) target_link_libraries(${TARGET_NAME} ${CoreMIDI}) diff --git a/interface/src/ui/FlowLayout.cpp b/interface/src/ui/FlowLayout.cpp index ed68204d90..c12de05629 100644 --- a/interface/src/ui/FlowLayout.cpp +++ b/interface/src/ui/FlowLayout.cpp @@ -38,14 +38,14 @@ ** ****************************************************************************/ -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdouble-promotion" #endif #include -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop #endif diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt index 40ca1ccbc9..810d5f5843 100644 --- a/libraries/entities-renderer/CMakeLists.txt +++ b/libraries/entities-renderer/CMakeLists.txt @@ -9,7 +9,14 @@ target_include_directories(${TARGET_NAME} PUBLIC ${GLM_INCLUDE_DIRS}) add_dependency_external_projects(bullet) find_package(Bullet REQUIRED) -target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) + +# perform the system include hack for OS X to ignore warnings +if (APPLE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${BULLET_INCLUDE_DIRS}") +else() + target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) +endif() + target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) add_dependency_external_projects(polyvox) diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt index 926fd8b4b2..f7936ff125 100644 --- a/libraries/entities/CMakeLists.txt +++ b/libraries/entities/CMakeLists.txt @@ -10,7 +10,14 @@ target_include_directories(${TARGET_NAME} PUBLIC ${GLM_INCLUDE_DIRS}) add_dependency_external_projects(bullet) find_package(Bullet REQUIRED) -target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) + +# perform the system include hack for OS X to ignore warnings +if (APPLE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${BULLET_INCLUDE_DIRS}") +else() + target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) +endif() + target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) link_hifi_libraries(avatars shared octree gpu model fbx networking animation environment) diff --git a/libraries/physics/CMakeLists.txt b/libraries/physics/CMakeLists.txt index 5e94513da4..b1f9fbb79c 100644 --- a/libraries/physics/CMakeLists.txt +++ b/libraries/physics/CMakeLists.txt @@ -10,7 +10,14 @@ target_include_directories(${TARGET_NAME} PUBLIC ${GLM_INCLUDE_DIRS}) add_dependency_external_projects(bullet) find_package(Bullet REQUIRED) -target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) + +# perform the system include hack for OS X to ignore warnings +if (APPLE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${BULLET_INCLUDE_DIRS}") +else() + target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) +endif() + target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) link_hifi_libraries(shared fbx entities) diff --git a/libraries/render-utils/src/TextRenderer.cpp b/libraries/render-utils/src/TextRenderer.cpp index fcd7bf2f2a..0354a0217f 100644 --- a/libraries/render-utils/src/TextRenderer.cpp +++ b/libraries/render-utils/src/TextRenderer.cpp @@ -18,7 +18,7 @@ #include #include -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdouble-promotion" #endif @@ -29,7 +29,7 @@ #include #include -#ifdef __GNUC__ +#if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop #endif diff --git a/tests/entities/src/main.cpp b/tests/entities/src/main.cpp index a255ffa995..740d401107 100644 --- a/tests/entities/src/main.cpp +++ b/tests/entities/src/main.cpp @@ -109,7 +109,7 @@ void testPropertyFlags(uint32_t value) { } QByteArray encoded = original.encode(); #ifndef QT_NO_DEBUG - auto originalSize = encoded.size(); + int originalSize = encoded.size(); #endif for (size_t i = 0; i < enumSize; ++i) { encoded.append(qrand()); @@ -123,7 +123,7 @@ void testPropertyFlags(uint32_t value) { { #ifndef QT_NO_DEBUG - auto decodeSize = decodeNew.decode((const uint8_t*)encoded.data(), encoded.size()); + int decodeSize = decodeNew.decode((const uint8_t*)encoded.data(), encoded.size()); #endif Q_ASSERT(originalSize == decodeSize); Q_ASSERT(decodeNew == original); diff --git a/tests/physics/CMakeLists.txt b/tests/physics/CMakeLists.txt index 6059ca3b19..36cf21c681 100644 --- a/tests/physics/CMakeLists.txt +++ b/tests/physics/CMakeLists.txt @@ -8,11 +8,17 @@ macro (SETUP_TESTCASE_DEPENDENCIES) add_dependency_external_projects(bullet) find_package(Bullet REQUIRED) - target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) + + # perform the system include hack for OS X to ignore warnings + if (APPLE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem ${BULLET_INCLUDE_DIRS}") + else() + target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) + endif() link_hifi_libraries(shared physics) copy_dlls_beside_windows_executable() endmacro () -setup_hifi_testcase(Script) \ No newline at end of file +setup_hifi_testcase(Script) From 0b32a5d93556564d9f0b23cbcd5d468f0b130b85 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 11:42:35 -0700 Subject: [PATCH 427/582] Write session uuid and connection hash in packet header --- libraries/networking/src/LimitedNodeList.cpp | 47 ++++++++++++++------ libraries/networking/src/LimitedNodeList.h | 12 +++-- libraries/networking/src/NLPacket.cpp | 4 +- libraries/networking/src/NLPacket.h | 6 +-- 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 33139e66e8..090c3bdd8b 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -214,7 +214,19 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod return false; } -qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr) { +// NLPacket helper for filling the header +void writePacketheader(const NLPacket& packet, const QUuid& sessionUUID = QUuid(), const QUuid& connectionSecret = QUuid()) { + if (!NON_SOURCED_PACKETS.contains(packet.getType())) { + const_cast(packet).writeSourceID(sessionUUID); + } + if (!connectionSecret.isNull() && !NON_VERIFIED_PACKETS.contains(packet.getType())) { + const_cast(packet).writeVerificationHash(packet.payloadHashWithConnectionUUID(connectionSecret)); + } +} + +qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, + const QUuid& connectionSecret) { + writePacketheader(packet, getSessionUUID(), connectionSecret); return writeDatagram({packet.getData(), static_cast(packet.getSizeWithHeader())}, destinationSockAddr); } @@ -235,31 +247,35 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSock } qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode) { - if (!destinationNode.getActiveSocket()) { + const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); + if (!activeSocket) { // we don't have a socket to send to, return 0 return 0; } // use the node's active socket as the destination socket - return sendUnreliablePacket(packet, *destinationNode.getActiveSocket()); + return sendUnreliablePacket(packet, *activeSocket, destinationNode.getConnectionSecret()); } -qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr) { - return writeDatagram(packet, sockAddr); +qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr, + const QUuid& connectionSecret) { + return writeDatagram(packet, sockAddr, connectionSecret); } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& destinationNode) { - if (!destinationNode.getActiveSocket()) { + const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); + if (!activeSocket) { // we don't have a socket to send to, return 0 return 0; } // use the node's active socket as the destination socket - return sendPacket(std::move(packet), *destinationNode.getActiveSocket()); + return sendPacket(std::move(packet), *activeSocket, destinationNode.getConnectionSecret()); } -qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr) { - return writeDatagram(*packet, sockAddr); +qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr, + const QUuid& connectionSecret) { + return writeDatagram(*packet, sockAddr, connectionSecret); } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { @@ -268,17 +284,20 @@ qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& des // we don't have a socket to send to, return 0 return 0; } - return sendPacketList(packetList, *activeSocket); + + // use the node's active socket as the destination socket + return sendPacketList(packetList, *activeSocket, destinationNode.getConnectionSecret()); } -qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr) { - qint64 bytesSent { 0 }; +qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr, + const QUuid& connectionSecret) { + qint64 bytesSent{ 0 }; // close the last packet in the list packetList.closeCurrentPacket(); while (!packetList._packets.empty()) { - bytesSent += sendPacket(std::move(packetList.takeFront()), sockAddr); + bytesSent += sendPacket(std::move(packetList.takeFront()), sockAddr, connectionSecret); } return bytesSent; @@ -289,7 +308,7 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& // use the node's active socket as the destination socket if there is no overriden socket address auto& destinationSockAddr = (overridenSockAddr.isNull()) ? *destinationNode.getActiveSocket() : overridenSockAddr; - return sendPacket(std::move(packet), destinationSockAddr); + return sendPacket(std::move(packet), destinationSockAddr, destinationNode.getConnectionSecret()); } PacketSequenceNumber LimitedNodeList::getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 59e5d73acd..cd3a0f0594 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -120,13 +120,16 @@ public: PacketReceiver& getPacketReceiver() { return _packetReceiver; } qint64 sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode); - qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr); + qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr, + const QUuid& connectionSecret = QUuid()); qint64 sendPacket(std::unique_ptr packet, const Node& destinationNode); - qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr); + qint64 sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr, + const QUuid& connectionSecret = QUuid()); qint64 sendPacketList(NLPacketList& packetList, const Node& destinationNode); - qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr); + qint64 sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr, + const QUuid& connectionSecret = QUuid()); void (*linkedDataCreateCallback)(Node *); @@ -245,7 +248,8 @@ protected: LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton - qint64 writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr); + qint64 writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, + const QUuid& connectionSecret = QUuid()); qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); PacketSequenceNumber getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType); diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index d1fabb1c15..e4f37b68c8 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -115,7 +115,7 @@ void NLPacket::readVerificationHash() { } } -void NLPacket::setSourceID(const QUuid& sourceID) { +void NLPacket::writeSourceID(const QUuid& sourceID) { Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type)); auto offset = Packet::totalHeadersSize(); @@ -124,7 +124,7 @@ void NLPacket::setSourceID(const QUuid& sourceID) { _sourceID = sourceID; } -void NLPacket::setVerificationHash(const QByteArray& verificationHash) { +void NLPacket::writeVerificationHash(const QByteArray& verificationHash) { Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type) && !NON_VERIFIED_PACKETS.contains(_type)); auto offset = Packet::totalHeadersSize() + NUM_BYTES_RFC4122_UUID; diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 0c9d31c66e..e9f397766d 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -33,6 +33,9 @@ public: const QUuid& getSourceID() const { return _sourceID; } const QByteArray& getVerificationHash() const { return _verificationHash; } + + void writeSourceID(const QUuid& sourceID); + void writeVerificationHash(const QByteArray& verificationHash); QByteArray payloadHashWithConnectionUUID(const QUuid& connectionUUID) const; @@ -43,10 +46,7 @@ protected: NLPacket(const NLPacket& other); void readSourceID(); - void setSourceID(const QUuid& sourceID); - void readVerificationHash(); - void setVerificationHash(const QByteArray& verificationHash); QUuid _sourceID; QByteArray _verificationHash; From 7631af99e0336fc76c6f7f58a7b8f82817091536 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 11:46:31 -0700 Subject: [PATCH 428/582] fix compile for new data size method --- libraries/networking/src/LimitedNodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 9c90b8b348..3bc4d0ff74 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -227,7 +227,7 @@ void writePacketHeader(const NLPacket& packet, const QUuid& sessionUUID = QUuid( qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, const QUuid& connectionSecret) { writePacketHeader(packet, getSessionUUID(), connectionSecret); - return writeDatagram({packet.getData(), static_cast(packet.getSizeWithHeader())}, destinationSockAddr); + return writeDatagram({ packet.getData(), (int) packet.getDataSize() }, destinationSockAddr); } qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { From 0b700d690ac4aa2b1879aeaea7a2ac943a69727b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 11:48:27 -0700 Subject: [PATCH 429/582] fix bad assert for payload size --- libraries/networking/src/udt/Packet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 31c861dc3c..cfa90a43e4 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -137,7 +137,7 @@ Packet& Packet::operator=(Packet&& other) { void Packet::setPayloadSize(qint64 payloadSize) { if (isWritable()) { - Q_ASSERT(payloadSize > _payloadCapacity); + Q_ASSERT(payloadSize <= _payloadCapacity); _payloadSize = std::max(payloadSize, _payloadCapacity); } else { qDebug() << "You can not call setPayloadSize for a non-writeable Packet."; From cee173400614fa5d82c5c85178c052e1f9a03ca6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 11:48:30 -0700 Subject: [PATCH 430/582] Remove helper function --- libraries/networking/src/LimitedNodeList.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 090c3bdd8b..70c3bb3704 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -214,19 +214,14 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod return false; } -// NLPacket helper for filling the header -void writePacketheader(const NLPacket& packet, const QUuid& sessionUUID = QUuid(), const QUuid& connectionSecret = QUuid()) { +qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, + const QUuid& connectionSecret) { if (!NON_SOURCED_PACKETS.contains(packet.getType())) { - const_cast(packet).writeSourceID(sessionUUID); + const_cast(packet).writeSourceID(getSessionUUID()); } if (!connectionSecret.isNull() && !NON_VERIFIED_PACKETS.contains(packet.getType())) { const_cast(packet).writeVerificationHash(packet.payloadHashWithConnectionUUID(connectionSecret)); } -} - -qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, - const QUuid& connectionSecret) { - writePacketheader(packet, getSessionUUID(), connectionSecret); return writeDatagram({packet.getData(), static_cast(packet.getSizeWithHeader())}, destinationSockAddr); } From 432048addfafefc3e388911f52004ab6cad1c558 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 11:55:50 -0700 Subject: [PATCH 431/582] use macro for AvatarMixer, show type for unknown --- assignment-client/src/avatars/AvatarMixer.h | 2 +- libraries/networking/src/LimitedNodeList.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 034269f7fa..67fdbf5285 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -19,6 +19,7 @@ /// Handles assignments of type AvatarMixer - distribution of avatar data to various clients class AvatarMixer : public ThreadedAssignment { + Q_OBJECT public: AvatarMixer(NLPacket& packet); ~AvatarMixer(); @@ -26,7 +27,6 @@ public slots: /// runs the avatar mixer void run(); - void nodeAdded(SharedNodePointer nodeAdded); void nodeKilled(SharedNodePointer killedNode); void sendStatsPacket(); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 3bc4d0ff74..e752dcb682 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -206,8 +206,8 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ received from unknown node with UUID"); - qCDebug(networking) << "Packet of type" << packet.getType() << "received from unknown node with UUID" - << qPrintable(uuidStringWithoutCurlyBraces(packet.getSourceID())); + qCDebug(networking) << "Packet of type" << packet.getType() << "(" << nameForPacketType(packet.getType()) << ")" + << "received from unknown node with UUID" << qPrintable(uuidStringWithoutCurlyBraces(packet.getSourceID())); } } From e744e08577c575d98a01955d73afc928a6b5726a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 11:56:01 -0700 Subject: [PATCH 432/582] Missed one connection secret --- libraries/networking/src/LimitedNodeList.cpp | 10 +++++----- libraries/networking/src/LimitedNodeList.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a015e11a33..66755c9d53 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -214,8 +214,8 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod return false; } -qint64 LimitedNodeList::writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, - const QUuid& connectionSecret) { +qint64 LimitedNodeList::writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, + const QUuid& connectionSecret) { if (!NON_SOURCED_PACKETS.contains(packet.getType())) { const_cast(packet).writeSourceID(getSessionUUID()); } @@ -254,7 +254,7 @@ qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr, const QUuid& connectionSecret) { - return writeDatagram(packet, sockAddr, connectionSecret); + return writePacket(packet, sockAddr, connectionSecret); } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& destinationNode) { @@ -270,7 +270,7 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr, const QUuid& connectionSecret) { - return writeDatagram(*packet, sockAddr, connectionSecret); + return writePacket(*packet, sockAddr, connectionSecret); } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { @@ -491,7 +491,7 @@ unsigned int LimitedNodeList::broadcastToNodes(std::unique_ptr packet, eachNode([&](const SharedNodePointer& node){ if (destinationNodeTypes.contains(node->getType())) { - writeDatagram(*packet, *node->getActiveSocket()); + writePacket(*packet, *node->getActiveSocket(), node->getConnectionSecret()); ++n; } }); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index cd3a0f0594..a2cbac7348 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -248,8 +248,8 @@ protected: LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton - qint64 writeDatagram(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, - const QUuid& connectionSecret = QUuid()); + qint64 writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, + const QUuid& connectionSecret = QUuid()); qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); PacketSequenceNumber getNextSequenceNumberForPacket(const QUuid& nodeUUID, PacketType::Value packetType); From c4a97de98546ec1e6dbde5f119981c66ded2c389 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 12:12:04 -0700 Subject: [PATCH 433/582] fix verification of source but unverified packets --- libraries/networking/src/LimitedNodeList.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index e752dcb682..3538525350 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -180,6 +180,7 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod if (NON_SOURCED_PACKETS.contains(packet.getType())) { return true; } else { + // figure out which node this is from matchingNode = nodeWithUUID(packet.getSourceID()); @@ -199,9 +200,10 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod return false; } - - return true; } + + return true; + } else { static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ received from unknown node with UUID"); From e90ace62319bc1d0baa623020e0c3f01f8003e94 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 12:37:30 -0700 Subject: [PATCH 434/582] fix child assignment UUID, adjust for NLPacket after unpack --- assignment-client/src/AssignmentClient.cpp | 7 +------ assignment-client/src/AssignmentClient.h | 1 + domain-server/src/DomainServer.cpp | 2 +- libraries/networking/src/NLPacket.cpp | 18 ++++++++++++------ libraries/networking/src/NLPacket.h | 3 +++ libraries/networking/src/udt/Packet.h | 2 +- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 1029933232..2e044f07ff 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -73,11 +73,6 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri // put the NodeList on the node thread nodeList->moveToThread(nodeThread); - // make up a uuid for this child so the parent can tell us apart. This id will be changed - // when the domain server hands over an assignment. - QUuid nodeUUID = QUuid::createUuid(); - nodeList->setSessionUUID(nodeUUID); - // set the logging target to the the CHILD_TARGET_NAME LogHandler::getInstance().setTargetName(ASSIGNMENT_CLIENT_TARGET_NAME); @@ -197,7 +192,7 @@ void AssignmentClient::sendStatusPacketToACM() { auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, sizeof(assignmentType) + NUM_BYTES_RFC4122_UUID); - statusPacket->write(nodeList->getSessionUUID().toRfc4122()); + statusPacket->write(_childAssignmentUUID.toRfc4122()); statusPacket->writePrimitive(assignmentType); nodeList->sendPacket(std::move(statusPacket), _assignmentClientMonitorSocket); diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index e74cd50065..1959c915bb 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -51,6 +51,7 @@ private: HifiSockAddr _assignmentServerSocket; QTimer _requestTimer; // timer for requesting and assignment QTimer _statsTimerACM; // timer for sending stats to assignment client monitor + QUuid _childAssignmentUUID = QUuid::createUuid(); protected: HifiSockAddr _assignmentClientMonitorSocket; diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index a7395ffc68..a709986fc7 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -940,7 +940,7 @@ int DomainServer::parseNodeData(QDataStream& packetStream, NodeType_t& nodeType, const HifiSockAddr& senderSockAddr) { packetStream >> nodeType; packetStream >> publicSockAddr >> localSockAddr; - + if (publicSockAddr.getAddress().isNull()) { // this node wants to use us its STUN server // so set the node public address to whatever we perceive the public address to be diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 0ba81f73e8..4777365d64 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -78,29 +78,35 @@ NLPacket::NLPacket(PacketType::Value type, qint64 size) : { Q_ASSERT(size >= 0); - qint64 headerSize = localHeaderSize(type); - _payloadStart += headerSize; - _payloadCapacity -= headerSize; + adjustPayloadStartAndCapacity(); } NLPacket::NLPacket(PacketType::Value type) : Packet(type, -1) { - qint64 headerSize = localHeaderSize(type); - _payloadStart += headerSize; - _payloadCapacity -= headerSize; + adjustPayloadStartAndCapacity(); } NLPacket::NLPacket(const NLPacket& other) : Packet(other) { + } NLPacket::NLPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr) : Packet(std::move(data), size, senderSockAddr) { + adjustPayloadStartAndCapacity(); + _payloadSize = _payloadCapacity; + readSourceID(); readVerificationHash(); } +void NLPacket::adjustPayloadStartAndCapacity() { + qint64 headerSize = localHeaderSize(_type); + _payloadStart += headerSize; + _payloadCapacity -= headerSize; +} + void NLPacket::readSourceID() { if (!NON_SOURCED_PACKETS.contains(_type)) { auto offset = Packet::totalHeadersSize(); diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index e9f397766d..669278ed65 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -40,6 +40,9 @@ public: QByteArray payloadHashWithConnectionUUID(const QUuid& connectionUUID) const; protected: + + void adjustPayloadStartAndCapacity(); + NLPacket(PacketType::Value type); NLPacket(PacketType::Value type, qint64 size); NLPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 40d021f2fc..1d499e2b00 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -50,7 +50,7 @@ public: PacketVersion getVersion() const { return _version; } // Returns the size of the packet, including the header - qint64 getDataSize() const { return totalHeadersSize() + getPayloadSize(); } + qint64 getDataSize() const { return totalHeadersSize() + _payloadSize; } // Returns the size of the payload only qint64 getPayloadSize() const { return _payloadSize; } From aa517adb73272057613cde28bb58411510616e7c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 13:09:04 -0700 Subject: [PATCH 435/582] Fix Application inheritance formatting --- interface/src/Application.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index 5d67270533..53c94619a9 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -135,9 +135,10 @@ class Application; typedef bool (Application::* AcceptURLMethod)(const QString &); -class Application : public QApplication, +class Application : + public QApplication, public AbstractViewStateInterface, - AbstractScriptingServicesInterface, + public AbstractScriptingServicesInterface, public PacketListener { Q_OBJECT From f3800cacdadff7a8d73ce7166dd6cb07ff31215f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 13:10:16 -0700 Subject: [PATCH 436/582] Don't unregister packet listeners when no nodelist --- libraries/networking/src/PacketListener.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketListener.cpp b/libraries/networking/src/PacketListener.cpp index 3036afc7cb..f4a5c4a9cd 100644 --- a/libraries/networking/src/PacketListener.cpp +++ b/libraries/networking/src/PacketListener.cpp @@ -14,5 +14,8 @@ #include "NodeList.h" PacketListener::~PacketListener() { - DependencyManager::get()->getPacketReceiver().unregisterListener(this); + auto limitedNodelist = DependencyManager::get(); + if (limitedNodelist) { + limitedNodelist->getPacketReceiver().unregisterListener(this); + } } From a79c8ab1938c333fce99424d948604bd208bf04f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 13:17:32 -0700 Subject: [PATCH 437/582] fix check for writing of packet header --- libraries/networking/src/LimitedNodeList.cpp | 5 ++++- libraries/networking/src/NodeList.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 3538525350..f6bf785d00 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -221,7 +221,10 @@ void writePacketHeader(const NLPacket& packet, const QUuid& sessionUUID = QUuid( if (!NON_SOURCED_PACKETS.contains(packet.getType())) { const_cast(packet).writeSourceID(sessionUUID); } - if (!connectionSecret.isNull() && !NON_VERIFIED_PACKETS.contains(packet.getType())) { + + if (!connectionSecret.isNull() + && !NON_SOURCED_PACKETS.contains(packet.getType()) + && !NON_VERIFIED_PACKETS.contains(packet.getType())) { const_cast(packet).writeVerificationHash(packet.payloadHashWithConnectionUUID(connectionSecret)); } } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index bd0b6b9458..2010889ac7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -284,7 +284,7 @@ void NodeList::sendDomainServerCheckIn() { flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendDSCheckIn); - if (!isUsingDTLS) { + if (!isUsingDTLS) { sendPacket(std::move(domainPacket), _domainHandler.getSockAddr()); } From 312780a2f63dc55e72e5be7728b516b7de5ee3ae Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 13:31:36 -0700 Subject: [PATCH 438/582] fix offset for source UUID and verification hash --- libraries/networking/src/NLPacket.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 4777365d64..5d996fc9b8 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -109,14 +109,14 @@ void NLPacket::adjustPayloadStartAndCapacity() { void NLPacket::readSourceID() { if (!NON_SOURCED_PACKETS.contains(_type)) { - auto offset = Packet::totalHeadersSize(); + auto offset = Packet::localHeaderSize(); _sourceID = QUuid::fromRfc4122(QByteArray::fromRawData(_packet.get() + offset, NUM_BYTES_RFC4122_UUID)); } } void NLPacket::readVerificationHash() { if (!NON_SOURCED_PACKETS.contains(_type) && !NON_VERIFIED_PACKETS.contains(_type)) { - auto offset = Packet::totalHeadersSize() + NUM_BYTES_RFC4122_UUID; + auto offset = Packet::localHeaderSize() + NUM_BYTES_RFC4122_UUID; _verificationHash = QByteArray(_packet.get() + offset, NUM_BYTES_MD5_HASH); } } @@ -124,7 +124,7 @@ void NLPacket::readVerificationHash() { void NLPacket::writeSourceID(const QUuid& sourceID) { Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type)); - auto offset = Packet::totalHeadersSize(); + auto offset = Packet::localHeaderSize(); memcpy(_packet.get() + offset, sourceID.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); _sourceID = sourceID; @@ -133,7 +133,7 @@ void NLPacket::writeSourceID(const QUuid& sourceID) { void NLPacket::writeVerificationHash(const QByteArray& verificationHash) { Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type) && !NON_VERIFIED_PACKETS.contains(_type)); - auto offset = Packet::totalHeadersSize() + NUM_BYTES_RFC4122_UUID; + auto offset = Packet::localHeaderSize() + NUM_BYTES_RFC4122_UUID; memcpy(_packet.get() + offset, verificationHash.data(), verificationHash.size()); _verificationHash = verificationHash; From d4680ee1dd6cfb6e6af87544a29ada20cceb7451 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 13:41:28 -0700 Subject: [PATCH 439/582] fix for no current packet in PacketList --- libraries/networking/src/udt/PacketList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 909515f8a7..4036e872fd 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -22,7 +22,7 @@ PacketList::PacketList(PacketType::Value packetType) : } void PacketList::startSegment() { - _segmentStartIndex = _currentPacket->pos(); + _segmentStartIndex = _currentPacket ? _currentPacket->pos() : 0; } void PacketList::endSegment() { From 5a5a396b6266a5b65e6b8c8d508eccf4b52854a1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 13:41:35 -0700 Subject: [PATCH 440/582] Check we have an AM before sending packet --- libraries/audio-client/src/AudioIOStats.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioIOStats.cpp b/libraries/audio-client/src/AudioIOStats.cpp index baf9baedf8..0ad6860b5a 100644 --- a/libraries/audio-client/src/AudioIOStats.cpp +++ b/libraries/audio-client/src/AudioIOStats.cpp @@ -102,6 +102,10 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { _receivedAudioStream->perSecondCallbackForUpdatingStats(); auto nodeList = DependencyManager::get(); + SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); + if (!audioMixer) { + return; + } quint8 appendFlag = 0; quint16 numStreamStatsToPack = 1; @@ -118,8 +122,7 @@ void AudioIOStats::sendDownstreamAudioStatsPacket() { // pack downstream audio stream stats statsPacket->writePrimitive(stats); - + // send packet - SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); nodeList->sendPacket(std::move(statsPacket), *audioMixer); } From 43c6fba94a78ee36ee548f53c200544d1694c088 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 13:49:06 -0700 Subject: [PATCH 441/582] Register DomainServerAddedNode --- libraries/networking/src/NodeList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 2010889ac7..80583f0a4e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -93,6 +93,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned packetReceiver.registerListener(PacketType::Ping, this, "processPingPacket"); packetReceiver.registerListener(PacketType::PingReply, this, "processPingReplyPacket"); packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); + packetReceiver.registerListener(PacketType::DomainServerAddedNode, this, "processDomainServerAddedNode"); packetReceiver.registerListener(PacketType::ICEServerPeerInformation, &_domainHandler, "processICEResponsePacket"); packetReceiver.registerListener(PacketType::DomainServerRequireDTLS, &_domainHandler, "processDTLSRequirementPacket"); From 7dfbb74d67817fe0a3bd0d427096331f80355eab Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 13:49:34 -0700 Subject: [PATCH 442/582] ping packets are verified packets --- libraries/networking/src/NodeList.cpp | 1 + libraries/networking/src/udt/PacketHeaders.cpp | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 2010889ac7..26129a774d 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -159,6 +159,7 @@ void NodeList::timePingReply(QSharedPointer packet, const SharedNodePo } void NodeList::processPingPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + // send back a reply auto replyPacket = constructPingReplyPacket(*packet); const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 211677f6a6..ccbd56c674 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -20,9 +20,7 @@ using namespace PacketType; const QSet NON_VERIFIED_PACKETS = QSet() << NodeJsonStats << EntityQuery << OctreeDataNack << EntityEditNack - << DomainListRequest - << Ping - << PingReply << StopNode; + << DomainListRequest << StopNode; const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; From 6c06d4c49efa9f1f91448786e3ac0291e7b46012 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 13:59:58 -0700 Subject: [PATCH 443/582] use fromRawData for writeDatagram, correct type for PingReply --- libraries/networking/src/LimitedNodeList.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 34ac2c7b20..9fe0648a4b 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -227,7 +227,8 @@ qint64 LimitedNodeList::writePacket(const NLPacket& packet, const HifiSockAddr& && !NON_VERIFIED_PACKETS.contains(packet.getType())) { const_cast(packet).writeVerificationHash(packet.payloadHashWithConnectionUUID(connectionSecret)); } - return writeDatagram({ packet.getData(), (int)packet.getDataSize() }, destinationSockAddr); + + return writeDatagram(QByteArray::fromRawData(packet.getData(), packet.getDataSize()), destinationSockAddr); } qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { @@ -456,7 +457,7 @@ std::unique_ptr LimitedNodeList::constructPingReplyPacket(NLPacket& pi int packetSize = sizeof(PingType_t) + sizeof(quint64) + sizeof(quint64); - auto replyPacket = NLPacket::create(PacketType::Ping, packetSize); + auto replyPacket = NLPacket::create(PacketType::PingReply, packetSize); QDataStream packetStream(replyPacket.get()); packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); From 3d02cfc6adfdb61f8f2493ac716a2b265cd720db Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 14:06:08 -0700 Subject: [PATCH 444/582] only print no listener for packet one time --- libraries/networking/src/PacketReceiver.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 3e03e689d5..49115e1004 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -269,15 +269,12 @@ void PacketReceiver::processDatagrams() { << listener.first << "::" << qPrintable(listener.second.methodSignature()); } - } else { - // we have a dead listener - remove this mapping from the _packetListenerMap - qDebug() << "Listener for packet type" << packet->getType() << "(" - << qPrintable(nameForPacketType(packet->getType())) << ")" - << "has been destroyed - removing mapping."; - _packetListenerMap.erase(it); } } else { - qDebug() << "No listener found for packet type " << nameForPacketType(packet->getType()); + qWarning() << "No listener found for packet type " << nameForPacketType(packet->getType()); + + // insert a dummy listener so we don't print this again + _packetListenerMap.insert(packet->getType(), { nullptr, QMetaMethod() }); } _packetListenerLock.unlock(); From 039bdc8900bd11597c49a20a653159bc4be91db1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 14:06:39 -0700 Subject: [PATCH 445/582] Check dependencyManager return value --- interface/src/octree/OctreePacketProcessor.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index a7cb1aaa66..fbd22db558 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -28,7 +28,10 @@ OctreePacketProcessor::OctreePacketProcessor() { } OctreePacketProcessor::~OctreePacketProcessor() { - DependencyManager::get()->getPacketReceiver().unregisterListener(this); + auto nodelist = DependencyManager::get(); + if (nodelist) { + nodelist->getPacketReceiver().unregisterListener(this); + } } void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { From 2d86e807b0358d6a3abca100f93b55ba925edad5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Jul 2015 15:00:59 -0700 Subject: [PATCH 446/582] Move PACKET_WRITE_ERROR to Packet class --- libraries/networking/src/udt/Packet.cpp | 3 ++- libraries/networking/src/udt/Packet.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 31c861dc3c..27093dfddd 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -11,6 +11,8 @@ #include "Packet.h" +const qint64 Packet::PACKET_WRITE_ERROR = -1; + qint64 Packet::localHeaderSize(PacketType::Value type) { qint64 size = numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion) + ((SEQUENCE_NUMBERED_PACKETS.contains(type)) ? sizeof(SequenceNumber) : 0); @@ -208,7 +210,6 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { &seqNum, sizeof(seqNum)); } -static const qint64 PACKET_WRITE_ERROR = -1; qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 40d021f2fc..c124e314f9 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -24,6 +24,8 @@ class Packet : public QIODevice { public: using SequenceNumber = uint16_t; + static const qint64 PACKET_WRITE_ERROR; + static std::unique_ptr create(PacketType::Value type, qint64 size = -1); static std::unique_ptr fromReceivedPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); From ad61c3db41afd59fa2cfbd16f2e8820c6c4a8dab Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Jul 2015 15:01:27 -0700 Subject: [PATCH 447/582] Fix bytesLeftToRead --- libraries/networking/src/udt/Packet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index c124e314f9..7518923a4f 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -63,7 +63,7 @@ public: // Returns the number of bytes allocated for the payload qint64 getPayloadCapacity() const { return _payloadCapacity; } - qint64 bytesLeftToRead() const { return _payloadCapacity - pos(); } + qint64 bytesLeftToRead() const { return _payloadSize - pos(); } qint64 bytesAvailableForWrite() const { return _payloadCapacity - pos(); } HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } From 07e3cf1348b320a13aace2581527941c15819ac3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Jul 2015 15:01:56 -0700 Subject: [PATCH 448/582] Add COMPARE_DATA to QTestExtensions --- libraries/networking/src/udt/Packet.h | 1 - tests/QTestExtensions.h | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 7518923a4f..47861751d2 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -116,7 +116,6 @@ protected: HifiSockAddr _senderSockAddr; // sender address for packet (only used on receiving end) }; - template qint64 Packet::peekPrimitive(T* data) { return QIODevice::peek(reinterpret_cast(data), sizeof(T)); } diff --git a/tests/QTestExtensions.h b/tests/QTestExtensions.h index 213fe6d7b5..c374a9a507 100644 --- a/tests/QTestExtensions.h +++ b/tests/QTestExtensions.h @@ -251,6 +251,31 @@ do { \ #endif +#define QCOMPARE_WITH_EXPR(actual, expected, testExpr) \ + do { \ + if (!(testExpr)) { \ + QTest_failWithMessage("Compared values are not the same", (actual), (expected), #actual, #expected, __LINE__, __FILE__); \ + } \ + } while(0) +struct ByteData { + ByteData (const char* data, size_t length) + : data(data), length(length) {} + const char* data; + size_t length; +}; +QTextStream & operator << (QTextStream& stream, const ByteData & wrapper) { + // Print bytes as hex + stream << QByteArray::fromRawData(wrapper.data, wrapper.length).toHex(); + + return stream; +} + +bool compareData (const char* data, const char* expectedData, size_t length) { + return memcmp(data, expectedData, length) == 0; +} + +#define COMPARE_DATA(actual, expected, length) \ + QCOMPARE_WITH_EXPR((ByteData ( actual, length )), (ByteData ( expected, length )), compareData(actual, expected, length)) From d9b962c4d9cb46cd013fae3d4cae21552459f481 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Jul 2015 15:02:08 -0700 Subject: [PATCH 449/582] Add packet tests --- tests/networking/src/PacketTests.cpp | 168 +++++++++++++++++++++++++++ tests/networking/src/PacketTests.h | 16 +++ 2 files changed, 184 insertions(+) diff --git a/tests/networking/src/PacketTests.cpp b/tests/networking/src/PacketTests.cpp index c8c88679fb..8ac4a6d94e 100644 --- a/tests/networking/src/PacketTests.cpp +++ b/tests/networking/src/PacketTests.cpp @@ -10,5 +10,173 @@ // #include "PacketTests.h" +#include "../QTestExtensions.h" + +#include QTEST_MAIN(PacketTests) + +std::unique_ptr copyToReadPacket(std::unique_ptr& packet) { + auto size = packet->getDataSize(); + auto data = std::unique_ptr(new char[size]); + memcpy(data.get(), packet->getData(), size); + return Packet::fromReceivedPacket(std::move(data), size, HifiSockAddr()); +} + +void PacketTests::emptyPacketTest() { + auto packet = Packet::create(PacketType::Unknown); + + QCOMPARE(packet->getType(), PacketType::Unknown); + QCOMPARE(packet->getPayloadSize(), 0); + QCOMPARE(packet->getDataSize(), packet->totalHeadersSize()); + QCOMPARE(packet->bytesLeftToRead(), 0); + QCOMPARE(packet->bytesAvailableForWrite(), packet->getPayloadCapacity()); +} + +void PacketTests::packetTypeTest() { + auto packet = Packet::create(PacketType::EntityAdd); + + QCOMPARE(packet->getType(), PacketType::EntityAdd); + + packet->setType(PacketType::MixedAudio); + QCOMPARE(packet->getType(), PacketType::MixedAudio); + + packet->setType(PacketType::MuteEnvironment); + QCOMPARE(packet->getType(), PacketType::MuteEnvironment); +} + +void PacketTests::writeTest() { + auto packet = Packet::create(PacketType::Unknown); + + QCOMPARE(packet->getPayloadSize(), 0); + + QCOMPARE(packet->write("somedata"), 8); + QCOMPARE(packet->getPayloadSize(), 8); + + QCOMPARE(packet->write("moredata"), 8); + QCOMPARE(packet->getPayloadSize(), 16); + + COMPARE_DATA(packet->getPayload(), "somedatamoredata", 16); +} + +void PacketTests::readTest() { + // Test reads for several different size packets + for (int i = 1; i < 4; i++) { + auto packet = Packet::create(PacketType::Unknown); + + auto size = packet->getPayloadCapacity(); + size /= i; + + char* data = new char[size]; + + // Fill with "random" data + for (qint64 i = 0; i < size; i++) { + data[i] = i; + } + + QCOMPARE(packet->write(data, size), size); + + auto readPacket = copyToReadPacket(packet); + + QCOMPARE(readPacket->getDataSize(), packet->getDataSize()); + QCOMPARE(readPacket->getPayloadSize(), packet->getPayloadSize()); + COMPARE_DATA(readPacket->getData(), packet->getData(), packet->getDataSize()); + COMPARE_DATA(readPacket->getPayload(), packet->getPayload(), packet->getPayloadSize()); + + auto payloadSize = readPacket->getPayloadSize(); + char* readData = new char[payloadSize]; + QCOMPARE(readPacket->read(readData, payloadSize), payloadSize); + COMPARE_DATA(readData, data, payloadSize); + } +} + +void PacketTests::writePastCapacityTest() { + auto packet = Packet::create(PacketType::Unknown); + + auto size = packet->getPayloadCapacity(); + char* data = new char[size]; + + // Fill with "random" data + for (qint64 i = 0; i < size; i++) { + data[i] = i; + } + + QCOMPARE(packet->getPayloadSize(), 0); + + QCOMPARE(packet->write(data, size), size); + + QCOMPARE(packet->getPayloadSize(), size); + COMPARE_DATA(packet->getPayload(), data, size); + + QCOMPARE(packet->bytesAvailableForWrite(), 0); + QCOMPARE(packet->getPayloadSize(), size); + + QCOMPARE(Packet::PACKET_WRITE_ERROR, packet->write("data")); + + // Packet::write() shouldn't allow the caller to write if no space is left + QCOMPARE(packet->getPayloadSize(), size); +} + +void PacketTests::primitiveTest() { + auto packet = Packet::create(PacketType::Unknown); + + int value1 = 5; + char value2 = 10; + bool value3 = true; + qint64 value4 = -93404; + + packet->writePrimitive(value1); + packet->writePrimitive(value2); + packet->writePrimitive(value3); + packet->writePrimitive(value4); + + auto recvPacket = copyToReadPacket(packet); + + // Peek & read first value + { + int peekValue = 0; + QCOMPARE(recvPacket->peekPrimitive(&peekValue), (int)sizeof(peekValue)); + QCOMPARE(peekValue, value1); + int readValue = 0; + QCOMPARE(recvPacket->readPrimitive(&readValue), (int)sizeof(readValue)); + QCOMPARE(readValue, value1); + } + + // Peek & read second value + { + char peekValue = 0; + QCOMPARE(recvPacket->peekPrimitive(&peekValue), (int)sizeof(peekValue)); + QCOMPARE(peekValue, value2); + + char readValue = 0; + QCOMPARE(recvPacket->readPrimitive(&readValue), (int)sizeof(readValue)); + QCOMPARE(readValue, value2); + } + + // Peek & read third value + { + bool peekValue = 0; + QCOMPARE(recvPacket->peekPrimitive(&peekValue), (int)sizeof(peekValue)); + QCOMPARE(peekValue, value3); + + bool readValue = 0; + QCOMPARE(recvPacket->readPrimitive(&readValue), (int)sizeof(readValue)); + QCOMPARE(readValue, value3); + } + + // Peek & read fourth value + { + qint64 peekValue = 0; + QCOMPARE(recvPacket->peekPrimitive(&peekValue), (int)sizeof(peekValue)); + QCOMPARE(peekValue, value4); + + qint64 readValue = 0; + QCOMPARE(recvPacket->readPrimitive(&readValue), (int)sizeof(readValue)); + QCOMPARE(readValue, value4); + } + + // We should be at the end of the packet, with no more to peek or read + int noValue; + QCOMPARE(recvPacket->peekPrimitive(&noValue), 0); + QCOMPARE(recvPacket->readPrimitive(&noValue), 0); +} diff --git a/tests/networking/src/PacketTests.h b/tests/networking/src/PacketTests.h index 498fddf39a..44ae193523 100644 --- a/tests/networking/src/PacketTests.h +++ b/tests/networking/src/PacketTests.h @@ -19,7 +19,23 @@ class PacketTests : public QObject { Q_OBJECT private slots: + // Test the base state of Packet + void emptyPacketTest(); + + // Test Packet writes + void writeTest(); + + // Test Packet reads void readTest(); + + // Test Packet writing past capacity + void writePastCapacityTest(); + + // Test primitive reads and writes + void primitiveTest(); + + // Test set/get packet type + void packetTypeTest(); }; #endif // hifi_PacketTests_h From 5a2d59c5305742180eae75e6be600e575a5beee3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 15:07:34 -0700 Subject: [PATCH 450/582] fix ScriptEngine cleanup for Agent --- assignment-client/src/Agent.cpp | 3 ++- libraries/script-engine/src/ScriptEngine.cpp | 3 ++- libraries/script-engine/src/ScriptEngine.h | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index d57d4ba663..97ef85681a 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -42,7 +42,8 @@ Agent::Agent(NLPacket& packet) : { // be the parent of the script engine so it gets moved when we do _scriptEngine.setParent(this); - + _scriptEngine.setIsAgent(true); + DependencyManager::get()->setPacketSender(&_entityEditSender); DependencyManager::set(); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 9050b44065..e99072de71 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -721,7 +721,8 @@ void ScriptEngine::run() { } // If we were on a thread, then wait till it's done - if (thread()) { + // Unless we're an assignment-client, in which case that's handled for us + if (thread() && !_isAgent) { thread()->quit(); } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index a96042184d..65644dceb9 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -88,6 +88,8 @@ public: void setUserLoaded(bool isUserLoaded) { _isUserLoaded = isUserLoaded; } bool isUserLoaded() const { return _isUserLoaded; } + + void setIsAgent(bool isAgent) { _isAgent = isAgent; } void setParentURL(const QString& parentURL) { _parentURL = parentURL; } @@ -149,7 +151,8 @@ protected: bool _isListeningToAudioStream; Sound* _avatarSound; int _numAvatarSoundSentBytes; - + bool _isAgent = false; + private: void stopAllTimers(); void sendAvatarIdentityPacket(); From 5a2a3009c23f5780dd546a0a842c03a28f36e2db Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 15:13:31 -0700 Subject: [PATCH 451/582] don't double unregister in OctreePacketProcessor --- interface/src/octree/OctreePacketProcessor.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index a7cb1aaa66..7b0249138b 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -27,10 +27,6 @@ OctreePacketProcessor::OctreePacketProcessor() { packetReceiver.registerListenerForTypes(types, this, "handleOctreePacket"); } -OctreePacketProcessor::~OctreePacketProcessor() { - DependencyManager::get()->getPacketReceiver().unregisterListener(this); -} - void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { queueReceivedPacket(packet, senderNode); } From f45c62413fe344403b1479fc81eb19790899f5c1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 15:19:41 -0700 Subject: [PATCH 452/582] remove definition of OctreePacketProcessor dtor --- interface/src/octree/OctreePacketProcessor.h | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 3476cd383e..a783256392 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -21,7 +21,6 @@ class OctreePacketProcessor : public ReceivedPacketProcessor, public PacketListe Q_OBJECT public: OctreePacketProcessor(); - ~OctreePacketProcessor(); signals: void packetVersionMismatch(); From 85391cefbb65bd99b8e14315fbfe48ba483d3171 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 15:26:22 -0700 Subject: [PATCH 453/582] Bug fixes --- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/udt/Packet.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 9fe0648a4b..b57ea3081a 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -496,7 +496,7 @@ unsigned int LimitedNodeList::broadcastToNodes(std::unique_ptr packet, unsigned int n = 0; eachNode([&](const SharedNodePointer& node){ - if (destinationNodeTypes.contains(node->getType())) { + if (!node->getActiveSocket()->isNull() && destinationNodeTypes.contains(node->getType())) { writePacket(*packet, *node->getActiveSocket(), node->getConnectionSecret()); ++n; } diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index cfa90a43e4..f3448b15ad 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -147,7 +147,7 @@ void Packet::setPayloadSize(qint64 payloadSize) { bool Packet::reset() { if (isWritable()) { - setPayloadSize(0); + _payloadSize = 0; } return QIODevice::reset(); From 725383e43a98951c4ed570a0916ca4423d4d0b16 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 15:30:54 -0700 Subject: [PATCH 454/582] Check ptr, not addr --- libraries/networking/src/LimitedNodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index b57ea3081a..072286b9ab 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -496,7 +496,7 @@ unsigned int LimitedNodeList::broadcastToNodes(std::unique_ptr packet, unsigned int n = 0; eachNode([&](const SharedNodePointer& node){ - if (!node->getActiveSocket()->isNull() && destinationNodeTypes.contains(node->getType())) { + if (node->getActiveSocket() && destinationNodeTypes.contains(node->getType())) { writePacket(*packet, *node->getActiveSocket(), node->getConnectionSecret()); ++n; } From 8aa2892fdee4b0927676383f6bd2f6295ae3e6d9 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 15:35:13 -0700 Subject: [PATCH 455/582] Remove OctreePacketProcessor dtor --- interface/src/octree/OctreePacketProcessor.cpp | 7 ------- interface/src/octree/OctreePacketProcessor.h | 1 - 2 files changed, 8 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index fbd22db558..7b0249138b 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -27,13 +27,6 @@ OctreePacketProcessor::OctreePacketProcessor() { packetReceiver.registerListenerForTypes(types, this, "handleOctreePacket"); } -OctreePacketProcessor::~OctreePacketProcessor() { - auto nodelist = DependencyManager::get(); - if (nodelist) { - nodelist->getPacketReceiver().unregisterListener(this); - } -} - void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { queueReceivedPacket(packet, senderNode); } diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 3476cd383e..a783256392 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -21,7 +21,6 @@ class OctreePacketProcessor : public ReceivedPacketProcessor, public PacketListe Q_OBJECT public: OctreePacketProcessor(); - ~OctreePacketProcessor(); signals: void packetVersionMismatch(); From 85a5d7059c1787e90d60d6853e1b1017d4b06d6a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 15:56:31 -0700 Subject: [PATCH 456/582] fix naming of variable in timePingReply --- libraries/networking/src/NodeList.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 76148935f1..3862d5ecdc 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -138,8 +138,8 @@ void NodeList::timePingReply(QSharedPointer packet, const SharedNodePo // The other node's expected time should be our original time plus the one way flight time // anything other than that is clock skew - quint64 othersExprectedReply = ourOriginalTime + oneWayFlightTime; - int clockSkew = othersReplyTime - othersExprectedReply; + quint64 othersExpectedReply = ourOriginalTime + oneWayFlightTime; + int clockSkew = othersReplyTime - othersExpectedReply; sendingNode->setPingMs(pingTime / 1000); sendingNode->updateClockSkewUsec(clockSkew); @@ -153,7 +153,7 @@ void NodeList::timePingReply(QSharedPointer packet, const SharedNodePo " pingTime: " << pingTime << "\n" << " oneWayFlightTime: " << oneWayFlightTime << "\n" << " othersReplyTime: " << othersReplyTime << "\n" << - " othersExprectedReply: " << othersExprectedReply << "\n" << + " othersExprectedReply: " << othersExpectedReply << "\n" << " clockSkew: " << clockSkew << "\n" << " average clockSkew: " << sendingNode->getClockSkewUsec(); } From 97936c82f2a4b33ecee2d7fb7f9f5d0d1c3be172 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 15:58:05 -0700 Subject: [PATCH 457/582] add a missing library link --- libraries/render-utils/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index 7feb48a52b..9d3b4a441f 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -34,4 +34,4 @@ if (WIN32) target_include_directories(${TARGET_NAME} PUBLIC ${OGLPLUS_INCLUDE_DIRS}) endif (WIN32) -link_hifi_libraries(animation fbx shared gpu model render) +link_hifi_libraries(animation fbx shared gpu model render environment) From f065638748acc0d4edcc168686b9815925e95f3c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 15:58:14 -0700 Subject: [PATCH 458/582] Ping code cleanup --- libraries/networking/src/LimitedNodeList.cpp | 28 +++++++------------- libraries/networking/src/NodeList.cpp | 9 +++---- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 072286b9ab..06b7e299b9 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -437,43 +437,35 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingType) { int packetSize = sizeof(PingType_t) + sizeof(quint64); auto pingPacket = NLPacket::create(PacketType::Ping, packetSize); + pingPacket->writePrimitive(pingType); + pingPacket->writePrimitive(usecTimestampNow()); - QDataStream packetStream(pingPacket.get()); - - packetStream << pingType; - packetStream << usecTimestampNow(); - - return pingPacket; + return std::move(pingPacket); } std::unique_ptr LimitedNodeList::constructPingReplyPacket(NLPacket& pingPacket) { - QDataStream pingPacketStream(&pingPacket); - PingType_t typeFromOriginalPing; - pingPacketStream >> typeFromOriginalPing; - quint64 timeFromOriginalPing; - pingPacketStream >> timeFromOriginalPing; + pingPacket.readPrimitive(&typeFromOriginalPing); + pingPacket.readPrimitive(&timeFromOriginalPing); int packetSize = sizeof(PingType_t) + sizeof(quint64) + sizeof(quint64); - auto replyPacket = NLPacket::create(PacketType::PingReply, packetSize); + replyPacket->writePrimitive(typeFromOriginalPing); + replyPacket->writePrimitive(timeFromOriginalPing); + replyPacket->writePrimitive(usecTimestampNow()); - QDataStream packetStream(replyPacket.get()); - packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); - - return replyPacket; + return std::move(replyPacket); } std::unique_ptr LimitedNodeList::constructICEPingPacket(PingType_t pingType, const QUuid& iceID) { int packetSize = NUM_BYTES_RFC4122_UUID + sizeof(PingType_t); auto icePingPacket = NLPacket::create(PacketType::ICEPing, packetSize); - icePingPacket->write(iceID.toRfc4122()); icePingPacket->writePrimitive(pingType); - return icePingPacket; + return std::move(icePingPacket); } std::unique_ptr LimitedNodeList::constructICEPingReplyPacket(NLPacket& pingPacket, const QUuid& iceID) { diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 76148935f1..5a10ade654 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -125,12 +125,11 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) { } void NodeList::timePingReply(QSharedPointer packet, const SharedNodePointer& sendingNode) { - QDataStream packetStream(packet.data()); - - quint8 pingType; + PingType_t pingType; quint64 ourOriginalTime, othersReplyTime; - - packetStream >> pingType >> ourOriginalTime >> othersReplyTime; + packet->readPrimitive(&pingType); + packet->readPrimitive(&ourOriginalTime); + packet->readPrimitive(&othersReplyTime); quint64 now = usecTimestampNow(); int pingTime = now - ourOriginalTime; From 644545b965c5723ea5667f3c0dc546c4701b835b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 16:10:08 -0700 Subject: [PATCH 459/582] Seek to start of ping packet --- libraries/networking/src/NodeList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index f974bd6386..8d54e05fb6 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -127,6 +127,7 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) { void NodeList::timePingReply(QSharedPointer packet, const SharedNodePointer& sendingNode) { PingType_t pingType; quint64 ourOriginalTime, othersReplyTime; + packet->seek(0); packet->readPrimitive(&pingType); packet->readPrimitive(&ourOriginalTime); packet->readPrimitive(&othersReplyTime); From dd4c2eaccdfe0718015fcb9645d064ec23ab1311 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 16:10:32 -0700 Subject: [PATCH 460/582] add seek back for ping packet --- libraries/networking/src/LimitedNodeList.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 06b7e299b9..720bb2eee0 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -436,7 +436,9 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t std::unique_ptr LimitedNodeList::constructPingPacket(PingType_t pingType) { int packetSize = sizeof(PingType_t) + sizeof(quint64); + auto pingPacket = NLPacket::create(PacketType::Ping, packetSize); + pingPacket->writePrimitive(pingType); pingPacket->writePrimitive(usecTimestampNow()); From 00c1dce3e5325f6d702235a43642e839dfb64674 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 16:16:26 -0700 Subject: [PATCH 461/582] disconnect readyRead in LimitedNodeList dtor --- libraries/networking/src/LimitedNodeList.cpp | 4 ++++ libraries/networking/src/LimitedNodeList.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 720bb2eee0..3e9cb995ee 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -107,6 +107,10 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short _packetReceiver.registerListener(PacketType::StunResponse, this, "processSTUNResponse"); } +LimitedNodeList::~LimitedNodeList() { + disconnect(&_nodeSocket, &QUdpSocket::readyRead, 0, 0); +} + void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) { QUuid oldUUID = _sessionUUID; _sessionUUID = sessionUUID; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index a2cbac7348..7f4a3d8917 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -248,6 +248,8 @@ protected: LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton + ~LimitedNodeList(); + qint64 writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, const QUuid& connectionSecret = QUuid()); qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); From 6a02e6d001a3e503fb14eb01019f97cb387b6807 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 16:23:23 -0700 Subject: [PATCH 462/582] resolve final conflict in Application --- interface/src/Application.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 60e7c957f1..1fc0bf19b5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3952,9 +3952,6 @@ int Application::processOctreeStats(NLPacket& packet, SharedNodePointer sendingN qCDebug(interfaceapp, "stats from new %s server... [%f, %f, %f, %f]", qPrintable(serverType), (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); - } else { - jurisdiction->unlock(); - } } else { jurisdiction->unlock(); } From 8f8845d78de1930085d7e1f07bb05d11a3f4294c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 16:25:04 -0700 Subject: [PATCH 463/582] remove accidentally re-added PacketHeaders --- libraries/networking/src/PacketHeaders.cpp | 286 --------------------- 1 file changed, 286 deletions(-) delete mode 100644 libraries/networking/src/PacketHeaders.cpp diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp deleted file mode 100644 index 74b6aa55f1..0000000000 --- a/libraries/networking/src/PacketHeaders.cpp +++ /dev/null @@ -1,286 +0,0 @@ -// -// PacketHeaders.cpp -// libraries/networking/src -// -// Created by Stephen Birarda on 6/28/13. -// Copyright 2013 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 "PacketHeaders.h" - -#include - -#include - -int arithmeticCodingValueFromBuffer(const char* checkValue) { - if (((uchar) *checkValue) < 255) { - return *checkValue; - } else { - return 255 + arithmeticCodingValueFromBuffer(checkValue + 1); - } -} - -int numBytesArithmeticCodingFromBuffer(const char* checkValue) { - if (((uchar) *checkValue) < 255) { - return 1; - } else { - return 1 + numBytesArithmeticCodingFromBuffer(checkValue + 1); - } -} - -int packArithmeticallyCodedValue(int value, char* destination) { - if (value < 255) { - // less than 255, just pack our value - destination[0] = (uchar) value; - return 1; - } else { - // pack 255 and then recursively pack on - ((unsigned char*)destination)[0] = 255; - return 1 + packArithmeticallyCodedValue(value - 255, destination + 1); - } -} - -PacketVersion versionForPacketType(PacketType packetType) { - switch (packetType) { - case PacketTypeMicrophoneAudioNoEcho: - case PacketTypeMicrophoneAudioWithEcho: - return 2; - case PacketTypeSilentAudioFrame: - return 4; - case PacketTypeMixedAudio: - return 1; - case PacketTypeInjectAudio: - return 1; - case PacketTypeAvatarData: - return 7; - case PacketTypeAvatarIdentity: - return 1; - case PacketTypeEnvironmentData: - return 2; - case PacketTypeDomainList: - case PacketTypeDomainListRequest: - return 5; - case PacketTypeCreateAssignment: - case PacketTypeRequestAssignment: - return 2; - case PacketTypeOctreeStats: - return 1; - case PacketTypeStopNode: - return 1; - case PacketTypeEntityAdd: - case PacketTypeEntityEdit: - case PacketTypeEntityData: - return VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE; - case PacketTypeEntityErase: - return 2; - case PacketTypeAudioStreamStats: - return 1; - case PacketTypeIceServerHeartbeat: - case PacketTypeIceServerQuery: - return 1; - default: - return 0; - } -} - -#define PACKET_TYPE_NAME_LOOKUP(x) case x: return QString(#x); - -QString nameForPacketType(PacketType packetType) { - switch (packetType) { - PACKET_TYPE_NAME_LOOKUP(PacketTypeUnknown); - PACKET_TYPE_NAME_LOOKUP(PacketTypeStunResponse); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainList); - PACKET_TYPE_NAME_LOOKUP(PacketTypePing); - PACKET_TYPE_NAME_LOOKUP(PacketTypePingReply); - PACKET_TYPE_NAME_LOOKUP(PacketTypeKillAvatar); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAvatarData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeInjectAudio); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMixedAudio); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMicrophoneAudioNoEcho); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMicrophoneAudioWithEcho); - PACKET_TYPE_NAME_LOOKUP(PacketTypeBulkAvatarData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeSilentAudioFrame); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEnvironmentData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainListRequest); - PACKET_TYPE_NAME_LOOKUP(PacketTypeRequestAssignment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeCreateAssignment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainConnectionDenied); - PACKET_TYPE_NAME_LOOKUP(PacketTypeMuteEnvironment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAudioStreamStats); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDataServerConfirm); - PACKET_TYPE_NAME_LOOKUP(PacketTypeOctreeStats); - PACKET_TYPE_NAME_LOOKUP(PacketTypeJurisdiction); - PACKET_TYPE_NAME_LOOKUP(PacketTypeJurisdictionRequest); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAvatarIdentity); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAvatarBillboard); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainConnectRequest); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainServerRequireDTLS); - PACKET_TYPE_NAME_LOOKUP(PacketTypeNodeJsonStats); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityQuery); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityData); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityErase); - PACKET_TYPE_NAME_LOOKUP(PacketTypeOctreeDataNack); - PACKET_TYPE_NAME_LOOKUP(PacketTypeStopNode); - PACKET_TYPE_NAME_LOOKUP(PacketTypeAudioEnvironment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityEditNack); - PACKET_TYPE_NAME_LOOKUP(PacketTypeSignedTransactionPayment); - PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerHeartbeat); - PACKET_TYPE_NAME_LOOKUP(PacketTypeDomainServerAddedNode); - PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerQuery); - PACKET_TYPE_NAME_LOOKUP(PacketTypeIceServerPeerInformation); - PACKET_TYPE_NAME_LOOKUP(PacketTypeUnverifiedPing); - PACKET_TYPE_NAME_LOOKUP(PacketTypeUnverifiedPingReply); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityAdd); - PACKET_TYPE_NAME_LOOKUP(PacketTypeEntityEdit); - default: - return QString("Type: ") + QString::number((int)packetType); - } - return QString("unexpected"); -} - - - -QByteArray byteArrayWithUUIDPopulatedHeader(PacketType packetType, const QUuid& connectionUUID) { - QByteArray freshByteArray(MAX_PACKET_HEADER_BYTES, 0); - freshByteArray.resize(populatePacketHeaderWithUUID(freshByteArray, packetType, connectionUUID)); - return freshByteArray; -} - -int populatePacketHeaderWithUUID(QByteArray& packet, PacketType packetType, const QUuid& connectionUUID) { - if (packet.size() < numBytesForPacketHeaderGivenPacketType(packetType)) { - packet.resize(numBytesForPacketHeaderGivenPacketType(packetType)); - } - - return populatePacketHeaderWithUUID(packet.data(), packetType, connectionUUID); -} - -int populatePacketHeaderWithUUID(char* packet, PacketType packetType, const QUuid& connectionUUID) { - int numTypeBytes = packArithmeticallyCodedValue(packetType, packet); - packet[numTypeBytes] = versionForPacketType(packetType); - - char* position = packet + numTypeBytes + sizeof(PacketVersion); - - QByteArray rfcUUID = connectionUUID.toRfc4122(); - memcpy(position, rfcUUID.constData(), NUM_BYTES_RFC4122_UUID); - position += NUM_BYTES_RFC4122_UUID; - - if (!NON_VERIFIED_PACKETS.contains(packetType)) { - // pack 16 bytes of zeros where the md5 hash will be placed once data is packed - memset(position, 0, NUM_BYTES_MD5_HASH); - position += NUM_BYTES_MD5_HASH; - } - - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { - // Pack zeros for the number of bytes that the sequence number requires. - // The LimitedNodeList will handle packing in the sequence number when sending out the packet. - memset(position, 0, sizeof(PacketSequenceNumber)); - position += sizeof(PacketSequenceNumber); - } - - // return the number of bytes written for pointer pushing - return position - packet; -} - -int numBytesForPacketHeader(const QByteArray& packet) { - PacketType packetType = packetTypeForPacket(packet); - return numBytesForPacketHeaderGivenPacketType(packetType); -} - -int numBytesForPacketHeader(const char* packet) { - PacketType packetType = packetTypeForPacket(packet); - return numBytesForPacketHeaderGivenPacketType(packetType); -} - -int numBytesForArithmeticCodedPacketType(PacketType packetType) { - return (int) ceilf((float) packetType / 255); -} - -int numBytesForPacketHeaderGivenPacketType(PacketType packetType) { - return numBytesForArithmeticCodedPacketType(packetType) - + numHashBytesForType(packetType) - + numSequenceNumberBytesForType(packetType) - + NUM_STATIC_HEADER_BYTES; -} - -int numHashBytesForType(PacketType packetType) { - return (NON_VERIFIED_PACKETS.contains(packetType) ? 0 : NUM_BYTES_MD5_HASH); -} - -int numSequenceNumberBytesForType(PacketType packetType) { - return (SEQUENCE_NUMBERED_PACKETS.contains(packetType) ? sizeof(PacketSequenceNumber) : 0); -} - -QUuid uuidFromPacketHeader(const QByteArray& packet) { - return QUuid::fromRfc4122(packet.mid(numBytesArithmeticCodingFromBuffer(packet.data()) + sizeof(PacketVersion), - NUM_BYTES_RFC4122_UUID)); -} - -int hashOffsetForPacketType(PacketType packetType) { - return numBytesForArithmeticCodedPacketType(packetType) + NUM_STATIC_HEADER_BYTES; -} - -int sequenceNumberOffsetForPacketType(PacketType packetType) { - return numBytesForPacketHeaderGivenPacketType(packetType) - sizeof(PacketSequenceNumber); -} - -QByteArray hashFromPacketHeader(const QByteArray& packet) { - return packet.mid(hashOffsetForPacketType(packetTypeForPacket(packet)), NUM_BYTES_MD5_HASH); -} - -QByteArray hashForPacketAndConnectionUUID(const QByteArray& packet, const QUuid& connectionUUID) { - return QCryptographicHash::hash(packet.mid(numBytesForPacketHeader(packet)) + connectionUUID.toRfc4122(), - QCryptographicHash::Md5); -} - -PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType packetType) { - if (packetType == PacketTypeUnknown) { - packetType = packetTypeForPacket(packet); - } - - PacketSequenceNumber result = DEFAULT_SEQUENCE_NUMBER; - - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { - memcpy(&result, packet.data() + sequenceNumberOffsetForPacketType(packetType), sizeof(PacketSequenceNumber)); - } - - return result; -} - -void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketType packetType) { - if (packetType == PacketTypeUnknown) { - packetType = packetTypeForPacket(packet); - } - - packet.replace(hashOffsetForPacketType(packetType), NUM_BYTES_MD5_HASH, - hashForPacketAndConnectionUUID(packet, connectionUUID)); -} - -void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequenceNumber, PacketType packetType) { - if (packetType == PacketTypeUnknown) { - packetType = packetTypeForPacket(packet); - } - - packet.replace(sequenceNumberOffsetForPacketType(packetType), - sizeof(PacketSequenceNumber), reinterpret_cast(&sequenceNumber), sizeof(PacketSequenceNumber)); -} - -void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, - PacketType packetType) { - if (packetType == PacketTypeUnknown) { - packetType = packetTypeForPacket(packet); - } - - replaceHashInPacket(packet, connectionUUID, packetType); - replaceSequenceNumberInPacket(packet, sequenceNumber, packetType); -} - -PacketType packetTypeForPacket(const QByteArray& packet) { - return (PacketType) arithmeticCodingValueFromBuffer(packet.data()); -} - -PacketType packetTypeForPacket(const char* packet) { - return (PacketType) arithmeticCodingValueFromBuffer(packet); -} From 6502359f0435fa4d8b2f78523831f79b3651758a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Jul 2015 16:29:15 -0700 Subject: [PATCH 464/582] Update NodeList's PacketReceiver to be a pointer --- libraries/networking/src/LimitedNodeList.cpp | 6 +++--- libraries/networking/src/LimitedNodeList.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 072286b9ab..c0ef16e61e 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -50,7 +50,7 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short _localSockAddr(), _publicSockAddr(), _stunSockAddr(STUN_SERVER_HOSTNAME, STUN_SERVER_PORT), - _packetReceiver(this), + _packetReceiver(new PacketReceiver(this)), _numCollectedPackets(0), _numCollectedBytes(0), _packetStatTimer(), @@ -99,12 +99,12 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short // TODO: Create a new thread, and move PacketReceiver to it - connect(&_nodeSocket, &QUdpSocket::readyRead, &_packetReceiver, &PacketReceiver::processDatagrams); + connect(&_nodeSocket, &QUdpSocket::readyRead, _packetReceiver, &PacketReceiver::processDatagrams); _packetStatTimer.start(); // make sure we handle STUN response packets - _packetReceiver.registerListener(PacketType::StunResponse, this, "processSTUNResponse"); + _packetReceiver->registerListener(PacketType::StunResponse, this, "processSTUNResponse"); } void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index a2cbac7348..7f0dd1eae9 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -117,7 +117,7 @@ public: bool packetSourceAndHashMatch(const NLPacket& packet, SharedNodePointer& matchingNode); - PacketReceiver& getPacketReceiver() { return _packetReceiver; } + PacketReceiver& getPacketReceiver() { return *_packetReceiver; } qint64 sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode); qint64 sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr, @@ -276,7 +276,7 @@ protected: HifiSockAddr _publicSockAddr; HifiSockAddr _stunSockAddr; - PacketReceiver _packetReceiver; + PacketReceiver* _packetReceiver; // XXX can BandwidthRecorder be used for this? int _numCollectedPackets; From ce5bcb8de1feb2f31ef63d76002f310f2f9a2165 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 15 Jul 2015 16:33:04 -0700 Subject: [PATCH 465/582] Check ptr --- libraries/networking/src/PacketReceiver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 49115e1004..e9480a4c75 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -182,7 +182,7 @@ void PacketReceiver::processDatagrams() { auto nodeList = DependencyManager::get(); - while (nodeList->getNodeSocket().hasPendingDatagrams()) { + while (nodeList && nodeList->getNodeSocket().hasPendingDatagrams()) { // setup a buffer to read the packet into int packetSizeWithHeader = nodeList->getNodeSocket().pendingDatagramSize(); std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); From 3cba3d0dcd8d7cf8255c942be6b0d92fe1cd7abc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 16:33:12 -0700 Subject: [PATCH 466/582] fix packet receiver cleanup --- libraries/networking/src/LimitedNodeList.cpp | 4 ---- libraries/networking/src/LimitedNodeList.h | 2 -- libraries/networking/src/PacketReceiver.cpp | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 3e9cb995ee..720bb2eee0 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -107,10 +107,6 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short _packetReceiver.registerListener(PacketType::StunResponse, this, "processSTUNResponse"); } -LimitedNodeList::~LimitedNodeList() { - disconnect(&_nodeSocket, &QUdpSocket::readyRead, 0, 0); -} - void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) { QUuid oldUUID = _sessionUUID; _sessionUUID = sessionUUID; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 7f4a3d8917..a2cbac7348 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -248,8 +248,6 @@ protected: LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton - ~LimitedNodeList(); - qint64 writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, const QUuid& connectionSecret = QUuid()); qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 49115e1004..e9480a4c75 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -182,7 +182,7 @@ void PacketReceiver::processDatagrams() { auto nodeList = DependencyManager::get(); - while (nodeList->getNodeSocket().hasPendingDatagrams()) { + while (nodeList && nodeList->getNodeSocket().hasPendingDatagrams()) { // setup a buffer to read the packet into int packetSizeWithHeader = nodeList->getNodeSocket().pendingDatagramSize(); std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); From 273e92f1fda9b05c9ae5a2bf4be35f9842eeaf57 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 16:34:00 -0700 Subject: [PATCH 467/582] pass correct size for audio read --- libraries/audio/src/InboundAudioStream.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 8d2e917c4b..9520e281d0 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -133,7 +133,8 @@ int InboundAudioStream::parseData(NLPacket& packet) { if (packet.getType() == PacketType::SilentAudioFrame) { writeDroppableSilentSamples(networkSamples); } else { - int audioBytes = parseAudioData(packet.getType(), QByteArray::fromRawData(packet.getPayload(), packet.pos()), + int audioBytes = parseAudioData(packet.getType(), QByteArray::fromRawData(packet.getPayload(), + packet.bytesLeftToRead()), networkSamples); packet.seek(packet.pos() + audioBytes); } From 9318f464a43f7ab8095a897856db4740235b6b3b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 16:42:58 -0700 Subject: [PATCH 468/582] fix position of read in InboundAudioStream --- libraries/audio/src/InboundAudioStream.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 9520e281d0..b7c5febb50 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -113,7 +113,7 @@ int InboundAudioStream::parseData(NLPacket& packet) { // parse the info after the seq number and before the audio data (the stream properties) int propertyBytes = parseStreamProperties(packet.getType(), - QByteArray::fromRawData(packet.getPayload(), packet.bytesLeftToRead()), + QByteArray::fromRawData(packet.getPayload() + packet.pos(), packet.bytesLeftToRead()), networkSamples); packet.seek(packet.pos() + propertyBytes); @@ -133,7 +133,7 @@ int InboundAudioStream::parseData(NLPacket& packet) { if (packet.getType() == PacketType::SilentAudioFrame) { writeDroppableSilentSamples(networkSamples); } else { - int audioBytes = parseAudioData(packet.getType(), QByteArray::fromRawData(packet.getPayload(), + int audioBytes = parseAudioData(packet.getType(), QByteArray::fromRawData(packet.getPayload() + packet.pos(), packet.bytesLeftToRead()), networkSamples); packet.seek(packet.pos() + audioBytes); From 333cd77d9cf94eeb1c889d457c1e3313f8b61110 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 17:20:02 -0700 Subject: [PATCH 469/582] cleanup call to parseAudioData --- libraries/audio-client/src/AudioClient.cpp | 4 ++-- libraries/audio/src/InboundAudioStream.cpp | 7 ++++--- libraries/networking/src/udt/Packet.cpp | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 42829e2521..908310d504 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -934,12 +934,12 @@ void AudioClient::handleAudioInput() { // pack the orientation _audioPacket->writePrimitive(headOrientation); - + if (_audioPacket->getType() != PacketType::SilentAudioFrame) { // audio samples have already been packed (written to networkAudioSamples) _audioPacket->setPayloadSize(_audioPacket->getPayloadSize() + numNetworkBytes); } - + _stats.sentPacket(); nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendAudioPacket); diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index b7c5febb50..deb12a6649 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -100,7 +100,7 @@ void InboundAudioStream::perSecondCallbackForUpdatingStats() { } int InboundAudioStream::parseData(NLPacket& packet) { - + // parse sequence number and track it quint16 sequence; packet.readPrimitive(&sequence); @@ -133,8 +133,9 @@ int InboundAudioStream::parseData(NLPacket& packet) { if (packet.getType() == PacketType::SilentAudioFrame) { writeDroppableSilentSamples(networkSamples); } else { - int audioBytes = parseAudioData(packet.getType(), QByteArray::fromRawData(packet.getPayload() + packet.pos(), - packet.bytesLeftToRead()), + int audioBytes = parseAudioData(packet.getType(), + QByteArray::fromRawData(packet.getPayload() + packet.pos(), + packet.bytesLeftToRead()), networkSamples); packet.seek(packet.pos() + audioBytes); } diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index f3448b15ad..56c5a1c389 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -138,7 +138,7 @@ Packet& Packet::operator=(Packet&& other) { void Packet::setPayloadSize(qint64 payloadSize) { if (isWritable()) { Q_ASSERT(payloadSize <= _payloadCapacity); - _payloadSize = std::max(payloadSize, _payloadCapacity); + _payloadSize = payloadSize; } else { qDebug() << "You can not call setPayloadSize for a non-writeable Packet."; Q_ASSERT(false); From 863cc3390a265a701d2fec1e049f9d13a5bfc2b2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 17:41:00 -0700 Subject: [PATCH 470/582] fix send of mixed audio stream packet from AM --- assignment-client/src/audio/AudioMixer.cpp | 2 +- assignment-client/src/audio/AvatarAudioStream.cpp | 2 +- libraries/networking/src/NodeList.cpp | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 215459bc2b..fe24812783 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -777,7 +777,7 @@ void AudioMixer::run() { std::unique_ptr mixPacket; if (streamsMixed > 0) { - int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO * sizeof(int16_t); + int mixPacketBytes = sizeof(quint16) + AudioConstants::NETWORK_FRAME_BYTES_STEREO; mixPacket = NLPacket::create(PacketType::MixedAudio, mixPacketBytes); // pack sequence number diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index fc14bcede6..4c71777d01 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -48,7 +48,7 @@ int AvatarAudioStream::parseStreamProperties(PacketType::Value type, const QByte // read the positional data readBytes += parsePositionalData(packetAfterSeqNum.mid(readBytes)); - + // calculate how many samples are in this packet int numAudioBytes = packetAfterSeqNum.size() - readBytes; numAudioSamples = numAudioBytes / sizeof(int16_t); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 8d54e05fb6..002484a54c 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -126,8 +126,11 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) { void NodeList::timePingReply(QSharedPointer packet, const SharedNodePointer& sendingNode) { PingType_t pingType; + quint64 ourOriginalTime, othersReplyTime; + packet->seek(0); + packet->readPrimitive(&pingType); packet->readPrimitive(&ourOriginalTime); packet->readPrimitive(&othersReplyTime); From 1752d5e7ca87c8d294c78b85dd6a0f97023ac7ed Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 17:52:37 -0700 Subject: [PATCH 471/582] fix mix packet sample copy bug --- assignment-client/src/audio/AudioMixer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index fe24812783..b68332210b 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -786,7 +786,7 @@ void AudioMixer::run() { // pack mixed audio samples mixPacket->write(reinterpret_cast(_mixSamples), - AudioConstants::NETWORK_FRAME_BYTES_STEREO * sizeof(int16_t)); + AudioConstants::NETWORK_FRAME_BYTES_STEREO); } else { int silentPacketBytes = sizeof(quint16) + sizeof(quint16); mixPacket = NLPacket::create(PacketType::SilentAudioFrame, silentPacketBytes); From 000232a55d838cddb43ce8c21979d1b61b71f19f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 17:59:37 -0700 Subject: [PATCH 472/582] fix copied packet buffer creation --- libraries/networking/src/udt/Packet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 56c5a1c389..0a174a2820 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -106,7 +106,7 @@ Packet& Packet::operator=(const Packet& other) { _type = other._type; _packetSize = other._packetSize; - _packet = std::unique_ptr(new char(_packetSize)); + _packet = std::unique_ptr(new char[_packetSize]); memcpy(_packet.get(), other._packet.get(), _packetSize); _payloadStart = _packet.get() + (other._payloadStart - other._packet.get()); From 6fa17dafffab54833b7ebb7e10f894758ba7b546 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 18:27:43 -0700 Subject: [PATCH 473/582] open packets for write with ReadWrite --- libraries/networking/src/NLPacket.cpp | 2 +- libraries/networking/src/udt/Packet.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 5d996fc9b8..c34e589eff 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -41,7 +41,7 @@ std::unique_ptr NLPacket::create(PacketType::Value type, qint64 size) packet = std::unique_ptr(new NLPacket(type, size)); } - packet->open(QIODevice::WriteOnly); + packet->open(QIODevice::ReadWrite); return packet; } diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 0a174a2820..6abb87f861 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -24,7 +24,7 @@ qint64 Packet::maxPayloadSize(PacketType::Value type) { std::unique_ptr Packet::create(PacketType::Value type, qint64 size) { auto packet = std::unique_ptr(new Packet(type, size)); - packet->open(QIODevice::WriteOnly); + packet->open(QIODevice::ReadWrite); return packet; } From 039ef0750cec00789db2bf4dda49e98ff53c2ee2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 15 Jul 2015 18:52:59 -0700 Subject: [PATCH 474/582] set jurisdiction listener object name for thread identification --- libraries/networking/src/ReceivedPacketProcessor.cpp | 1 - libraries/octree/src/JurisdictionListener.cpp | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/ReceivedPacketProcessor.cpp b/libraries/networking/src/ReceivedPacketProcessor.cpp index 15b46cdf8f..cc516bdbbd 100644 --- a/libraries/networking/src/ReceivedPacketProcessor.cpp +++ b/libraries/networking/src/ReceivedPacketProcessor.cpp @@ -39,7 +39,6 @@ bool ReceivedPacketProcessor::process() { quint64 now = usecTimestampNow(); quint64 sinceLastWindow = now - _lastWindowAt; - if (sinceLastWindow > USECS_PER_SECOND) { lock(); float secondsSinceLastWindow = sinceLastWindow / USECS_PER_SECOND; diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index 0fe67d046d..4979972c8a 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -20,6 +20,8 @@ JurisdictionListener::JurisdictionListener(NodeType_t type) : _nodeType(type), _packetSender(JurisdictionListener::DEFAULT_PACKETS_PER_SECOND) { + setObjectName("Jurisdiction Listener"); + connect(DependencyManager::get().data(), &NodeList::nodeKilled, this, &JurisdictionListener::nodeKilled); // tell our NodeList we want to hear about nodes with our node type @@ -34,7 +36,7 @@ void JurisdictionListener::nodeKilled(SharedNodePointer node) { bool JurisdictionListener::queueJurisdictionRequest() { auto packet = NLPacket::create(PacketType::JurisdictionRequest, 0); - + auto nodeList = DependencyManager::get(); int nodeCount = 0; From c6f6dbd8458cf5521fd225cf83b67d2bd93bd01b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 09:59:15 -0700 Subject: [PATCH 475/582] Fix QByteArray from rqw data --- assignment-client/src/AssignmentClientMonitor.cpp | 2 +- assignment-client/src/avatars/AvatarMixerClientData.cpp | 4 +++- libraries/avatars/src/AvatarHashMap.cpp | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 9190b9be3e..0a39d80a61 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -203,7 +203,7 @@ void AssignmentClientMonitor::checkSpares() { } void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { - QUuid senderID = QUuid::fromRfc4122(QByteArray::fromRawData(packet->getData(), NUM_BYTES_RFC4122_UUID)); + QUuid senderID = QUuid::fromRfc4122(QByteArray::fromRawData(packet->getPayload(), NUM_BYTES_RFC4122_UUID)); auto nodeList = DependencyManager::get(); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 00ec6ad220..de2e1ac143 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -15,7 +15,9 @@ int AvatarMixerClientData::parseData(NLPacket& packet) { // compute the offset to the data payload - return _avatar.parseDataFromBuffer(QByteArray::fromRawData(packet.getPayload(), packet.getPayloadSize())); + QByteArray byteArray = QByteArray::fromRawData(packet.getPayload() + packet.pos(), + packet.bytesLeftToRead()); + return _avatar.parseDataFromBuffer(byteArray); } bool AvatarMixerClientData::checkAndSetHasReceivedFirstPackets() { diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 2ad997c306..3243ff3f9a 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -61,6 +61,8 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha while (packet->bytesLeftToRead()) { QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); + QByteArray byteArray = QByteArray::fromRawData(packet->getPayload() + packet->pos(), + packet->bytesLeftToRead()); if (sessionUUID != _lastOwnerSessionUUID) { AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { @@ -68,12 +70,12 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha } // have the matching (or new) avatar parse the data from the packet - int bytesRead = avatar->parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->pos())); + int bytesRead = avatar->parseDataFromBuffer(byteArray); packet->seek(packet->pos() + bytesRead); } else { // create a dummy AvatarData class to throw this data on the ground AvatarData dummyData; - int bytesRead = dummyData.parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->pos())); + int bytesRead = dummyData.parseDataFromBuffer(byteArray); packet->seek(packet->pos() + bytesRead); } } From 8424e91ae18d042dd881762f97e41b61c61df00b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 10:00:01 -0700 Subject: [PATCH 476/582] Added sequence number to packets --- libraries/networking/src/LimitedNodeList.cpp | 52 +++++++++++--------- libraries/networking/src/LimitedNodeList.h | 1 + libraries/networking/src/udt/Packet.h | 4 +- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 720bb2eee0..a43b8b089d 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -216,6 +216,20 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod return false; } +qint64 LimitedNodeList::writePacket(const NLPacket& packet, const Node& destinationNode) { + if (!destinationNode.getActiveSocket()) { + return 0; + } + + // TODO Move to transport layer when ready + if (SEQUENCE_NUMBERED_PACKETS.contains(packet.getType())) { + PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode.getUUID(), packet.getType()); + const_cast(packet).writeSequenceNumber(sequenceNumber); + } + + return writePacket(packet, *destinationNode.getActiveSocket(), destinationNode.getConnectionSecret()); +} + qint64 LimitedNodeList::writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, const QUuid& connectionSecret) { if (!NON_SOURCED_PACKETS.contains(packet.getType())) { @@ -248,14 +262,7 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSock } qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode) { - const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); - if (!activeSocket) { - // we don't have a socket to send to, return 0 - return 0; - } - - // use the node's active socket as the destination socket - return sendUnreliablePacket(packet, *activeSocket, destinationNode.getConnectionSecret()); + return writePacket(packet, destinationNode); } qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr, @@ -264,30 +271,29 @@ qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiS } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& destinationNode) { - const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); - if (!activeSocket) { - // we don't have a socket to send to, return 0 - return 0; - } - - // use the node's active socket as the destination socket - return sendPacket(std::move(packet), *activeSocket, destinationNode.getConnectionSecret()); + // Keep unique_ptr alive during write + auto result = writePacket(*packet, destinationNode); + return result; } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr, const QUuid& connectionSecret) { - return writePacket(*packet, sockAddr, connectionSecret); + // Keep unique_ptr alive during write + auto result = writePacket(*packet, sockAddr, connectionSecret); + return result; } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { - const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); - if (!activeSocket) { - // we don't have a socket to send to, return 0 - return 0; + qint64 bytesSent = 0; + + // close the last packet in the list + packetList.closeCurrentPacket(); + + while (!packetList._packets.empty()) { + bytesSent += sendPacket(std::move(packetList.takeFront()), destinationNode); } - // use the node's active socket as the destination socket - return sendPacketList(packetList, *activeSocket, destinationNode.getConnectionSecret()); + return bytesSent; } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr, diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index a2cbac7348..f3acb81ef1 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -248,6 +248,7 @@ protected: LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton + qint64 writePacket(const NLPacket& packet, const Node& destinationNode); qint64 writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, const QUuid& connectionSecret = QUuid()); qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 1d499e2b00..740fa7f663 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -66,7 +66,8 @@ public: HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } - + + void writeSequenceNumber(SequenceNumber seqNum); SequenceNumber readSequenceNumber() const; bool readIsControlPacket() const; @@ -98,7 +99,6 @@ protected: // Header writers void writePacketTypeAndVersion(PacketType::Value type); - void writeSequenceNumber(SequenceNumber seqNum); PacketType::Value _type; // Packet type PacketVersion _version; // Packet version From ae8e79750b3eda23a8c13b203c870dc2ac589455 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 10:00:54 -0700 Subject: [PATCH 477/582] Stop ping timer in handle node kill --- libraries/networking/src/LimitedNodeList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a43b8b089d..46682d60fb 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -401,6 +401,7 @@ void LimitedNodeList::processKillNode(NLPacket& packet) { void LimitedNodeList::handleNodeKill(const SharedNodePointer& node) { qCDebug(networking) << "Killed" << *node; + node->stopPingTimer(); emit nodeKilled(node); } From bf637f8f18de55bdf43ca7345f87ee31b7bc38ae Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 10:50:05 -0700 Subject: [PATCH 478/582] Fix broadcast to nodes --- libraries/networking/src/LimitedNodeList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 46682d60fb..badfbef60a 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -497,8 +497,8 @@ unsigned int LimitedNodeList::broadcastToNodes(std::unique_ptr packet, unsigned int n = 0; eachNode([&](const SharedNodePointer& node){ - if (node->getActiveSocket() && destinationNodeTypes.contains(node->getType())) { - writePacket(*packet, *node->getActiveSocket(), node->getConnectionSecret()); + if (node && destinationNodeTypes.contains(node->getType())) { + writePacket(*packet, *node); ++n; } }); From 336967e580b5923ce44f1ae3661bb60a71cf6f4b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 11:17:49 -0700 Subject: [PATCH 479/582] fix edit packet sending from client --- .../src/octree/OctreePacketProcessor.cpp | 2 +- libraries/networking/src/PacketReceiver.cpp | 73 ++++++++++++++++--- libraries/networking/src/PacketReceiver.h | 13 +++- libraries/networking/src/PacketSender.cpp | 6 +- .../octree/src/OctreeEditPacketSender.cpp | 25 ++++--- 5 files changed, 90 insertions(+), 29 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 7b0249138b..9558df196c 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -24,7 +24,7 @@ OctreePacketProcessor::OctreePacketProcessor() { PacketType::EntityErase, PacketType::OctreeStats, PacketType::EnvironmentData }; - packetReceiver.registerListenerForTypes(types, this, "handleOctreePacket"); + packetReceiver.registerDirectListenerForTypes(types, this, "handleOctreePacket"); } void OctreePacketProcessor::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index e9480a4c75..daa1e08d9d 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -24,7 +24,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : qRegisterMetaType>(); } -void PacketReceiver::registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot) { +bool PacketReceiver::registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot) { QSet nonSourcedTypes; QSet sourcedTypes; @@ -41,20 +41,45 @@ void PacketReceiver::registerListenerForTypes(const QSet& typ if (nonSourcedTypes.size() > 0) { QMetaMethod nonSourcedMethod = matchingMethodForListener(*nonSourcedTypes.begin(), object, slot); - foreach(PacketType::Value type, nonSourcedTypes) { - registerVerifiedListener(type, object, nonSourcedMethod); + if (nonSourcedMethod.isValid()) { + foreach(PacketType::Value type, nonSourcedTypes) { + registerVerifiedListener(type, object, nonSourcedMethod); + } + } else { + return false; } } if (sourcedTypes.size() > 0) { QMetaMethod sourcedMethod = matchingMethodForListener(*sourcedTypes.begin(), object, slot); - foreach(PacketType::Value type, sourcedTypes) { - registerVerifiedListener(type, object, sourcedMethod); + if (sourcedMethod.isValid()) { + foreach(PacketType::Value type, sourcedTypes) { + registerVerifiedListener(type, object, sourcedMethod); + } + } else { + return false; } } + + return true; +} + + +void PacketReceiver::registerDirectListenerForTypes(const QSet& types, + PacketListener* listener, const char* slot) { + // just call register listener for types to start + bool success = registerListenerForTypes(types, listener, slot); + if (success) { + _directConnectSetMutex.lock(); + + // if we successfully registered, add this object to the set of objects that are directly connected + _directlyConnectedObjects.insert(dynamic_cast(listener)); + + _directConnectSetMutex.unlock(); + } } -void PacketReceiver::registerListener(PacketType::Value type, PacketListener* listener, const char* slot) { +bool PacketReceiver::registerListener(PacketType::Value type, PacketListener* listener, const char* slot) { QObject* object = dynamic_cast(listener); Q_ASSERT(object); @@ -62,6 +87,9 @@ void PacketReceiver::registerListener(PacketType::Value type, PacketListener* li if (matchingMethod.isValid()) { registerVerifiedListener(type, object, matchingMethod); + return true; + } else { + return false; } } @@ -134,12 +162,14 @@ void PacketReceiver::registerVerifiedListener(PacketType::Value type, QObject* o } void PacketReceiver::unregisterListener(PacketListener* listener) { + QObject* listenerObject = dynamic_cast(listener); + _packetListenerLock.lock(); auto it = _packetListenerMap.begin(); while (it != _packetListenerMap.end()) { - if (it.value().first == dynamic_cast(listener)) { + if (it.value().first == listenerObject) { // this listener matches - erase it it = _packetListenerMap.erase(it); } else { @@ -148,6 +178,10 @@ void PacketReceiver::unregisterListener(PacketListener* listener) { } _packetListenerLock.unlock(); + + _directConnectSetMutex.lock(); + _directlyConnectedObjects.remove(listenerObject); + _directConnectSetMutex.unlock(); } bool PacketReceiver::packetVersionMatch(const NLPacket& packet) { @@ -227,6 +261,15 @@ void PacketReceiver::processDatagrams() { if (listener.first) { bool success = false; + + // check if this is a directly connected listener + _directConnectSetMutex.lock(); + + Qt::ConnectionType connectionType = + _directlyConnectedObjects.contains(listener.first) ? Qt::DirectConnection : Qt::AutoConnection; + + _directConnectSetMutex.unlock(); + PacketType::Value packetType = packet->getType(); if (matchingNode) { @@ -244,17 +287,23 @@ void PacketReceiver::processDatagrams() { if (metaMethod.parameterTypes().contains(SHARED_NODE_NORMALIZED)) { success = metaMethod.invoke(listener.first, - Q_ARG(QSharedPointer, QSharedPointer(packet.release())), - Q_ARG(SharedNodePointer, matchingNode)); + connectionType, + Q_ARG(QSharedPointer, + QSharedPointer(packet.release())), + Q_ARG(SharedNodePointer, matchingNode)); } else if (metaMethod.parameterTypes().contains(QSHAREDPOINTER_NODE_NORMALIZED)) { success = metaMethod.invoke(listener.first, - Q_ARG(QSharedPointer, QSharedPointer(packet.release())), - Q_ARG(QSharedPointer, matchingNode)); + connectionType, + Q_ARG(QSharedPointer, + QSharedPointer(packet.release())), + Q_ARG(QSharedPointer, matchingNode)); } else { success = metaMethod.invoke(listener.first, - Q_ARG(QSharedPointer, QSharedPointer(packet.release()))); + connectionType, + Q_ARG(QSharedPointer, + QSharedPointer(packet.release()))); } } else { emit dataReceived(NodeType::Unassigned, packet->getDataSize()); diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 3d4cd18946..1bf31b30b1 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -22,6 +22,7 @@ #include "NLPacket.h" #include "udt/PacketHeaders.h" +class OctreePacketProcessor; class PacketListener; class PacketReceiver : public QObject { @@ -39,8 +40,8 @@ public: void resetCounters() { _inPacketCount = 0; _inByteCount = 0; } - void registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot); - void registerListener(PacketType::Value type, PacketListener* listener, const char* slot); + bool registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot); + bool registerListener(PacketType::Value type, PacketListener* listener, const char* slot); void unregisterListener(PacketListener* listener); public slots: @@ -52,6 +53,10 @@ signals: void packetVersionMismatch(PacketType::Value type); 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); + bool packetVersionMatch(const NLPacket& packet); QMetaMethod matchingMethodForListener(PacketType::Value type, QObject* object, const char* slot) const; @@ -64,6 +69,10 @@ private: int _inPacketCount = 0; int _inByteCount = 0; bool _shouldDropPackets = false; + QMutex _directConnectSetMutex; + QSet _directlyConnectedObjects; + + friend class OctreePacketProcessor; }; #endif // hifi_PacketReceiver_h diff --git a/libraries/networking/src/PacketSender.cpp b/libraries/networking/src/PacketSender.cpp index ee3d09cb75..14737dfb8d 100644 --- a/libraries/networking/src/PacketSender.cpp +++ b/libraries/networking/src/PacketSender.cpp @@ -49,13 +49,13 @@ PacketSender::~PacketSender() { void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, std::unique_ptr packet) { + _totalPacketsQueued++; + _totalBytesQueued += packet->getDataSize(); + lock(); _packets.push_back({destinationNode, std::move(packet)}); unlock(); - _totalPacketsQueued++; - _totalBytesQueued += packet->getDataSize(); - // Make sure to wake our actual processing thread because we now have packets for it to process. _hasPackets.wakeAll(); } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index e8a618de26..8fc13b440d 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -110,7 +110,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, std::uniqu // add packet to history _sentPacketHistories[nodeUUID].packetSent(sequence, *packet); - queuePacketForSending(node, std::move(packet)); + queuePacketForSending(node, NLPacket::createCopy(*packet)); } }); } @@ -251,7 +251,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, QByt std::unique_ptr& bufferedPacket = _pendingEditPackets[nodeUUID]; if (!bufferedPacket) { - bufferedPacket = NLPacket::create(type); + bufferedPacket = std::move(NLPacket::create(type)); } else { // If we're switching type, then we send the last one and start over if ((type != bufferedPacket->getType() && bufferedPacket->getPayloadSize() > 0) || @@ -291,15 +291,18 @@ void OctreeEditPacketSender::releaseQueuedMessages() { _releaseQueuedMessagesPending = true; } else { _packetsQueueLock.lock(); - for (auto i = _pendingEditPackets.begin(); i != _pendingEditPackets.end(); i++) { - // construct a null unique_ptr to an NL packet - std::unique_ptr releasedPacket; - - // swap the null ptr with the packet we want to release - i->second.swap(releasedPacket); - - // move and release the queued packet - releaseQueuedPacket(i->first, std::move(releasedPacket)); + for (auto& i : _pendingEditPackets) { + if (i.second) { + // construct a null unique_ptr to an NL packet + std::unique_ptr releasedPacket; + + // swap the null ptr with the packet we want to release + i.second.swap(releasedPacket); + + // move and release the queued packet + releaseQueuedPacket(i.first, std::move(releasedPacket)); + } + } _packetsQueueLock.unlock(); } From 8921f59e23fc9c5c7e42b78d66cbef301180a656 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 12:09:35 -0700 Subject: [PATCH 480/582] fix entity packet send from interface client --- .../src/octree/OctreeInboundPacketProcessor.cpp | 4 ++-- libraries/entities/src/EntityItemProperties.cpp | 12 ++++-------- libraries/entities/src/EntityItemProperties.h | 2 +- libraries/entities/src/EntityTree.cpp | 3 ++- libraries/octree/src/OctreeEditPacketSender.cpp | 2 +- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 3542c7c40d..d70afa4e04 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -128,7 +128,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet } if (debugProcessPacket) { - qDebug() << " numBytesPacketHeader=" << packet->localHeaderSize(); + qDebug() << " numBytesPacketHeader=" << packet->totalHeadersSize(); qDebug() << " sizeof(sequence)=" << sizeof(sequence); qDebug() << " sizeof(sentAt)=" << sizeof(sentAt); } @@ -143,7 +143,7 @@ void OctreeInboundPacketProcessor::processPacket(QSharedPointer packet } const unsigned char* editData = nullptr; - + while (packet->bytesLeftToRead() > 0) { editData = reinterpret_cast(packet->getPayload() + packet->pos()); diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 6e6a9eb0a8..61253ba6ba 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -900,14 +900,11 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType::Value command, Ent // // TODO: Implement support for script and visible properties. // -bool EntityItemProperties::decodeEntityEditPacket(NLPacket& packet, int& processedBytes, +bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes, EntityItemID& entityID, EntityItemProperties& properties) { bool valid = false; - const unsigned char* data = reinterpret_cast(packet.getPayload()); const unsigned char* dataAt = data; - - int bytesToRead = packet.getPayloadSize(); processedBytes = 0; // the first part of the data is an octcode, this is a required element of the edit packet format, but we don't @@ -933,10 +930,9 @@ bool EntityItemProperties::decodeEntityEditPacket(NLPacket& packet, int& process // 2) if the edit is to a new entity, the created time is the last edited time // encoded id - QByteArray encodedID((const char*)dataAt, NUM_BYTES_RFC4122_UUID); // maximum possible size - QUuid editID = QUuid::fromRfc4122(encodedID); - dataAt += encodedID.size(); - processedBytes += encodedID.size(); + QUuid editID = QUuid::fromRfc4122(QByteArray::fromRawData(reinterpret_cast(dataAt), NUM_BYTES_RFC4122_UUID)); + dataAt += NUM_BYTES_RFC4122_UUID; + processedBytes += NUM_BYTES_RFC4122_UUID; entityID = editID; valid = true; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index f9a4d499d2..4532ffd67b 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -179,7 +179,7 @@ public: static bool encodeEraseEntityMessage(const EntityItemID& entityItemID, QByteArray& buffer); - static bool decodeEntityEditPacket(NLPacket& packet, int& processedBytes, + static bool decodeEntityEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes, EntityItemID& entityID, EntityItemProperties& properties); bool glowLevelChanged() const { return _glowLevelChanged; } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 61bbde6f1a..d5f2026978 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -598,7 +598,8 @@ int EntityTree::processEditPacketData(NLPacket& packet, const unsigned char* edi EntityItemID entityItemID; EntityItemProperties properties; startDecode = usecTimestampNow(); - bool validEditPacket = EntityItemProperties::decodeEntityEditPacket(packet, processedBytes, + + bool validEditPacket = EntityItemProperties::decodeEntityEditPacket(editData, maxLength, processedBytes, entityItemID, properties); endDecode = usecTimestampNow(); diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 8fc13b440d..4df172008f 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -251,7 +251,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType::Value type, QByt std::unique_ptr& bufferedPacket = _pendingEditPackets[nodeUUID]; if (!bufferedPacket) { - bufferedPacket = std::move(NLPacket::create(type)); + bufferedPacket = initializePacket(type, node->getClockSkewUsec()); } else { // If we're switching type, then we send the last one and start over if ((type != bufferedPacket->getType() && bufferedPacket->getPayloadSize() > 0) || From 1d1962d5f5a449e88dfab1274ecf42761bc48e5f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 16 Jul 2015 12:10:28 -0700 Subject: [PATCH 481/582] Fix avatar data processing --- libraries/avatars/src/AvatarHashMap.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 2ad997c306..83706ee9f4 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -68,12 +68,12 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha } // have the matching (or new) avatar parse the data from the packet - int bytesRead = avatar->parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->pos())); + int bytesRead = avatar->parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->getPayloadSize())); packet->seek(packet->pos() + bytesRead); } else { // create a dummy AvatarData class to throw this data on the ground AvatarData dummyData; - int bytesRead = dummyData.parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->pos())); + int bytesRead = dummyData.parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->getPayloadSize())); packet->seek(packet->pos() + bytesRead); } } From 3d6b2467822c54dc2a52780946551a28c7751de6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 12:18:27 -0700 Subject: [PATCH 482/582] check version against version in OPP --- interface/src/octree/OctreePacketProcessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 9558df196c..5fbc3101c4 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -71,7 +71,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer packet, Share PacketType::Value packetType = packet->getType(); // check version of piggyback packet against expected version - if (packetType != versionForPacketType(packet->getType())) { + if (packet->getVersion() != versionForPacketType(packet->getType())) { static QMultiMap versionDebugSuppressMap; const QUuid& senderUUID = packet->getSourceID(); From 60ae02e4e91e1444a218596ea3f54353d6d12320 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 12:38:39 -0700 Subject: [PATCH 483/582] some formatting changes in entities --- libraries/entities/src/EntityEditPacketSender.cpp | 2 +- libraries/entities/src/EntityEditPacketSender.h | 2 +- libraries/octree/src/Octree.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 9375208ac8..ee2eacfed2 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -1,6 +1,6 @@ // // EntityEditPacketSender.cpp -// libraries/models/src +// libraries/entities/src // // Created by Brad Hefta-Gaub on 8/12/13. // Copyright 2013 High Fidelity, Inc. diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 2a982fecec..ac278daecd 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -1,6 +1,6 @@ // // EntityEditPacketSender.h -// libraries/models/src +// libraries/entities/src // // Created by Brad Hefta-Gaub on 8/12/13. // Copyright 2013 High Fidelity, Inc. diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 810bfa6097..288f6fa1ae 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -391,7 +391,7 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch } void Octree::readBitstreamToTree(const unsigned char * bitstream, unsigned long int bufferSizeBytes, - ReadBitstreamToTreeParams& args) { + ReadBitstreamToTreeParams& args) { int bytesRead = 0; const unsigned char* bitstreamAt = bitstream; From 05dd49a4c5c73da8038eaccd3f86123ae7124291 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 13:02:20 -0700 Subject: [PATCH 484/582] seek back after track of octree packet --- interface/src/octree/OctreePacketProcessor.cpp | 3 +++ libraries/octree/src/OctreeRenderer.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 5fbc3101c4..8b55c4ccd9 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -89,6 +89,9 @@ void OctreePacketProcessor::processPacket(QSharedPointer packet, Share } app->trackIncomingOctreePacket(*packet, sendingNode, wasStatsPacket); + + // seek back to beginning of packet after tracking + packet->seek(0); switch(packetType) { case PacketType::EntityErase: { diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 44130edf25..ce9bd1e3fd 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -67,7 +67,7 @@ void OctreeRenderer::processDatagram(NLPacket& packet, SharedNodePointer sourceN PerformanceWarning warn(showTimingDetails, "OctreeRenderer::processDatagram expected PacketType", showTimingDetails); // if we are getting inbound packets, then our tree is also viewing, and we should remember that fact. _tree->setIsViewing(true); - + OCTREE_PACKET_FLAGS flags; packet.readPrimitive(&flags); From b4121eb464adf6a154535fb2120e3d77c5d512fe Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 13:14:17 -0700 Subject: [PATCH 485/582] Remove unnecessary move --- interface/src/Application.cpp | 2 +- libraries/entities/src/EntityTree.cpp | 2 +- libraries/networking/src/LimitedNodeList.cpp | 4 ++-- libraries/networking/src/NLPacketList.cpp | 2 +- libraries/networking/src/udt/PacketList.cpp | 4 ++-- libraries/networking/src/udt/PacketList.h | 2 +- libraries/octree/src/JurisdictionMap.cpp | 4 ++-- libraries/octree/src/OctreeEditPacketSender.cpp | 3 +-- libraries/shared/src/GLMHelpers.cpp | 2 +- 9 files changed, 12 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f61f725c4e..b03df3a1cc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1797,7 +1797,7 @@ void Application::sendPingPackets() { return false; } }, [nodeList](const SharedNodePointer& node) { - nodeList->sendPacket(std::move(nodeList->constructPingPacket()), *node); + nodeList->sendPacket(nodeList->constructPingPacket(), *node); }); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index d5f2026978..ba2691aa3b 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -826,7 +826,7 @@ std::unique_ptr EntityTree::encodeEntitiesDeletedSince(OCTREE_PACKET_S deletesPacket->seek(numberOfIDsPos); deletesPacket->writePrimitive(numberOfIDs); - return std::move(deletesPacket); + return deletesPacket; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index badfbef60a..4a15602f95 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -290,7 +290,7 @@ qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& des packetList.closeCurrentPacket(); while (!packetList._packets.empty()) { - bytesSent += sendPacket(std::move(packetList.takeFront()), destinationNode); + bytesSent += sendPacket(packetList.takeFront(), destinationNode); } return bytesSent; @@ -304,7 +304,7 @@ qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockA packetList.closeCurrentPacket(); while (!packetList._packets.empty()) { - bytesSent += sendPacket(std::move(packetList.takeFront()), sockAddr, connectionSecret); + bytesSent += sendPacket(packetList.takeFront(), sockAddr, connectionSecret); } return bytesSent; diff --git a/libraries/networking/src/NLPacketList.cpp b/libraries/networking/src/NLPacketList.cpp index 85b413eda9..7ac9fe11c3 100644 --- a/libraries/networking/src/NLPacketList.cpp +++ b/libraries/networking/src/NLPacketList.cpp @@ -17,6 +17,6 @@ NLPacketList::NLPacketList(PacketType::Value packetType) : PacketList(packetType } std::unique_ptr NLPacketList::createPacket() { - return std::move(NLPacket::create(getType())); + return NLPacket::create(getType()); } diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 4036e872fd..9e3921e325 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -31,7 +31,7 @@ void PacketList::endSegment() { std::unique_ptr PacketList::createPacket() { // use the static create method to create a new packet - return std::move(Packet::create(getType())); + return Packet::create(getType()); } std::unique_ptr PacketList::createPacketWithExtendedHeader() { @@ -46,7 +46,7 @@ std::unique_ptr PacketList::createPacketWithExtendedHeader() { } } - return std::move(packet); + return packet; } qint64 PacketList::writeData(const char* data, qint64 maxSize) { diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index f4b542155a..0a1bdd080a 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -80,7 +80,7 @@ template std::unique_ptr PacketList::takeFront() { auto packet = std::move(_packets.front()); _packets.pop_front(); - return std::move(std::unique_ptr(dynamic_cast(packet.release()))); + return std::unique_ptr(dynamic_cast(packet.release())); } #endif // hifi_PacketList_h \ No newline at end of file diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 64e8a7bca5..255652a3cc 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -260,7 +260,7 @@ std::unique_ptr JurisdictionMap::packEmptyJurisdictionIntoMessage(Node // No root or end node details to pack! packet->writePrimitive(bytes); - return std::move(packet); // includes header! + return packet; // includes header! } std::unique_ptr JurisdictionMap::packIntoPacket() { @@ -295,7 +295,7 @@ std::unique_ptr JurisdictionMap::packIntoPacket() { packet->writePrimitive(bytes); } - return std::move(packet); + return packet; } int JurisdictionMap::unpackFromPacket(NLPacket& packet) { diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 4df172008f..30e1630e36 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -121,8 +121,7 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { // First send out all the single message packets... _pendingPacketsLock.lock(); while (!_preServerSingleMessagePackets.empty()) { - std::unique_ptr packet = std::move(_preServerSingleMessagePackets.front()); - queuePacketToNodes(std::move(packet)); + queuePacketToNodes(std::move(_preServerSingleMessagePackets.front())); _preServerSingleMessagePackets.pop_front(); } diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp index 53b3b90560..d5b2917369 100644 --- a/libraries/shared/src/GLMHelpers.cpp +++ b/libraries/shared/src/GLMHelpers.cpp @@ -327,7 +327,7 @@ glm::vec2 toGlm(const QPointF & pt) { glm::vec3 toGlm(const xColor & color) { static const float MAX_COLOR = 255.0f; - return std::move(glm::vec3(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR)); + return glm::vec3(color.red, color.green, color.blue) / MAX_COLOR; } glm::vec4 toGlm(const QColor & color) { From 76d47eb4e7401a8479279fd031f795c9d7a56cbb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 13:22:18 -0700 Subject: [PATCH 486/582] mark the DataServerConfirm packet unused --- libraries/networking/src/udt/PacketHeaders.cpp | 1 - libraries/networking/src/udt/PacketHeaders.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index ccbd56c674..9a39b6f5eb 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -135,7 +135,6 @@ QString nameForPacketType(PacketType::Value packetType) { PACKET_TYPE_NAME_LOOKUP(DomainConnectionDenied); PACKET_TYPE_NAME_LOOKUP(MuteEnvironment); PACKET_TYPE_NAME_LOOKUP(AudioStreamStats); - PACKET_TYPE_NAME_LOOKUP(DataServerConfirm); PACKET_TYPE_NAME_LOOKUP(OctreeStats); PACKET_TYPE_NAME_LOOKUP(Jurisdiction); PACKET_TYPE_NAME_LOOKUP(JurisdictionRequest); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index a133654b05..5f63a2c840 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -48,7 +48,7 @@ namespace PacketType { DomainConnectionDenied, MuteEnvironment, AudioStreamStats, - DataServerConfirm, // 20 + UNUSED, // 20 DomainServerPathQuery, DomainServerPathResponse, DomainServerAddedNode, From 5d84d2ec3072853b63ad200ccba90e6dbd69e84a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 13:39:14 -0700 Subject: [PATCH 487/582] add port to current address if not default --- libraries/networking/src/AddressManager.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 21bbbc82f6..2b9b8d42fb 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -548,7 +548,13 @@ void AddressManager::setHost(const QString& host, LookupTrigger trigger) { void AddressManager::setDomainInfo(const QString& hostname, quint16 port, LookupTrigger trigger) { - setHost(hostname, trigger); + + QString domainHostString = hostname; + if (port != DEFAULT_DOMAIN_SERVER_PORT) { + domainHostString.append(QString(":%1").arg(port)); + } + + setHost(domainHostString, trigger); _rootPlaceID = QUuid(); From ed928e8a6b3c33bacab9a7321f6e2c4dfe56c365 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 13:52:18 -0700 Subject: [PATCH 488/582] actual fix for AddressManager address with port --- libraries/networking/src/AddressManager.cpp | 32 ++++++++++----------- libraries/networking/src/AddressManager.h | 8 +++--- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 2b9b8d42fb..3f3234a307 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -30,10 +30,7 @@ const QString SETTINGS_CURRENT_ADDRESS_KEY = "address"; Setting::Handle currentAddressHandle(QStringList() << ADDRESS_MANAGER_SETTINGS_GROUP << "address", DEFAULT_HIFI_ADDRESS); AddressManager::AddressManager() : - _host(), - _rootPlaceID(), - _positionGetter(NULL), - _orientationGetter(NULL) + _port(0) { } @@ -47,6 +44,11 @@ const QUrl AddressManager::currentAddress() const { hifiURL.setScheme(HIFI_URL_SCHEME); hifiURL.setHost(_host); + + if (_port != 0 && _port != DEFAULT_DOMAIN_SERVER_PORT) { + hifiURL.setPort(_port); + } + hifiURL.setPath(currentPath()); return hifiURL; @@ -535,26 +537,24 @@ bool AddressManager::handleUsername(const QString& lookupString) { return false; } -void AddressManager::setHost(const QString& host, LookupTrigger trigger) { - if (host != _host) { - +void AddressManager::setHost(const QString& host, LookupTrigger trigger, quint16 port) { + if (host != _host || port != _port) { + + _port = port; + // if the host is being changed we should store current address in the history addCurrentAddressToHistory(trigger); - _host = host; - emit hostChanged(_host); + if (host != _host) { + _host = host; + emit hostChanged(_host); + } } } void AddressManager::setDomainInfo(const QString& hostname, quint16 port, LookupTrigger trigger) { - - QString domainHostString = hostname; - if (port != DEFAULT_DOMAIN_SERVER_PORT) { - domainHostString.append(QString(":%1").arg(port)); - } - - setHost(domainHostString, trigger); + setHost(hostname, trigger, port); _rootPlaceID = QUuid(); diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index def9eb6042..fbb895795b 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -58,7 +58,6 @@ public: const QString& getHost() const { return _host; } - void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; } void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; } @@ -109,7 +108,7 @@ private slots: void goToAddressFromObject(const QVariantMap& addressMap, const QNetworkReply& reply); private: - void setHost(const QString& host, LookupTrigger trigger); + void setHost(const QString& host, LookupTrigger trigger, quint16 port = 0); void setDomainInfo(const QString& hostname, quint16 port, LookupTrigger trigger); const JSONCallbackParameters& apiCallbackParameters(); @@ -129,9 +128,10 @@ private: void addCurrentAddressToHistory(LookupTrigger trigger); QString _host; + quint16 _port; QUuid _rootPlaceID; - PositionGetter _positionGetter; - OrientationGetter _orientationGetter; + PositionGetter _positionGetter { nullptr }; + OrientationGetter _orientationGetter { nullptr }; QStack _backStack; QStack _forwardStack; From 00fbff112f102925fa23db2c9194407b56628e1a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 14:03:11 -0700 Subject: [PATCH 489/582] Process avatar data --- libraries/avatars/src/AvatarHashMap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 3243ff3f9a..0dbc1a5e46 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -22,7 +22,7 @@ AvatarHashMap::AvatarHashMap() { connect(DependencyManager::get().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); + packetReceiver.registerListener(PacketType::AvatarData, this, "processAvatarDataPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); From f8f47f99c659bb8dd48daac6aab32c0f8f02fd49 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 16 Jul 2015 14:03:36 -0700 Subject: [PATCH 490/582] Temporarily disable body lean in avatar --- libraries/avatars/src/AvatarData.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 5d439b4aec..dc6f507c0d 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -166,10 +166,10 @@ QByteArray AvatarData::toByteArray() { destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalYaw()); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalRoll()); - // Body lean - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanForward); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanSideways); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_torsoTwist); + // // Body lean + // destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanForward); + // destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanSideways); + // destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_torsoTwist); // Lookat Position memcpy(destinationBuffer, &_headData->_lookAtPosition, sizeof(_headData->_lookAtPosition)); From b561014d775003bbf94efa8c4212214e941fdf22 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 16 Jul 2015 14:11:36 -0700 Subject: [PATCH 491/582] Add head-lean reading back into AvatarData --- libraries/avatars/src/AvatarData.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index dc6f507c0d..c5e4946b9c 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -166,10 +166,10 @@ QByteArray AvatarData::toByteArray() { destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalYaw()); destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalRoll()); - // // Body lean - // destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanForward); - // destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanSideways); - // destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_torsoTwist); + // Body lean + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanForward); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanSideways); + destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_torsoTwist); // Lookat Position memcpy(destinationBuffer, &_headData->_lookAtPosition, sizeof(_headData->_lookAtPosition)); @@ -371,6 +371,22 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { _headData->setBaseRoll(headRoll); } // 6 bytes + { // Head lean (relative to pelvis) + float leanForward, leanSideways, torsoTwist; + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &leanForward); + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &leanSideways); + sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &torsoTwist); + if (glm::isnan(leanForward) || glm::isnan(leanSideways)) { + if (shouldLogError(now)) { + qCDebug(avatars) << "Discard nan AvatarData::leanForward,leanSideways,torsoTwise; displayName = '" << _displayName << "'"; + } + return maxAvailableSize; + } + _headData->_leanForward = leanForward; + _headData->_leanSideways = leanSideways; + _headData->_torsoTwist = torsoTwist; + } // 6 bytes + { // Lookat Position glm::vec3 lookAt; memcpy(&lookAt, sourceBuffer, sizeof(lookAt)); From f31675c4c69a4598a5117637384af11301fb0a78 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 14:21:37 -0700 Subject: [PATCH 492/582] fix ice-server packets --- domain-server/src/DomainServer.cpp | 3 +- ice-server/src/IceServer.cpp | 36 ++++++++++---------- ice-server/src/IceServer.h | 3 +- libraries/networking/src/DomainHandler.cpp | 12 +++---- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/PacketReceiver.cpp | 4 +-- 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index a709986fc7..34ca61dfa8 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -288,7 +288,8 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { packetReceiver.registerListener(PacketType::NodeJsonStats, this, "processNodeJSONStatsPacket"); packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); - + packetReceiver.registerListener(PacketType::ICEServerPeerInformation, this, "processICEPeerInformationPacket"); + // add whatever static assignments that have been parsed to the queue addStaticAssignmentsToQueue(); } diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 7cb22cad3c..d2a2b09568 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -46,23 +46,26 @@ IceServer::IceServer(int argc, char* argv[]) : void IceServer::processDatagrams() { HifiSockAddr sendingSockAddr; - QByteArray incomingPacket; while (_serverSocket.hasPendingDatagrams()) { - incomingPacket.resize(_serverSocket.pendingDatagramSize()); + // setup a buffer to read the packet into + int packetSizeWithHeader = _serverSocket.pendingDatagramSize(); + std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); - _serverSocket.readDatagram(incomingPacket.data(), incomingPacket.size(), + _serverSocket.readDatagram(buffer.get(), packetSizeWithHeader, sendingSockAddr.getAddressPointer(), sendingSockAddr.getPortPointer()); + + auto packet = Packet::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, sendingSockAddr); - PacketType::Value packetType = packetTypeForPacket(incomingPacket); + PacketType::Value packetType = packet->getType(); if (packetType == PacketType::ICEServerHeartbeat) { - SharedNetworkPeer peer = addOrUpdateHeartbeatingPeer(incomingPacket); + SharedNetworkPeer peer = addOrUpdateHeartbeatingPeer(*packet); // so that we can send packets to the heartbeating peer when we need, we need to activate a socket now peer->activateMatchingOrNewSymmetricSocket(sendingSockAddr); } else if (packetType == PacketType::ICEServerQuery) { - QDataStream heartbeatStream(incomingPacket); + QDataStream heartbeatStream(packet.get()); // this is a node hoping to connect to a heartbeating peer - do we have the heartbeating peer? QUuid senderUUID; @@ -70,15 +73,12 @@ void IceServer::processDatagrams() { // pull the public and private sock addrs for this peer HifiSockAddr publicSocket, localSocket; - - heartbeatStream.skipRawData(numBytesForPacketHeader(incomingPacket)); - heartbeatStream >> publicSocket >> localSocket; // check if this node also included a UUID that they would like to connect to QUuid connectRequestID; heartbeatStream >> connectRequestID; - + SharedNetworkPeer matchingPeer = _activePeers.value(connectRequestID); if (matchingPeer) { @@ -95,16 +95,16 @@ void IceServer::processDatagrams() { } } -SharedNetworkPeer IceServer::addOrUpdateHeartbeatingPeer(const QByteArray& incomingPacket) { - QUuid senderUUID = uuidFromPacketHeader(incomingPacket); +SharedNetworkPeer IceServer::addOrUpdateHeartbeatingPeer(Packet& packet) { - // pull the public and private sock addrs for this peer + // pull the UUID, public and private sock addrs for this peer + QUuid senderUUID; HifiSockAddr publicSocket, localSocket; - QDataStream hearbeatStream(incomingPacket); - hearbeatStream.skipRawData(numBytesForPacketHeader(incomingPacket)); - - hearbeatStream >> publicSocket >> localSocket; + QDataStream heartbeatStream(&packet); + + heartbeatStream >> senderUUID; + heartbeatStream >> publicSocket >> localSocket; // make sure we have this sender in our peer hash SharedNetworkPeer matchingPeer = _activePeers.value(senderUUID); @@ -132,7 +132,7 @@ void IceServer::sendPeerInformationPacket(const NetworkPeer& peer, const HifiSoc // get the byte array for this peer peerPacket->write(peer.toByteArray()); - + // write the current packet _serverSocket.writeDatagram(peerPacket->getData(), peerPacket->getDataSize(), destinationSockAddr->getAddress(), destinationSockAddr->getPort()); diff --git a/ice-server/src/IceServer.h b/ice-server/src/IceServer.h index 1f213fa606..7820ae2e22 100644 --- a/ice-server/src/IceServer.h +++ b/ice-server/src/IceServer.h @@ -19,6 +19,7 @@ #include #include #include +#include typedef QHash NetworkPeerHash; @@ -32,7 +33,7 @@ private slots: void clearInactivePeers(); private: - SharedNetworkPeer addOrUpdateHeartbeatingPeer(const QByteArray& incomingPacket); + SharedNetworkPeer addOrUpdateHeartbeatingPeer(Packet& incomingPacket); void sendPeerInformationPacket(const NetworkPeer& peer, const HifiSockAddr* destinationSockAddr); QUuid _id; diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index d959cee897..afb362053e 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -136,7 +136,10 @@ void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, if (id != _uuid) { // re-set the domain info to connect to new domain hardReset(); - + + // refresh our ICE client UUID to something new + _iceClientID = QUuid::createUuid(); + _iceDomainID = id; HifiSockAddr* replaceableSockAddr = &_iceServerSockAddr; @@ -154,10 +157,6 @@ void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, completedIceServerHostnameLookup(); } - - // refresh our ICE client UUID to something new - _iceClientID = QUuid::createUuid(); - qCDebug(networking) << "ICE required to connect to domain via ice server at" << iceServerHostname; } } @@ -313,7 +312,8 @@ void DomainHandler::processDTLSRequirementPacket(QSharedPointer dtlsRe } void DomainHandler::processICEResponsePacket(QSharedPointer icePacket) { - if (!_icePeer.hasSockets()) { + if (_icePeer.hasSockets()) { + qDebug() << "Received an ICE peer packet for domain-server but we already have sockets. Not processing."; // bail on processing this packet if our ice peer doesn't have sockets return; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index badfbef60a..82ab1970c0 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -788,7 +788,7 @@ void LimitedNodeList::sendPacketToIceServer(PacketType::Value packetType, const QDataStream iceDataStream(icePacket.get()); iceDataStream << clientID << _publicSockAddr << _localSockAddr; - + if (packetType == PacketType::ICEServerQuery) { assert(!peerID.isNull()); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index daa1e08d9d..9689ac1308 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -235,7 +235,7 @@ void PacketReceiver::processDatagrams() { // setup an NLPacket from the data we just read auto packet = NLPacket::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, senderSockAddr); - + _inPacketCount++; _inByteCount += packetSizeWithHeader; @@ -271,7 +271,7 @@ void PacketReceiver::processDatagrams() { _directConnectSetMutex.unlock(); PacketType::Value packetType = packet->getType(); - + if (matchingNode) { // if this was a sequence numbered packet we should store the last seq number for // a packet of this type for this node From 010cbd9934ba2dd4cb99ebe7faff5193a6c4b3e8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 14:42:16 -0700 Subject: [PATCH 493/582] don't handle octree query while server shutting down --- assignment-client/src/octree/OctreeServer.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 1cd59d804f..f493decae9 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -813,14 +813,16 @@ void OctreeServer::parsePayload() { } void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode) { - // If we got a query packet, then we're talking to an agent, and we - // need to make sure we have it in our nodeList. - auto nodeList = DependencyManager::get(); - nodeList->updateNodeWithDataFromPacket(packet, senderNode); - - OctreeQueryNode* nodeData = dynamic_cast(senderNode->getLinkedData()); - if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - nodeData->initializeOctreeSendThread(this, senderNode); + if (!_isFinished) { + // If we got a query packet, then we're talking to an agent, and we + // need to make sure we have it in our nodeList. + auto nodeList = DependencyManager::get(); + nodeList->updateNodeWithDataFromPacket(packet, senderNode); + + OctreeQueryNode* nodeData = dynamic_cast(senderNode->getLinkedData()); + if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + nodeData->initializeOctreeSendThread(this, senderNode); + } } } From b1d240defdb96c0b7c576ba6fb1eb83f55d8bfda Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 14:43:57 -0700 Subject: [PATCH 494/582] add extra debug to IceServer --- ice-server/src/IceServer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index d2a2b09568..f56fe9202f 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -82,6 +82,9 @@ void IceServer::processDatagrams() { SharedNetworkPeer matchingPeer = _activePeers.value(connectRequestID); if (matchingPeer) { + + qDebug() << "Sending information for peer" << connectRequestID << "to peer" << senderUUID; + // we have the peer they want to connect to - send them pack the information for that peer sendPeerInformationPacket(*(matchingPeer.data()), &sendingSockAddr); @@ -90,6 +93,8 @@ void IceServer::processDatagrams() { NetworkPeer dummyPeer(senderUUID, publicSocket, localSocket); sendPeerInformationPacket(dummyPeer, matchingPeer->getActiveSocket()); + } else { + qDebug() << "Peer" << senderUUID << "asked for" << connectRequestID << "but no matching peer found"; } } } From 56886e479d6ef479297fe5139aa2c46aecb33a05 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 15:28:53 -0700 Subject: [PATCH 495/582] Use BulkAvatarData packet type for AvatarMixer upstrea --- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- libraries/avatars/src/AvatarHashMap.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index ebfb0709d7..9b0af75b07 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -219,7 +219,7 @@ void AvatarMixer::broadcastAvatarData() { } // setup a PacketList for the avatarPackets - NLPacketList avatarPacketList(PacketType::AvatarData); + NLPacketList avatarPacketList(PacketType::BulkAvatarData); // this is an AGENT we have received head data from // send back a packet with other active node data to this node diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 0dbc1a5e46..3243ff3f9a 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -22,7 +22,7 @@ AvatarHashMap::AvatarHashMap() { connect(DependencyManager::get().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerListener(PacketType::AvatarData, this, "processAvatarDataPacket"); + packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); From 29f91267d9c038b231a66d5ef71a505b4ee607e0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 15:29:50 -0700 Subject: [PATCH 496/582] repairs to nack packet receiving for entity-server --- .../octree/OctreeInboundPacketProcessor.cpp | 6 ++++-- .../src/octree/OctreeQueryNode.cpp | 18 ++++-------------- assignment-client/src/octree/OctreeQueryNode.h | 2 +- assignment-client/src/octree/OctreeServer.cpp | 2 +- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index d70afa4e04..fe61a3945c 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -250,7 +250,7 @@ int OctreeInboundPacketProcessor::sendNackPackets() { QUuid nodeUUID = i.key(); SingleSenderStats nodeStats = i.value(); - + // check if this node is still alive. Remove its stats if it's dead. if (!isAlive(nodeUUID)) { i = _singleSenderStats.erase(i); @@ -260,7 +260,7 @@ int OctreeInboundPacketProcessor::sendNackPackets() { // if there are packets from _node that are waiting to be processed, // don't send a NACK since the missing packets may be among those waiting packets. if (hasPacketsToProcessFrom(nodeUUID)) { - i++; + ++i; continue; } @@ -290,6 +290,8 @@ int OctreeInboundPacketProcessor::sendNackPackets() { // send the list of nack packets nodeList->sendPacketList(nackPacketList, *destinationNode); } + + ++i; } return packetsSent; diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index c8330209ce..6395397c51 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -374,21 +374,11 @@ const NLPacket* OctreeQueryNode::getNextNackedPacket() { return nullptr; } -void OctreeQueryNode::parseNackPacket(const QByteArray& packet) { - - int numBytesPacketHeader = numBytesForPacketHeader(packet); - const unsigned char* dataAt = reinterpret_cast(packet.data()) + numBytesPacketHeader; - - // TODO: This no longer has the number of sequence numbers - just read to the end of the packet in sequence number blocks - - // read number of sequence numbers - uint16_t numSequenceNumbers = (*(uint16_t*)dataAt); - dataAt += sizeof(uint16_t); - +void OctreeQueryNode::parseNackPacket(NLPacket& packet) { // read sequence numbers - for (int i = 0; i < numSequenceNumbers; i++) { - OCTREE_PACKET_SEQUENCE sequenceNumber = (*(OCTREE_PACKET_SEQUENCE*)dataAt); + while (packet.bytesLeftToRead()) { + OCTREE_PACKET_SEQUENCE sequenceNumber; + packet.readPrimitive(&sequenceNumber); _nackedSequenceNumbers.enqueue(sequenceNumber); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); } } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index d752b8d0e8..5982eeb4bc 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -108,7 +108,7 @@ public: OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } - void parseNackPacket(const QByteArray& packet); + void parseNackPacket(NLPacket& packet); bool hasNextNackedPacket() const; const NLPacket* getNextNackedPacket(); diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index f493decae9..f5d599b5d3 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -831,7 +831,7 @@ void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, S // need to make sure we have it in our nodeList. OctreeQueryNode* nodeData = dynamic_cast(senderNode->getLinkedData()); if (nodeData) { - nodeData->parseNackPacket(packet->getData()); + nodeData->parseNackPacket(*packet); } } From c5047ec76dfdc7e5c1745a50d6ed96b3d2215c08 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 15:47:25 -0700 Subject: [PATCH 497/582] fix sequence number packing for audio injector --- libraries/audio/src/AudioInjector.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index e24cf2d575..9f8b8217ac 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -214,6 +214,11 @@ void AudioInjector::injectToMixer() { (AudioConstants::MAX_SAMPLE_VALUE / 2.0f); } _loudness /= (float)(bytesToCopy / sizeof(int16_t)); + + audioPacket->seek(0); + + // pack the sequence number + audioPacket->writePrimitive(outgoingInjectedAudioSequenceNumber); audioPacket->seek(positionOptionOffset); audioPacket->writePrimitive(_options.position); @@ -225,9 +230,6 @@ void AudioInjector::injectToMixer() { audioPacket->seek(audioDataOffset); - // pack the sequence number - audioPacket->writePrimitive(outgoingInjectedAudioSequenceNumber); - // copy the next NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL bytes to the packet audioPacket->write(_audioData.data() + _currentSendPosition, bytesToCopy); From a6641908fb41cfc98ab00612513836aea2c6077d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 15:49:15 -0700 Subject: [PATCH 498/582] check if audio mixer is alive before packet send --- libraries/audio/src/AudioInjector.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 9f8b8217ac..90dee1cc7e 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -238,10 +238,12 @@ void AudioInjector::injectToMixer() { // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); - - // send off this audio packet - nodeList->sendUnreliablePacket(*audioPacket, *audioMixer); - outgoingInjectedAudioSequenceNumber++; + + if (audioMixer) { + // send off this audio packet + nodeList->sendUnreliablePacket(*audioPacket, *audioMixer); + outgoingInjectedAudioSequenceNumber++; + } _currentSendPosition += bytesToCopy; From eb5fdd7214f0b9e831d277b2dbb30dbdefdddfd4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 15:57:19 -0700 Subject: [PATCH 499/582] clear unused types and push version to 10 --- .../networking/src/udt/PacketHeaders.cpp | 41 +------------------ libraries/networking/src/udt/PacketHeaders.h | 6 --- 2 files changed, 1 insertion(+), 46 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 9a39b6f5eb..06a231202b 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -64,50 +64,12 @@ int packArithmeticallyCodedValue(int value, char* destination) { PacketVersion versionForPacketType(PacketType::Value packetType) { switch (packetType) { - case MicrophoneAudioNoEcho: - case MicrophoneAudioWithEcho: - return 3; - case SilentAudioFrame: - return 5; - case MixedAudio: - return 2; - case InjectAudio: - return 2; - case AvatarData: - return 7; - case AvatarIdentity: - return 2; - case EnvironmentData: - return 3; - case DomainList: - case DomainListRequest: - return 6; - case DomainConnectRequest: - return 2; - case CreateAssignment: - case RequestAssignment: - return 3; - case OctreeStats: - return 2; - case OctreeDataNack: - return 2; - case StopNode: - return 2; case EntityAdd: case EntityEdit: case EntityData: return VERSION_ENTITIES_NEW_PROTOCOL_LAYER; - case EntityEditNack: - return 2; - case EntityErase: - return 3; - case AudioStreamStats: - return 2; - case ICEServerHeartbeat: - case ICEServerQuery: - return 2; default: - return 1; + return 10; } } @@ -150,7 +112,6 @@ QString nameForPacketType(PacketType::Value packetType) { PACKET_TYPE_NAME_LOOKUP(StopNode); PACKET_TYPE_NAME_LOOKUP(AudioEnvironment); PACKET_TYPE_NAME_LOOKUP(EntityEditNack); - PACKET_TYPE_NAME_LOOKUP(SignedTransactionPayment); PACKET_TYPE_NAME_LOOKUP(ICEServerHeartbeat); PACKET_TYPE_NAME_LOOKUP(DomainServerAddedNode); PACKET_TYPE_NAME_LOOKUP(ICEServerQuery); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 5f63a2c840..7a2b28742b 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -48,7 +48,6 @@ namespace PacketType { DomainConnectionDenied, MuteEnvironment, AudioStreamStats, - UNUSED, // 20 DomainServerPathQuery, DomainServerPathResponse, DomainServerAddedNode, @@ -58,11 +57,7 @@ namespace PacketType { Jurisdiction, JurisdictionRequest, AssignmentClientStatus, - UNUSED_7, // 30 - UNUSED_8, - UNUSED_9, NoisyMute, - UNUSED_10, AvatarIdentity, // 35 AvatarBillboard, DomainConnectRequest, @@ -77,7 +72,6 @@ namespace PacketType { StopNode, AudioEnvironment, EntityEditNack, - SignedTransactionPayment, ICEServerHeartbeat, // 50 ICEPing, ICEPingReply From 83f98a3e575b4032f8612c397818b1a55306f746 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 15:58:18 -0700 Subject: [PATCH 500/582] remove line number comment for enum --- libraries/networking/src/udt/PacketHeaders.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 7a2b28742b..98ac739a07 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -28,22 +28,22 @@ namespace PacketType { enum Value { - Unknown, // 0 + Unknown, StunResponse, DomainList, Ping, PingReply, - KillAvatar, // 5 + KillAvatar, AvatarData, InjectAudio, MixedAudio, MicrophoneAudioNoEcho, - MicrophoneAudioWithEcho, // 10 + MicrophoneAudioWithEcho, BulkAvatarData, SilentAudioFrame, EnvironmentData, DomainListRequest, - RequestAssignment, // 15 + RequestAssignment, CreateAssignment, DomainConnectionDenied, MuteEnvironment, @@ -52,27 +52,27 @@ namespace PacketType { DomainServerPathResponse, DomainServerAddedNode, ICEServerPeerInformation, - ICEServerQuery, // 25 + ICEServerQuery, OctreeStats, Jurisdiction, JurisdictionRequest, AssignmentClientStatus, NoisyMute, - AvatarIdentity, // 35 + AvatarIdentity, AvatarBillboard, DomainConnectRequest, DomainServerRequireDTLS, NodeJsonStats, - EntityQuery, // 40 + EntityQuery, EntityData, EntityAdd, EntityErase, EntityEdit, - OctreeDataNack, // 45 + OctreeDataNack, StopNode, AudioEnvironment, EntityEditNack, - ICEServerHeartbeat, // 50 + ICEServerHeartbeat, ICEPing, ICEPingReply }; From 648f9868f0ce457794822555d2222ca9f299c1e9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 15:58:34 -0700 Subject: [PATCH 501/582] add back space in PacketHeaders --- libraries/networking/src/udt/PacketHeaders.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 98ac739a07..efd047190c 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -77,6 +77,7 @@ namespace PacketType { ICEPingReply }; }; + const int MAX_PACKET_SIZE = 1450; typedef char PacketVersion; From 61653bd88d4a8925794939fc69ad9b0359683140 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:04:12 -0700 Subject: [PATCH 502/582] remove old PacketHeader methods --- .../entities/src/EntityEditPacketSender.cpp | 4 +-- .../entities/src/EntityEditPacketSender.h | 2 +- .../networking/src/udt/PacketHeaders.cpp | 26 ------------------ libraries/networking/src/udt/PacketHeaders.h | 10 ------- .../octree/src/OctreeEditPacketSender.cpp | 27 ++++++------------- libraries/octree/src/OctreeEditPacketSender.h | 2 +- 6 files changed, 12 insertions(+), 59 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index ee2eacfed2..4dab854d13 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -22,9 +22,9 @@ EntityEditPacketSender::EntityEditPacketSender() { packetReceiver.registerListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); } -void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet) { +void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet, SharedNodePointer sendingNode) { if (_shouldNack) { - processNackPacket(QByteArray::fromRawData(packet->getData(), packet->getDataSize())); + processNackPacket(*packet, sendingNode); } } diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index ac278daecd..85f21a9954 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -37,7 +37,7 @@ public: virtual void adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew); public slots: - void processEntityEditNackPacket(QSharedPointer packet); + void processEntityEditNackPacket(QSharedPointer packet, SharedNodePointer sendingNode); void toggleNackPackets() { _shouldNack = !_shouldNack; } private: diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 06a231202b..bf831ef370 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -155,32 +155,6 @@ int numSequenceNumberBytesForType(PacketType::Value packetType) { return (SEQUENCE_NUMBERED_PACKETS.contains(packetType) ? sizeof(PacketSequenceNumber) : 0); } -QUuid uuidFromPacketHeader(const QByteArray& packet) { - return QUuid::fromRfc4122(packet.mid(numBytesArithmeticCodingFromBuffer(packet.data()) + sizeof(PacketVersion), - NUM_BYTES_RFC4122_UUID)); -} - -int hashOffsetForPacketType(PacketType::Value packetType) { - return numBytesForArithmeticCodedPacketType(packetType) + NUM_STATIC_HEADER_BYTES; -} - -int sequenceNumberOffsetForPacketType(PacketType::Value packetType) { - return numBytesForPacketHeaderGivenPacketType(packetType) - sizeof(PacketSequenceNumber); -} - -PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType) { - if (packetType == PacketType::Unknown) { - packetType = packetTypeForPacket(packet); - } - - PacketSequenceNumber result = DEFAULT_SEQUENCE_NUMBER; - - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { - memcpy(&result, packet.data() + sequenceNumberOffsetForPacketType(packetType), sizeof(PacketSequenceNumber)); - } - - return result; -} PacketType::Value packetTypeForPacket(const QByteArray& packet) { return (PacketType::Value) arithmeticCodingValueFromBuffer(packet.data()); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index efd047190c..8ab73a9554 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -112,16 +112,6 @@ int numBytesForArithmeticCodedPacketType(PacketType::Value packetType); int numBytesForPacketHeaderGivenPacketType(PacketType::Value packetType); int packArithmeticallyCodedValue(int value, char* destination); -QUuid uuidFromPacketHeader(const QByteArray& packet); - -int hashOffsetForPacketType(PacketType::Value packetType); -int sequenceNumberOffsetForPacketType(PacketType::Value packetType); - -// NOTE: The following four methods accept a PacketType::Value which defaults to PacketType::Unknown. -// If the caller has already looked at the packet type and can provide it then the methods below won't have to look it up. - -PacketSequenceNumber sequenceNumberFromHeader(const QByteArray& packet, PacketType::Value packetType = PacketType::Unknown); - int arithmeticCodingValueFromBuffer(const char* checkValue); int numBytesArithmeticCodingFromBuffer(const char* checkValue); diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 30e1630e36..6875e31d1e 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -339,35 +339,24 @@ bool OctreeEditPacketSender::process() { return PacketSender::process(); } -void OctreeEditPacketSender::processNackPacket(const QByteArray& packet) { +void OctreeEditPacketSender::processNackPacket(NLPacket& packet, SharedNodePointer sendingNode) { // parse sending node from packet, retrieve packet history for that node - QUuid sendingNodeUUID = uuidFromPacketHeader(packet); // if packet history doesn't exist for the sender node (somehow), bail - if (_sentPacketHistories.count(sendingNodeUUID) == 0) { + if (_sentPacketHistories.count(sendingNode->getUUID()) == 0) { return; } - const SentPacketHistory& sentPacketHistory = _sentPacketHistories[sendingNodeUUID]; - - // TODO: these NAK packets no longer send the number of sequence numbers - just read out sequence numbers in blocks - - int numBytesPacketHeader = numBytesForPacketHeader(packet); - const unsigned char* dataAt = reinterpret_cast(packet.data()) + numBytesPacketHeader; - - // read number of sequence numbers - uint16_t numSequenceNumbers = (*(uint16_t*)dataAt); - dataAt += sizeof(uint16_t); + const SentPacketHistory& sentPacketHistory = _sentPacketHistories[sendingNode->getSourceID()]; // read sequence numbers and queue packets for resend - for (int i = 0; i < numSequenceNumbers; i++) { - unsigned short int sequenceNumber = (*(unsigned short int*)dataAt); - dataAt += sizeof(unsigned short int); - + while (packet.bytesLeftToRead() > 0) { + unsigned short int sequenceNumber; + packet.readPrimitive(&sequenceNumber); + // retrieve packet from history const NLPacket* packet = sentPacketHistory.getPacket(sequenceNumber); if (packet) { - const SharedNodePointer& node = DependencyManager::get()->nodeWithUUID(sendingNodeUUID); - queuePacketForSending(node, NLPacket::createCopy(*packet)); + queuePacketForSending(sendingNode, NLPacket::createCopy(*packet)); } } } diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 34fed80e98..8c77a1e388 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -83,7 +83,7 @@ public: virtual char getMyNodeType() const = 0; virtual void adjustEditPacketForClockSkew(PacketType::Value type, QByteArray& buffer, int clockSkew) { } - void processNackPacket(const QByteArray& packet); + void processNackPacket(NLPacket& packet, SharedNodePointer sendingNode); public slots: void nodeKilled(SharedNodePointer node); From 1bb3e1789a8a04c40bbb37558cb7cb337276c1b9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:05:27 -0700 Subject: [PATCH 503/582] remove more PacketHeader methods --- .../networking/src/udt/PacketHeaders.cpp | 26 ------------------- libraries/networking/src/udt/PacketHeaders.h | 6 ----- .../octree/src/OctreeEditPacketSender.cpp | 2 +- 3 files changed, 1 insertion(+), 33 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index bf831ef370..be63447cbe 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -126,36 +126,10 @@ QString nameForPacketType(PacketType::Value packetType) { return QString("unexpected"); } -int numBytesForPacketHeader(const QByteArray& packet) { - PacketType::Value packetType = packetTypeForPacket(packet); - return numBytesForPacketHeaderGivenPacketType(packetType); -} - -int numBytesForPacketHeader(const char* packet) { - PacketType::Value packetType = packetTypeForPacket(packet); - return numBytesForPacketHeaderGivenPacketType(packetType); -} - int numBytesForArithmeticCodedPacketType(PacketType::Value packetType) { return (int) ceilf((float) packetType / 255); } -int numBytesForPacketHeaderGivenPacketType(PacketType::Value packetType) { - return numBytesForArithmeticCodedPacketType(packetType) - + numHashBytesForType(packetType) - + numSequenceNumberBytesForType(packetType) - + NUM_STATIC_HEADER_BYTES; -} - -int numHashBytesForType(PacketType::Value packetType) { - return (NON_VERIFIED_PACKETS.contains(packetType) ? 0 : NUM_BYTES_MD5_HASH); -} - -int numSequenceNumberBytesForType(PacketType::Value packetType) { - return (SEQUENCE_NUMBERED_PACKETS.contains(packetType) ? sizeof(PacketSequenceNumber) : 0); -} - - PacketType::Value packetTypeForPacket(const QByteArray& packet) { return (PacketType::Value) arithmeticCodingValueFromBuffer(packet.data()); } diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 8ab73a9554..c76b7178e4 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -92,13 +92,7 @@ extern const QSet SEQUENCE_NUMBERED_PACKETS; extern const QSet NON_SOURCED_PACKETS; const int NUM_BYTES_MD5_HASH = 16; -const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; -const int MAX_PACKET_HEADER_BYTES = sizeof(PacketType::Value) + NUM_BYTES_MD5_HASH + NUM_STATIC_HEADER_BYTES; -PacketType::Value packetTypeForPacket(const QByteArray& packet); -PacketType::Value packetTypeForPacket(const char* packet); - -PacketVersion versionForPacketType(PacketType::Value packetType); QString nameForPacketType(PacketType::Value packetType); const QUuid nullUUID = QUuid(); diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 6875e31d1e..e2e17a6606 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -346,7 +346,7 @@ void OctreeEditPacketSender::processNackPacket(NLPacket& packet, SharedNodePoint if (_sentPacketHistories.count(sendingNode->getUUID()) == 0) { return; } - const SentPacketHistory& sentPacketHistory = _sentPacketHistories[sendingNode->getSourceID()]; + const SentPacketHistory& sentPacketHistory = _sentPacketHistories[sendingNode->getUUID()]; // read sequence numbers and queue packets for resend while (packet.bytesLeftToRead() > 0) { From 846506901a3e0d8b5c99a5cf361496dc1b89fe70 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:06:56 -0700 Subject: [PATCH 504/582] more removals from PacketHeaders --- libraries/networking/src/udt/PacketHeaders.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index c76b7178e4..4dbc329d2f 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -94,14 +94,8 @@ extern const QSet NON_SOURCED_PACKETS; const int NUM_BYTES_MD5_HASH = 16; QString nameForPacketType(PacketType::Value packetType); +PacketVersion versionForPacketType(PacketType::Value packetType); -const QUuid nullUUID = QUuid(); - -int numHashBytesForType(PacketType::Value packetType); -int numSequenceNumberBytesForType(PacketType::Value packetType); - -int numBytesForPacketHeader(const QByteArray& packet); -int numBytesForPacketHeader(const char* packet); int numBytesForArithmeticCodedPacketType(PacketType::Value packetType); int numBytesForPacketHeaderGivenPacketType(PacketType::Value packetType); int packArithmeticallyCodedValue(int value, char* destination); From 271575c8325befc00cb33ae4188b6a932297b498 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:08:21 -0700 Subject: [PATCH 505/582] remove unused octree method --- libraries/octree/src/Octree.cpp | 32 -------------------------------- libraries/octree/src/Octree.h | 1 - 2 files changed, 33 deletions(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 288f6fa1ae..203ff2b072 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -591,38 +591,6 @@ void Octree::eraseAllOctreeElements(bool createNewRoot) { _isDirty = true; } -void Octree::processRemoveOctreeElementsBitstream(const unsigned char* bitstream, int bufferSizeBytes) { - //unsigned short int itemNumber = (*((unsigned short int*)&bitstream[sizeof(PACKET_HEADER)])); - - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(bitstream)); - unsigned short int sequence = (*((unsigned short int*)(bitstream + numBytesPacketHeader))); - quint64 sentAt = (*((quint64*)(bitstream + numBytesPacketHeader + sizeof(sequence)))); - - int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); - - unsigned char* voxelCode = (unsigned char*)&bitstream[atByte]; - while (atByte < bufferSizeBytes) { - int maxSize = bufferSizeBytes - atByte; - int codeLength = numberOfThreeBitSectionsInCode(voxelCode, maxSize); - - if (codeLength == OVERFLOWED_OCTCODE_BUFFER) { - qCDebug(octree, "WARNING! Got remove voxel bitstream that would overflow buffer in numberOfThreeBitSectionsInCode()," - " bailing processing of packet!"); - break; - } - int voxelDataSize = bytesRequiredForCodeLength(codeLength) + SIZE_OF_COLOR_DATA; - - if (atByte + voxelDataSize <= bufferSizeBytes) { - deleteOctalCodeFromTree(voxelCode, COLLAPSE_EMPTY_TREE); - voxelCode += voxelDataSize; - atByte += voxelDataSize; - } else { - qCDebug(octree, "WARNING! Got remove voxel bitstream that would overflow buffer, bailing processing!"); - break; - } - } -} - // Note: this is an expensive call. Don't call it unless you really need to reaverage the entire tree (from startElement) void Octree::reaverageOctreeElements(OctreeElement* startElement) { if (!startElement) { diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index a3f9bbbac4..e00434be80 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -254,7 +254,6 @@ public: virtual void eraseAllOctreeElements(bool createNewRoot = true); - void processRemoveOctreeElementsBitstream(const unsigned char* bitstream, int bufferSizeBytes); void readBitstreamToTree(const unsigned char* bitstream, unsigned long int bufferSizeBytes, ReadBitstreamToTreeParams& args); void deleteOctalCodeFromTree(const unsigned char* codeBuffer, bool collapseEmptyTrees = DONT_COLLAPSE); void reaverageOctreeElements(OctreeElement* startElement = NULL); From d1c66751c4ff6b17a0735c169977787d97d489a7 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 16:08:58 -0700 Subject: [PATCH 506/582] emove unused method --- libraries/octree/src/Octree.cpp | 32 -------------------------------- libraries/octree/src/Octree.h | 1 - 2 files changed, 33 deletions(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 288f6fa1ae..203ff2b072 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -591,38 +591,6 @@ void Octree::eraseAllOctreeElements(bool createNewRoot) { _isDirty = true; } -void Octree::processRemoveOctreeElementsBitstream(const unsigned char* bitstream, int bufferSizeBytes) { - //unsigned short int itemNumber = (*((unsigned short int*)&bitstream[sizeof(PACKET_HEADER)])); - - int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast(bitstream)); - unsigned short int sequence = (*((unsigned short int*)(bitstream + numBytesPacketHeader))); - quint64 sentAt = (*((quint64*)(bitstream + numBytesPacketHeader + sizeof(sequence)))); - - int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); - - unsigned char* voxelCode = (unsigned char*)&bitstream[atByte]; - while (atByte < bufferSizeBytes) { - int maxSize = bufferSizeBytes - atByte; - int codeLength = numberOfThreeBitSectionsInCode(voxelCode, maxSize); - - if (codeLength == OVERFLOWED_OCTCODE_BUFFER) { - qCDebug(octree, "WARNING! Got remove voxel bitstream that would overflow buffer in numberOfThreeBitSectionsInCode()," - " bailing processing of packet!"); - break; - } - int voxelDataSize = bytesRequiredForCodeLength(codeLength) + SIZE_OF_COLOR_DATA; - - if (atByte + voxelDataSize <= bufferSizeBytes) { - deleteOctalCodeFromTree(voxelCode, COLLAPSE_EMPTY_TREE); - voxelCode += voxelDataSize; - atByte += voxelDataSize; - } else { - qCDebug(octree, "WARNING! Got remove voxel bitstream that would overflow buffer, bailing processing!"); - break; - } - } -} - // Note: this is an expensive call. Don't call it unless you really need to reaverage the entire tree (from startElement) void Octree::reaverageOctreeElements(OctreeElement* startElement) { if (!startElement) { diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index a3f9bbbac4..e00434be80 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -254,7 +254,6 @@ public: virtual void eraseAllOctreeElements(bool createNewRoot = true); - void processRemoveOctreeElementsBitstream(const unsigned char* bitstream, int bufferSizeBytes); void readBitstreamToTree(const unsigned char* bitstream, unsigned long int bufferSizeBytes, ReadBitstreamToTreeParams& args); void deleteOctalCodeFromTree(const unsigned char* codeBuffer, bool collapseEmptyTrees = DONT_COLLAPSE); void reaverageOctreeElements(OctreeElement* startElement = NULL); From 9625e6b33a2df6f979699be522d61c1383f141b5 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 16:09:47 -0700 Subject: [PATCH 507/582] emove impl of deleted methods --- libraries/networking/src/udt/PacketHeaders.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index be63447cbe..310569648f 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -129,11 +129,3 @@ QString nameForPacketType(PacketType::Value packetType) { int numBytesForArithmeticCodedPacketType(PacketType::Value packetType) { return (int) ceilf((float) packetType / 255); } - -PacketType::Value packetTypeForPacket(const QByteArray& packet) { - return (PacketType::Value) arithmeticCodingValueFromBuffer(packet.data()); -} - -PacketType::Value packetTypeForPacket(const char* packet) { - return (PacketType::Value) arithmeticCodingValueFromBuffer(packet); -} From 1a85e95f71d9e7b994279e05042e56c33a62ce25 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:09:48 -0700 Subject: [PATCH 508/582] remove implementation of packetTypeForPacket --- libraries/networking/src/udt/PacketHeaders.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index be63447cbe..310569648f 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -129,11 +129,3 @@ QString nameForPacketType(PacketType::Value packetType) { int numBytesForArithmeticCodedPacketType(PacketType::Value packetType) { return (int) ceilf((float) packetType / 255); } - -PacketType::Value packetTypeForPacket(const QByteArray& packet) { - return (PacketType::Value) arithmeticCodingValueFromBuffer(packet.data()); -} - -PacketType::Value packetTypeForPacket(const char* packet) { - return (PacketType::Value) arithmeticCodingValueFromBuffer(packet); -} From b1be6174811b8dd86bac29bea5e8cd57996ee377 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:12:01 -0700 Subject: [PATCH 509/582] add back MAX_PACKET_HEADER_BYTES --- libraries/networking/src/udt/PacketHeaders.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 4dbc329d2f..b036449b2e 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -78,7 +78,10 @@ namespace PacketType { }; }; +const int NUM_BYTES_MD5_HASH = 16; + const int MAX_PACKET_SIZE = 1450; +const int MAX_PACKET_HEADER_BYTES = 4 + NUM_BYTES_RFC4122_UUID + NUM_BYTES_MD5_HASH; typedef char PacketVersion; @@ -91,8 +94,6 @@ extern const QSet NON_VERIFIED_PACKETS; extern const QSet SEQUENCE_NUMBERED_PACKETS; extern const QSet NON_SOURCED_PACKETS; -const int NUM_BYTES_MD5_HASH = 16; - QString nameForPacketType(PacketType::Value packetType); PacketVersion versionForPacketType(PacketType::Value packetType); From eb0ed438ece2323de60d6572ee4961275e7d270b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:23:57 -0700 Subject: [PATCH 510/582] remove environment data packet --- .../src/octree/OctreePacketProcessor.cpp | 6 +---- libraries/render-utils/src/Environment.cpp | 24 ------------------- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 8b55c4ccd9..53af307b77 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -21,7 +21,7 @@ OctreePacketProcessor::OctreePacketProcessor() { QSet types { PacketType::OctreeStats, PacketType::EntityData, - PacketType::EntityErase, PacketType::OctreeStats, PacketType::EnvironmentData + PacketType::EntityErase, PacketType::OctreeStats }; packetReceiver.registerDirectListenerForTypes(types, this, "handleOctreePacket"); @@ -106,10 +106,6 @@ void OctreePacketProcessor::processPacket(QSharedPointer packet, Share } } break; - case PacketType::EnvironmentData: { - app->_environment.processPacket(*packet); - } break; - default: { // nothing to do } break; diff --git a/libraries/render-utils/src/Environment.cpp b/libraries/render-utils/src/Environment.cpp index 7b33ac1698..057df1d21c 100644 --- a/libraries/render-utils/src/Environment.cpp +++ b/libraries/render-utils/src/Environment.cpp @@ -196,30 +196,6 @@ bool Environment::findCapsulePenetration(const glm::vec3& start, const glm::vec3 return found; } -int Environment::processPacket(NLPacket& packet) { - // push past flags, sequence, timestamp - packet.seek(sizeof(OCTREE_PACKET_FLAGS) + sizeof(OCTREE_PACKET_SEQUENCE) + sizeof(OCTREE_PACKET_SENT_TIME)); - - // get the lock for the duration of the call - QMutexLocker locker(&_mutex); - - EnvironmentData newData; - - while (packet.bytesLeftToRead() > 0) { - int dataLength = newData.parseData(reinterpret_cast(packet.getPayload() + packet.pos()), - packet.bytesLeftToRead()); - packet.seek(packet.pos() + dataLength); - - // update the mapping by address/ID - _data[packet.getSourceID()][newData.getID()] = newData; - } - - // remove the default mapping, if any - _data.remove(QUuid()); - - return packet.pos(); -} - void Environment::renderAtmosphere(gpu::Batch& batch, ViewFrustum& camera, const EnvironmentData& data) { glm::vec3 center = data.getAtmosphereCenter(); From 6d7b659dff7ba378c0272cb77ad0e18363b30f55 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:24:26 -0700 Subject: [PATCH 511/582] remove the environment data process from header --- libraries/render-utils/src/Environment.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/render-utils/src/Environment.h b/libraries/render-utils/src/Environment.h index f2c7d57fa5..5174c30f54 100644 --- a/libraries/render-utils/src/Environment.h +++ b/libraries/render-utils/src/Environment.h @@ -37,8 +37,6 @@ public: EnvironmentData getClosestData(const glm::vec3& position); - int processPacket(NLPacket& packet); - private: glm::vec3 getGravity (const glm::vec3& position); // NOTE: Deprecated bool findCapsulePenetration(const glm::vec3& start, From 14e92ceeea7a4d03c2e813019400ec28319babdb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:25:13 -0700 Subject: [PATCH 512/582] remove environment data from packet headers --- libraries/networking/src/udt/PacketHeaders.cpp | 1 - libraries/networking/src/udt/PacketHeaders.h | 1 - 2 files changed, 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 310569648f..11c615eaf8 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -90,7 +90,6 @@ QString nameForPacketType(PacketType::Value packetType) { PACKET_TYPE_NAME_LOOKUP(MicrophoneAudioWithEcho); PACKET_TYPE_NAME_LOOKUP(BulkAvatarData); PACKET_TYPE_NAME_LOOKUP(SilentAudioFrame); - PACKET_TYPE_NAME_LOOKUP(EnvironmentData); PACKET_TYPE_NAME_LOOKUP(DomainListRequest); PACKET_TYPE_NAME_LOOKUP(RequestAssignment); PACKET_TYPE_NAME_LOOKUP(CreateAssignment); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index b036449b2e..a66c9ea566 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -41,7 +41,6 @@ namespace PacketType { MicrophoneAudioWithEcho, BulkAvatarData, SilentAudioFrame, - EnvironmentData, DomainListRequest, RequestAssignment, CreateAssignment, From 487969ef7a8fb0a4947b9b0a17db4194ba06669c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 16:45:16 -0700 Subject: [PATCH 513/582] pack reason size as quint16 --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 34ca61dfa8..594d7b978c 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -636,7 +636,7 @@ void DomainServer::processConnectRequestPacket(QSharedPointer packet) // this is an agent and we've decided we won't let them connect - send them a packet to deny connection QByteArray utfString = reason.toUtf8(); - qint16 payloadSize = utfString.size(); + quint16 payloadSize = utfString.size(); auto connectionDeniedPacket = NLPacket::create(PacketType::DomainConnectionDenied, payloadSize + sizeof(payloadSize)); connectionDeniedPacket->writePrimitive(payloadSize); From 6ce710f237389a6a265ee6ed26f8fe4714411a2b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 16:47:09 -0700 Subject: [PATCH 514/582] Fix domain request denied reason read --- interface/src/Application.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b03df3a1cc..381124789d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3820,10 +3820,9 @@ void Application::domainChanged(const QString& domainHostname) { } void Application::handleDomainConnectionDeniedPacket(QSharedPointer packet) { - QDataStream packetStream(packet.data()); - - QString reason; - packetStream >> reason; + quint16 size; + packet->readPrimitive(&size); + QString reason = QString::fromUtf8(packet->read(size)); // output to the log so the user knows they got a denied connection request // and check and signal for an access token so that we can make sure they are logged in From ceea5143e11ec5e1571afc3f053bf406971c1af6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 16:55:37 -0700 Subject: [PATCH 515/582] Avoid string copy --- interface/src/Application.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 381124789d..e19ce68d39 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3820,9 +3820,11 @@ void Application::domainChanged(const QString& domainHostname) { } void Application::handleDomainConnectionDeniedPacket(QSharedPointer packet) { - quint16 size; - packet->readPrimitive(&size); - QString reason = QString::fromUtf8(packet->read(size)); + // Read deny reason from packet + quint16 reasonSize; + packet->readPrimitive(&reasonSize); + QString reason = QString::fromUtf8(packet->getPayload() + packet->pos(), reasonSize); + packet->seek(packet->pos() + reasonSize); // output to the log so the user knows they got a denied connection request // and check and signal for an access token so that we can make sure they are logged in From 2a2eb3906644e5643af29d70883c4825876f1ac3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 17:08:06 -0700 Subject: [PATCH 516/582] repairs for DS path query and response --- domain-server/src/DomainServer.cpp | 2 +- libraries/networking/src/NodeList.cpp | 43 ++++++++++++++++----------- libraries/networking/src/NodeList.h | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 594d7b978c..7581e5192e 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -2224,7 +2224,7 @@ void DomainServer::processPathQueryPacket(QSharedPointer packet) { // are we going to be able to fit this response viewpoint in a packet? if (numPathBytes + numViewpointBytes + sizeof(numViewpointBytes) + sizeof(numPathBytes) - < (unsigned long) pathResponsePacket->bytesLeftToRead()) { + < (unsigned long) pathResponsePacket->bytesAvailableForWrite()) { // append the number of bytes this path is pathResponsePacket->writePrimitive(numPathBytes); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 002484a54c..dfa3ef86a5 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -98,6 +98,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned packetReceiver.registerListener(PacketType::ICEServerPeerInformation, &_domainHandler, "processICEResponsePacket"); packetReceiver.registerListener(PacketType::DomainServerRequireDTLS, &_domainHandler, "processDTLSRequirementPacket"); packetReceiver.registerListener(PacketType::ICEPingReply, &_domainHandler, "processICEPingReplyPacket"); + packetReceiver.registerListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathResponse"); } qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& destination) { @@ -339,9 +340,9 @@ void NodeList::sendDSPathQuery(const QString& newPath) { QByteArray pathQueryUTF8 = newPath.toUtf8(); // get the size of the UTF8 representation of the desired path - qint64 numPathBytes = pathQueryUTF8.size(); + quint16 numPathBytes = pathQueryUTF8.size(); - if (numPathBytes + ((qint64) sizeof(numPathBytes)) < pathQueryPacket->bytesAvailableForWrite()) { + if (numPathBytes + ((qint16) sizeof(numPathBytes)) < pathQueryPacket->bytesAvailableForWrite()) { // append the size of the path to the query packet pathQueryPacket->writePrimitive(numPathBytes); @@ -360,35 +361,41 @@ void NodeList::sendDSPathQuery(const QString& newPath) { } } -void NodeList::processDomainServerPathQueryResponse(QSharedPointer packet) { +void NodeList::processDomainServerPathResponse(QSharedPointer packet) { // This is a response to a path query we theoretically made. // In the future we may want to check that this was actually from our DS and for a query we actually made. // figure out how many bytes the path query is - qint16 numPathBytes; + quint16 numPathBytes; packet->readPrimitive(&numPathBytes); // pull the path from the packet - QString pathQuery = QString::fromUtf8(packet->read(numPathBytes)); + if (packet->bytesLeftToRead() < numPathBytes) { + qCDebug(networking) << "Could not read query path from DomainServerPathQueryResponse. Bailing."; + return; + } + + QString pathQuery = QString::fromUtf8(packet->getPayload() + packet->pos(), numPathBytes); + packet->seek(packet->pos() + numPathBytes); // figure out how many bytes the viewpoint is - qint16 numViewpointBytes; + quint16 numViewpointBytes; packet->readPrimitive(&numViewpointBytes); + if (packet->bytesLeftToRead() < numViewpointBytes) { + qCDebug(networking) << "Could not read resulting viewpoint from DomainServerPathQueryReponse. Bailing"; + return; + } + // pull the viewpoint from the packet - auto stringData = packet->read(numViewpointBytes); - if (stringData.size() == numViewpointBytes) { - QString viewpoint = QString::fromUtf8(stringData); - - // Hand it off to the AddressManager so it can handle it as a relative viewpoint - if (DependencyManager::get()->goToViewpointForPath(viewpoint, pathQuery)) { - qCDebug(networking) << "Going to viewpoint" << viewpoint << "which was the lookup result for path" << pathQuery; - } else { - qCDebug(networking) << "Could not go to viewpoint" << viewpoint - << "which was the lookup result for path" << pathQuery; - } + QString viewpoint = QString::fromUtf8(packet->getPayload() + packet->pos(), numViewpointBytes); + + // Hand it off to the AddressManager so it can handle it as a relative viewpoint + if (DependencyManager::get()->goToViewpointForPath(viewpoint, pathQuery)) { + qCDebug(networking) << "Going to viewpoint" << viewpoint << "which was the lookup result for path" << pathQuery; } else { - qCDebug(networking) << "Error loading viewpoint from path query response"; + qCDebug(networking) << "Could not go to viewpoint" << viewpoint + << "which was the lookup result for path" << pathQuery; } } diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 72e8d577e0..e3f8feeeda 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -74,7 +74,7 @@ public slots: void processDomainServerList(QSharedPointer packet); void processDomainServerAddedNode(QSharedPointer packet); - void processDomainServerPathQueryResponse(QSharedPointer packet); + void processDomainServerPathResponse(QSharedPointer packet); void processPingPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processPingReplyPacket(QSharedPointer packet, SharedNodePointer sendingNode); From b257daaef11c6b1e60eba799f16540a04bf6cc1f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 17:23:00 -0700 Subject: [PATCH 517/582] fix supression of repeated messages for version mismatch --- libraries/networking/src/PacketReceiver.cpp | 30 ++++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 9689ac1308..03de529b22 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -189,19 +189,35 @@ bool PacketReceiver::packetVersionMatch(const NLPacket& packet) { if (packet.getVersion() != versionForPacketType(packet.getType()) && packet.getType() != PacketType::StunResponse) { - static QMultiMap versionDebugSuppressMap; + static QMultiHash sourcedVersionDebugSuppressMap; + static QMultiHash versionDebugSuppressMap; - const QUuid& senderID = packet.getSourceID(); - - if (!versionDebugSuppressMap.contains(senderID, packet.getType())) { + bool hasBeenOutput = false; + QString senderString; + + if (NON_SOURCED_PACKETS.contains(packet.getType())) { + const HifiSockAddr& senderSockAddr = packet.getSenderSockAddr(); + hasBeenOutput = versionDebugSuppressMap.contains(senderSockAddr, packet.getType()); + + if (!hasBeenOutput) { + versionDebugSuppressMap.insert(senderSockAddr, packet.getType()); + senderString = QString("%1:%2").arg(senderSockAddr.getAddress().toString()).arg(senderSockAddr.getPort()); + } + } else { + hasBeenOutput = sourcedVersionDebugSuppressMap.contains(packet.getSourceID(), packet.getType()); + + if (!hasBeenOutput) { + sourcedVersionDebugSuppressMap.insert(packet.getSourceID(), packet.getType()); + senderString = uuidStringWithoutCurlyBraces(packet.getSourceID().toString()); + } + } + if (!hasBeenOutput) { qCDebug(networking) << "Packet version mismatch on" << packet.getType() << "- Sender" - << senderID << "sent" << qPrintable(QString::number(packet.getVersion())) << "but" + << senderString << "sent" << qPrintable(QString::number(packet.getVersion())) << "but" << qPrintable(QString::number(versionForPacketType(packet.getType()))) << "expected."; emit packetVersionMismatch(packet.getType()); - - versionDebugSuppressMap.insert(senderID, packet.getType()); } return false; From e8de73427bdeae81de6342205e7f4b34b2b266b7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 17:25:55 -0700 Subject: [PATCH 518/582] fix suppression of hash mismatch messages --- libraries/networking/src/LimitedNodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index e37923d3a0..2bb9f4cfaf 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -206,7 +206,7 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod } else { static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ received from unknown node with UUID"); + = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ \\([\\s\"a-zA-Z]+\\) received from unknown node with UUID"); qCDebug(networking) << "Packet of type" << packet.getType() << "(" << nameForPacketType(packet.getType()) << ")" << "received from unknown node with UUID" << qPrintable(uuidStringWithoutCurlyBraces(packet.getSourceID())); From ce6585ccc8b372c14178836c27c829f0097813d0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 17:44:43 -0700 Subject: [PATCH 519/582] fix AC monitor and AM double register --- assignment-client/src/Agent.cpp | 17 ++++++++++++++++- assignment-client/src/AssignmentClient.cpp | 1 - .../src/AssignmentClientMonitor.cpp | 4 +++- interface/src/avatar/AvatarManager.cpp | 9 ++++++++- libraries/avatars/src/AvatarHashMap.cpp | 6 ------ libraries/networking/src/LimitedNodeList.cpp | 4 ++-- libraries/networking/src/PacketReceiver.cpp | 1 + 7 files changed, 30 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 97ef85681a..244311862b 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -58,6 +58,12 @@ Agent::Agent(NLPacket& packet) : { PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }, this, "handleOctreePacket"); packetReceiver.registerListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); + packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); + packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); + packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); } void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { @@ -161,7 +167,16 @@ void Agent::run() { // give this AvatarData object to the script engine _scriptEngine.setAvatarData(&scriptedAvatar, "Avatar"); - _scriptEngine.setAvatarHashMap(DependencyManager::get().data(), "AvatarList"); + + auto avatarHashMap = DependencyManager::set(); + + _scriptEngine.setAvatarHashMap(avatarHashMap.data(), "AvatarList"); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerListener(PacketType::BulkAvatarData, avatarHashMap.data(), "processAvatarDataPacket"); + packetReceiver.registerListener(PacketType::KillAvatar, avatarHashMap.data(), "processKillAvatar"); + packetReceiver.registerListener(PacketType::AvatarIdentity, avatarHashMap.data(), "processAvatarIdentityPacket"); + packetReceiver.registerListener(PacketType::AvatarBillboard, avatarHashMap.data(), "processAvatarBillboardPacket"); // register ourselves to the script engine _scriptEngine.registerGlobalObject("Agent", this); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 2e044f07ff..40aef1c707 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -56,7 +56,6 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri auto nodeList = DependencyManager::set(NodeType::Unassigned); auto animationCache = DependencyManager::set(); - auto avatarHashMap = DependencyManager::set(); auto entityScriptingInterface = DependencyManager::set(); DependencyManager::registerInheritance(); diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 0a39d80a61..ba2baad12b 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -176,7 +176,7 @@ void AssignmentClientMonitor::checkSpares() { AssignmentClientChildData* childData = static_cast(node->getLinkedData()); totalCount ++; if (childData->getChildType() == Assignment::Type::AllTypes) { - spareCount ++; + ++spareCount; aSpareId = node->getUUID(); } }); @@ -203,7 +203,9 @@ void AssignmentClientMonitor::checkSpares() { } void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { + // read out the sender ID QUuid senderID = QUuid::fromRfc4122(QByteArray::fromRawData(packet->getPayload(), NUM_BYTES_RFC4122_UUID)); + packet->seek(NUM_BYTES_RFC4122_UUID); auto nodeList = DependencyManager::get(); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 41d637eb38..d5922366e9 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -61,10 +61,17 @@ void AvatarManager::registerMetaTypes(QScriptEngine* engine) { } AvatarManager::AvatarManager(QObject* parent) : - _avatarFades() { + _avatarFades() +{ // register a meta type for the weak pointer we'll use for the owning avatar mixer for each avatar qRegisterMetaType >("NodeWeakPointer"); _myAvatar = std::make_shared(); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); + packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); + packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); + packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); } void AvatarManager::init() { diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 3243ff3f9a..75465f0bc5 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -20,12 +20,6 @@ AvatarHashMap::AvatarHashMap() { connect(DependencyManager::get().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged); - - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); - packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); - packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); - packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); } bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) { diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2bb9f4cfaf..ce85760aa0 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -206,9 +206,9 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod } else { static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ \\([\\s\"a-zA-Z]+\\) received from unknown node with UUID"); + = LogHandler::getInstance().addRepeatedMessageRegex("Packet of type \\d+ \\([\\sa-zA-Z]+\\) received from unknown node with UUID"); - qCDebug(networking) << "Packet of type" << packet.getType() << "(" << nameForPacketType(packet.getType()) << ")" + qCDebug(networking) << "Packet of type" << packet.getType() << "(" << qPrintable(nameForPacketType(packet.getType())) << ")" << "received from unknown node with UUID" << qPrintable(uuidStringWithoutCurlyBraces(packet.getSourceID())); } } diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 03de529b22..8b95954e41 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -151,6 +151,7 @@ void PacketReceiver::registerVerifiedListener(PacketType::Value type, QObject* o if (_packetListenerMap.contains(type)) { qDebug() << "Warning: Registering a packet listener for packet type" << type + << "(" << qPrintable(nameForPacketType(type)) << ")" << "that will remove a previously registered listener"; } From 49f5a5ffcb26bdd1ba3eddaf8585568e47611a21 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 17:46:46 -0700 Subject: [PATCH 520/582] remove double declaration of PacketReceiver --- assignment-client/src/Agent.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 244311862b..bb785c38cf 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -59,7 +59,6 @@ Agent::Agent(NLPacket& packet) : this, "handleOctreePacket"); packetReceiver.registerListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); From 040c7557dac4661ac9a7cd9976c5b7881ea0ac44 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 17:51:06 -0700 Subject: [PATCH 521/582] fix double register for Agent avatar packets --- assignment-client/src/Agent.cpp | 5 ----- libraries/avatars/src/AvatarHashMap.h | 7 ++++--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index bb785c38cf..c4b3316843 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -58,11 +58,6 @@ Agent::Agent(NLPacket& packet) : { PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }, this, "handleOctreePacket"); packetReceiver.registerListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); - - packetReceiver.registerListener(PacketType::BulkAvatarData, this, "processAvatarDataPacket"); - packetReceiver.registerListener(PacketType::KillAvatar, this, "processKillAvatar"); - packetReceiver.registerListener(PacketType::AvatarIdentity, this, "processAvatarIdentityPacket"); - packetReceiver.registerListener(PacketType::AvatarBillboard, this, "processAvatarBillboardPacket"); } void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index fa61788816..c0e068001a 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -36,14 +36,15 @@ public: public slots: bool isAvatarInRange(const glm::vec3 & position, const float range); - -private slots: - void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); + void processAvatarDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processKillAvatar(QSharedPointer packet, SharedNodePointer sendingNode); +private slots: + void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); + protected: AvatarHashMap(); From e7249594e1fce28bddd74e8bff104111889f977b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 16 Jul 2015 17:55:29 -0700 Subject: [PATCH 522/582] unregister the AvatarHashMap packet registrations --- assignment-client/src/Agent.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c4b3316843..d45c7217fa 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -193,6 +193,9 @@ void Agent::run() { void Agent::aboutToFinish() { _scriptEngine.stop(); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.unregisterListener(DependencyManager::get().data()); // our entity tree is going to go away so tell that to the EntityScriptingInterface DependencyManager::get()->setEntityTree(NULL); From 7d60b86f52982aac24c4dc2df8de884978e9bab2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 09:07:39 -0700 Subject: [PATCH 523/582] kill the PacketLister (AKA Huffman 1 : PacketListener 0) --- assignment-client/src/AssignmentClient.h | 4 +- .../src/AssignmentClientMonitor.h | 3 +- assignment-client/src/avatars/AvatarMixer.cpp | 3 ++ domain-server/src/DomainServer.h | 3 +- interface/src/Application.h | 7 +--- interface/src/octree/OctreePacketProcessor.h | 3 +- libraries/audio-client/src/AudioClient.h | 3 +- libraries/audio-client/src/AudioIOStats.h | 3 +- libraries/avatars/src/AvatarHashMap.h | 3 +- .../entities/src/EntityEditPacketSender.h | 4 +- libraries/networking/src/DomainHandler.h | 3 +- libraries/networking/src/LimitedNodeList.h | 3 +- libraries/networking/src/PacketListener.cpp | 21 ---------- libraries/networking/src/PacketListener.h | 22 ----------- libraries/networking/src/PacketReceiver.cpp | 39 ++++++++++--------- libraries/networking/src/PacketReceiver.h | 12 +++--- libraries/networking/src/ThreadedAssignment.h | 4 +- 17 files changed, 41 insertions(+), 99 deletions(-) delete mode 100644 libraries/networking/src/PacketListener.cpp delete mode 100644 libraries/networking/src/PacketListener.h 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); From 97312f9898b65846c8d84bae1ad164f94eabd284 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 09:21:10 -0700 Subject: [PATCH 524/582] remove dead listener from map right before invoke --- libraries/networking/src/PacketReceiver.cpp | 51 +++++++++++++-------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 446fb67736..ea7f3adab8 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -264,6 +264,8 @@ void PacketReceiver::processDatagrams() { } _packetListenerLock.lock(); + + bool listenerIsDead = false; auto it = _packetListenerMap.find(packet->getType()); @@ -297,27 +299,33 @@ void PacketReceiver::processDatagrams() { static const QByteArray QSHAREDPOINTER_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer"); static const QByteArray SHARED_NODE_NORMALIZED = QMetaObject::normalizedType("SharedNodePointer"); - - if (metaMethod.parameterTypes().contains(SHARED_NODE_NORMALIZED)) { - success = metaMethod.invoke(listener.first, - connectionType, - Q_ARG(QSharedPointer, - QSharedPointer(packet.release())), - Q_ARG(SharedNodePointer, matchingNode)); - - } else if (metaMethod.parameterTypes().contains(QSHAREDPOINTER_NODE_NORMALIZED)) { - success = metaMethod.invoke(listener.first, - connectionType, - Q_ARG(QSharedPointer, - QSharedPointer(packet.release())), - Q_ARG(QSharedPointer, matchingNode)); - + + // one final check on the QPointer before we go to invoke + if (listener.first) { + if (metaMethod.parameterTypes().contains(SHARED_NODE_NORMALIZED)) { + success = metaMethod.invoke(listener.first, + connectionType, + Q_ARG(QSharedPointer, + QSharedPointer(packet.release())), + Q_ARG(SharedNodePointer, matchingNode)); + + } else if (metaMethod.parameterTypes().contains(QSHAREDPOINTER_NODE_NORMALIZED)) { + success = metaMethod.invoke(listener.first, + connectionType, + Q_ARG(QSharedPointer, + QSharedPointer(packet.release())), + Q_ARG(QSharedPointer, matchingNode)); + + } else { + success = metaMethod.invoke(listener.first, + connectionType, + Q_ARG(QSharedPointer, + QSharedPointer(packet.release()))); + } } else { - success = metaMethod.invoke(listener.first, - connectionType, - Q_ARG(QSharedPointer, - QSharedPointer(packet.release()))); + listenerIsDead = true; } + } else { emit dataReceived(NodeType::Unassigned, packet->getDataSize()); @@ -332,11 +340,16 @@ void PacketReceiver::processDatagrams() { } } else { + listenerIsDead = true; + } + + if (listenerIsDead) { 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()); From 7d2495e289d59ed4443110c4beea9da9f847b508 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 09:24:00 -0700 Subject: [PATCH 525/582] set the generic thread priority once it's actually started --- libraries/shared/src/GenericThread.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/GenericThread.cpp b/libraries/shared/src/GenericThread.cpp index 9c1c7c590c..be984d5899 100644 --- a/libraries/shared/src/GenericThread.cpp +++ b/libraries/shared/src/GenericThread.cpp @@ -35,7 +35,6 @@ void GenericThread::initialize(bool isThreaded, QThread::Priority priority) { // match the thread name to our object name _thread->setObjectName(objectName()); - _thread->setPriority(priority); // when the worker thread is started, call our engine's run.. connect(_thread, SIGNAL(started()), this, SLOT(threadRoutine())); @@ -44,6 +43,8 @@ void GenericThread::initialize(bool isThreaded, QThread::Priority priority) { // Starts an event loop, and emits _thread->started() _thread->start(); + + _thread->setPriority(priority); } } From 9466d5eca588e2e1d01998932fc17c0de89c3fb5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 09:29:59 -0700 Subject: [PATCH 526/582] add the stop node packet to list of non sourced --- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketList.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 11c615eaf8..eb8ca12b69 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -32,7 +32,7 @@ const QSet NON_SOURCED_PACKETS = QSet() << DomainServerAddedNode << ICEServerPeerInformation << ICEServerQuery << ICEServerHeartbeat << ICEPing << ICEPingReply - << AssignmentClientStatus; + << AssignmentClientStatus << StopNode; int arithmeticCodingValueFromBuffer(const char* checkValue) { if (((uchar) *checkValue) < 255) { diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 9e3921e325..edf9c4912d 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -42,7 +42,7 @@ std::unique_ptr PacketList::createPacketWithExtendedHeader() { // add the extended header to the front of the packet if (packet->write(_extendedHeader) == -1) { qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" - << "- make sure that _extendedHeader is not larger than the payload capacity."; + << "- make sure that _extendedHeader is not larger than the payload capacity."; } } From 2d5428276a8179aaa98b939cfa5a0b442ab38998 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 09:56:27 -0700 Subject: [PATCH 527/582] shouldNack default to true --- libraries/entities/src/EntityEditPacketSender.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 3125b2132c..0fdb46ce2e 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -39,6 +39,6 @@ public slots: void toggleNackPackets() { _shouldNack = !_shouldNack; } private: - bool _shouldNack = false; + bool _shouldNack = true; }; #endif // hifi_EntityEditPacketSender_h From 0811553c4161598d1b2d71e212faf00530834cc1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 10:49:24 -0700 Subject: [PATCH 528/582] add a direct registration for EntityEditPacketSender --- libraries/entities/src/EntityEditPacketSender.cpp | 2 +- libraries/networking/src/PacketReceiver.cpp | 13 ++++++++++++- libraries/networking/src/PacketReceiver.h | 5 ++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 4dab854d13..47622cbbdf 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -19,7 +19,7 @@ EntityEditPacketSender::EntityEditPacketSender() { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); + packetReceiver.registerDirectListener(PacketType::EntityEditNack, this, "processEntityEditNackPacket"); } void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet, SharedNodePointer sendingNode) { diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index ea7f3adab8..973cc82e32 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -63,6 +63,17 @@ bool PacketReceiver::registerListenerForTypes(const QSet& typ return true; } +void PacketReceiver::registerDirectListener(PacketType::Value type, QObject* listener, const char* slot) { + bool success = registerListener(type, listener, slot); + if (success) { + _directConnectSetMutex.lock(); + + // if we successfully registered, add this object to the set of objects that are directly connected + _directlyConnectedObjects.insert(listener); + + _directConnectSetMutex.unlock(); + } +} void PacketReceiver::registerDirectListenerForTypes(const QSet& types, QObject* listener, const char* slot) { @@ -72,7 +83,7 @@ void PacketReceiver::registerDirectListenerForTypes(const QSet(listener)); + _directlyConnectedObjects.insert(listener); _directConnectSetMutex.unlock(); } diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 27dc1ce55e..cdda467c79 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -23,6 +23,7 @@ #include "NLPacket.h" #include "udt/PacketHeaders.h" +class EntityEditPacketSender; class OctreePacketProcessor; class PacketReceiver : public QObject { @@ -53,9 +54,10 @@ signals: void packetVersionMismatch(PacketType::Value type); private: - // this is a brutal hack for now - ideally GenericThread / ReceivedPacketProcessor + // these are brutal hacks 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, QObject* listener, const char* slot); + void registerDirectListener(PacketType::Value type, QObject* listener, const char* slot); bool packetVersionMatch(const NLPacket& packet); @@ -72,6 +74,7 @@ private: QMutex _directConnectSetMutex; QSet _directlyConnectedObjects; + friend class EntityEditPacketSender; friend class OctreePacketProcessor; }; From cf453952f4780df3917175993525134eff48012a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 10:52:27 -0700 Subject: [PATCH 529/582] Rename should nack --- libraries/entities/src/EntityEditPacketSender.cpp | 2 +- libraries/entities/src/EntityEditPacketSender.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 47622cbbdf..5905f7924c 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -23,7 +23,7 @@ EntityEditPacketSender::EntityEditPacketSender() { } void EntityEditPacketSender::processEntityEditNackPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - if (_shouldNack) { + if (_shouldProcessNack) { processNackPacket(*packet, sendingNode); } } diff --git a/libraries/entities/src/EntityEditPacketSender.h b/libraries/entities/src/EntityEditPacketSender.h index 0fdb46ce2e..32afb2ee74 100644 --- a/libraries/entities/src/EntityEditPacketSender.h +++ b/libraries/entities/src/EntityEditPacketSender.h @@ -36,9 +36,9 @@ public: public slots: void processEntityEditNackPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void toggleNackPackets() { _shouldNack = !_shouldNack; } + void toggleNackPackets() { _shouldProcessNack = !_shouldProcessNack; } private: - bool _shouldNack = true; + bool _shouldProcessNack = true; }; #endif // hifi_EntityEditPacketSender_h From fbaf25f3f9749dfa103e6e7768c645cae0955e72 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 11:04:54 -0700 Subject: [PATCH 530/582] Remove unused header --- libraries/environment/src/EnvironmentData.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/environment/src/EnvironmentData.cpp b/libraries/environment/src/EnvironmentData.cpp index 2c6fe5b491..4cb8f7a010 100644 --- a/libraries/environment/src/EnvironmentData.cpp +++ b/libraries/environment/src/EnvironmentData.cpp @@ -12,7 +12,6 @@ #include #include "EnvironmentData.h" -#include "udt/PacketHeaders.h" // initial values from Sean O'Neil's GPU Gems entry (http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html), // GameEngine.cpp From 9725184b24410beac52f637ff01cdb82c866a1b1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 17 Jul 2015 11:05:07 -0700 Subject: [PATCH 531/582] Move dataSent signal from PacketReceiver to LimitedNodeList --- interface/src/Application.cpp | 8 ++++---- libraries/networking/src/LimitedNodeList.cpp | 4 ++++ libraries/networking/src/LimitedNodeList.h | 2 ++ libraries/networking/src/PacketReceiver.h | 1 - 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e19ce68d39..b4b11b105c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -574,10 +574,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // hook up bandwidth estimator QSharedPointer bandwidthRecorder = DependencyManager::get(); - connect(nodeList.data(), SIGNAL(dataSent(const quint8, const int)), - bandwidthRecorder.data(), SLOT(updateOutboundData(const quint8, const int))); - connect(nodeList.data(), SIGNAL(dataReceived(const quint8, const int)), - bandwidthRecorder.data(), SLOT(updateInboundData(const quint8, const int))); + connect(nodeList.data(), &LimitedNodeList::dataSent, + bandwidthRecorder.data(), &BandwidthRecorder::updateOutboundData); + connect(&nodeList->getPacketReceiver(), &PacketReceiver::dataReceived, + bandwidthRecorder.data(), &BandwidthRecorder::updateInboundData); connect(&_myAvatar->getSkeletonModel(), &SkeletonModel::skeletonLoaded, this, &Application::checkSkeleton, Qt::QueuedConnection); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index ce85760aa0..fdb3461c1f 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -226,6 +226,8 @@ qint64 LimitedNodeList::writePacket(const NLPacket& packet, const Node& destinat PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode.getUUID(), packet.getType()); const_cast(packet).writeSequenceNumber(sequenceNumber); } + + emit dataSent(destinationNode.getType(), packet.getDataSize()); return writePacket(packet, *destinationNode.getActiveSocket(), destinationNode.getConnectionSecret()); } @@ -241,6 +243,8 @@ qint64 LimitedNodeList::writePacket(const NLPacket& packet, const HifiSockAddr& && !NON_VERIFIED_PACKETS.contains(packet.getType())) { const_cast(packet).writeVerificationHash(packet.payloadHashWithConnectionUUID(connectionSecret)); } + + emit dataSent(NodeType::Unassigned, packet.getDataSize()); return writeDatagram(QByteArray::fromRawData(packet.getData(), packet.getDataSize()), destinationSockAddr); } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 7528b973c4..33d490c960 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -232,6 +232,8 @@ public slots: void killNodeWithUUID(const QUuid& nodeUUID); signals: + void dataSent(quint8 channelType, int bytes); + void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID); void nodeAdded(SharedNodePointer); void nodeKilled(SharedNodePointer); diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index 27dc1ce55e..fbcbb72d04 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -48,7 +48,6 @@ public slots: void processDatagrams(); signals: - void dataSent(quint8 channelType, int bytes); void dataReceived(quint8 channelType, int bytes); void packetVersionMismatch(PacketType::Value type); From 6da9825bac8261576949e67d6cb40db5e2ec03c4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 11:06:23 -0700 Subject: [PATCH 532/582] Include stdlib string instead of cstring --- libraries/environment/src/EnvironmentData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/environment/src/EnvironmentData.cpp b/libraries/environment/src/EnvironmentData.cpp index 4cb8f7a010..89153893d8 100644 --- a/libraries/environment/src/EnvironmentData.cpp +++ b/libraries/environment/src/EnvironmentData.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include #include "EnvironmentData.h" From 357963b6e0470c0b490706247eff32e393b0ef94 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 11:06:39 -0700 Subject: [PATCH 533/582] fix reference to packet that is now buffer --- libraries/avatars/src/AvatarData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index d990f60046..04f85bdf23 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -298,7 +298,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { // = 51 bytes int minPossibleSize = 51; - int maxAvailableSize = packet.size() - offset; + int maxAvailableSize = buffer.size(); if (minPossibleSize > maxAvailableSize) { if (shouldLogError(now)) { qCDebug(avatars) << "Malformed AvatarData packet at the start; " From 7a13c867aed486e090a1c851372249515919b04d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 11:18:11 -0700 Subject: [PATCH 534/582] quit the ScriptEngine thread once the script is done --- interface/src/Application.cpp | 9 ++++++--- libraries/script-engine/src/ScriptEngine.cpp | 6 ------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b4b11b105c..1d215f680a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4111,10 +4111,13 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri // when the worker thread is started, call our engine's run.. connect(workerThread, &QThread::started, scriptEngine, &ScriptEngine::run); - + // when the thread is terminated, add both scriptEngine and thread to the deleteLater queue - connect(scriptEngine, SIGNAL(doneRunning()), scriptEngine, SLOT(deleteLater())); - connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater())); + connect(scriptEngine, &ScriptEngine::doneRunning, scriptEngine, &ScriptEngine::deleteLater()); + connect(workerThread, &QThread::finished, workerThread, &Qthread::deleteLater); + + // tell the thread to stop when the script engine is done + connect(scriptEngine, &ScriptEngine::destroyed, workerThread, &QThread::quit); auto nodeList = DependencyManager::get(); connect(nodeList.data(), &NodeList::nodeKilled, scriptEngine, &ScriptEngine::nodeKilled); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index e99072de71..7bb62a01ab 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -720,12 +720,6 @@ void ScriptEngine::run() { } } - // If we were on a thread, then wait till it's done - // Unless we're an assignment-client, in which case that's handled for us - if (thread() && !_isAgent) { - thread()->quit(); - } - emit finished(_fileNameString); _isRunning = false; From 1c98c5e02c12e0e8d780fb26fbfe66db0eccac1d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 11:20:05 -0700 Subject: [PATCH 535/582] remove unregisterListener that isn't needed anymore --- assignment-client/src/Agent.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index d45c7217fa..da588bc316 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -194,9 +194,6 @@ void Agent::run() { void Agent::aboutToFinish() { _scriptEngine.stop(); - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.unregisterListener(DependencyManager::get().data()); - // our entity tree is going to go away so tell that to the EntityScriptingInterface DependencyManager::get()->setEntityTree(NULL); } From 2d277a2abd0125a9c98ba00768ef49f722706e7b Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 17 Jul 2015 11:28:25 -0700 Subject: [PATCH 536/582] Fix https://app.asana.com/0/30233891560551/41734486809354/f --- libraries/audio/src/AudioInjector.cpp | 4 ++++ libraries/audio/src/AudioInjector.h | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index f49d51bb8b..057836fb75 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -93,6 +93,7 @@ void AudioInjector::injectAudio() { } void AudioInjector::restart() { + _isPlaying = true; connect(this, &AudioInjector::finished, this, &AudioInjector::restartPortionAfterFinished); if (!_isStarted || _isFinished) { emit finished(); @@ -270,6 +271,7 @@ void AudioInjector::injectToMixer() { } setIsFinished(true); + _isPlaying = !_isFinished; // Which can be false if a restart was requested } void AudioInjector::stop() { @@ -277,6 +279,7 @@ void AudioInjector::stop() { if (_options.localOnly) { // we're only a local injector, so we can say we are finished right away too + _isPlaying = false; setIsFinished(true); } } @@ -334,6 +337,7 @@ AudioInjector* AudioInjector::playSound(const QByteArray& buffer, const AudioInj injectorThread->setObjectName("Audio Injector Thread"); AudioInjector* injector = new AudioInjector(buffer, options); + injector->_isPlaying = true; injector->setLocalAudioInterface(localInterface); injector->moveToThread(injectorThread); diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 806a4ea33e..88d3f1e151 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -62,7 +62,7 @@ public slots: void setCurrentSendPosition(int currentSendPosition) { _currentSendPosition = currentSendPosition; } float getLoudness() const { return _loudness; } - bool isPlaying() const { return !_isFinished; } + bool isPlaying() const { return _isPlaying; } void restartPortionAfterFinished(); signals: @@ -78,6 +78,7 @@ private: AudioInjectorOptions _options; bool _shouldStop = false; float _loudness = 0.0f; + bool _isPlaying = false; bool _isStarted = false; bool _isFinished = false; bool _shouldDeleteAfterFinish = false; From 08bd2adb51b08a1f32d29883d72eb98d34f82901 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 13:58:14 -0700 Subject: [PATCH 537/582] remove dead listeners from set of directly connected objects --- libraries/networking/src/PacketReceiver.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 973cc82e32..f59be35dc5 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -359,6 +359,11 @@ void PacketReceiver::processDatagrams() { << " (" << qPrintable(nameForPacketType(packet->getType())) << ")" << " has been destroyed. Removing from listener map."; it = _packetListenerMap.erase(it); + + // if it exists, remove the listener from _directlyConnectedObjects + _directConnectSetMutex.lock(); + _directlyConnectedObjects.remove(listener.first); + _directConnectSetMutex.unlock(); } } else { From 8a2bb552312bea134a8589b3470524b4d449b7c3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 14:00:02 -0700 Subject: [PATCH 538/582] add back a removed comment from jurisdiction map --- libraries/octree/src/JurisdictionMap.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/octree/src/JurisdictionMap.h b/libraries/octree/src/JurisdictionMap.h index 56879be1fc..b4294659d3 100644 --- a/libraries/octree/src/JurisdictionMap.h +++ b/libraries/octree/src/JurisdictionMap.h @@ -38,6 +38,7 @@ public: // standard assignment JurisdictionMap& operator=(const JurisdictionMap& other); // copy assignment + // application constructors JurisdictionMap(const char* filename); JurisdictionMap(unsigned char* rootOctalCode, const std::vector& endNodes); JurisdictionMap(const char* rootHextString, const char* endNodesHextString); From 8ff8a17f02e42bdde4ac65ca4e7727b8efb87d2b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 14:17:48 -0700 Subject: [PATCH 539/582] remove TODO added for DS, check sockets --- domain-server/src/DomainServer.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 7581e5192e..bd7f476fff 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -579,9 +579,9 @@ const NodeSet STATICALLY_ASSIGNED_NODES = NodeSet() << NodeType::AudioMixer void DomainServer::processConnectRequestPacket(QSharedPointer packet) { NodeType_t nodeType; HifiSockAddr publicSockAddr, localSockAddr; + if (packet->getPayloadSize() == 0) { - // TODO: We know what size the connect packet should be (minimally) - check for that here return; } @@ -593,6 +593,11 @@ void DomainServer::processConnectRequestPacket(QSharedPointer packet) const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); parseNodeData(packetStream, nodeType, publicSockAddr, localSockAddr, senderSockAddr); + + if (localSockAddr.isNull() || senderSockAddr.isNull()) { + qDebug() << "Unexpected data received for node local socket or public socket. Will not allow connection."; + return; + } // check if this connect request matches an assignment in the queue bool isAssignment = _pendingAssignedNodes.contains(connectUUID); From fe0cdc0529068482081dd1ab132a2df19691038f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 14:35:38 -0700 Subject: [PATCH 540/582] put AvatarHashMap slots back to private --- libraries/avatars/src/AvatarHashMap.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 105282dde3..804233b76a 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -36,14 +36,14 @@ public: public slots: bool isAvatarInRange(const glm::vec3 & position, const float range); +private slots: + void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); + void processAvatarDataPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer sendingNode); void processKillAvatar(QSharedPointer packet, SharedNodePointer sendingNode); -private slots: - void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); - protected: AvatarHashMap(); From 3f4041595a086fb24a721e8ae736209fd73310bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 15:26:04 -0700 Subject: [PATCH 541/582] Fix compile error in connect --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1d215f680a..c1f557f2cc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4113,8 +4113,8 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri connect(workerThread, &QThread::started, scriptEngine, &ScriptEngine::run); // when the thread is terminated, add both scriptEngine and thread to the deleteLater queue - connect(scriptEngine, &ScriptEngine::doneRunning, scriptEngine, &ScriptEngine::deleteLater()); - connect(workerThread, &QThread::finished, workerThread, &Qthread::deleteLater); + connect(scriptEngine, &ScriptEngine::doneRunning, scriptEngine, &ScriptEngine::deleteLater); + connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater); // tell the thread to stop when the script engine is done connect(scriptEngine, &ScriptEngine::destroyed, workerThread, &QThread::quit); From 1e7691941cde6b3c1fe7a68e5e4f6cae6801d879 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 17 Jul 2015 15:27:29 -0700 Subject: [PATCH 542/582] Add raw data read to Packet --- libraries/networking/src/udt/Packet.cpp | 7 +++++++ libraries/networking/src/udt/Packet.h | 3 +++ 2 files changed, 10 insertions(+) diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 3e32a99399..ab757133ca 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -210,6 +210,13 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { &seqNum, sizeof(seqNum)); } +QByteArray Packet::read(qint64 maxSize) { + qint64 sizeToRead = std::min(size() - pos(), maxSize); + QByteArray data { QByteArray::fromRawData(getPayload() + pos(), sizeToRead) }; + seek(pos() + sizeToRead); + return data; +} + qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 4b3c82fa7b..56b63cd702 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -79,6 +79,9 @@ public: virtual bool reset(); virtual qint64 size() const { return _payloadCapacity; } + using QIODevice::read; + QByteArray read(qint64 maxSize); + template qint64 peekPrimitive(T* data); template qint64 readPrimitive(T* data); template qint64 writePrimitive(const T& data); From 9a4cc1308dcb83ea08495972375ebc4b09ad88dd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 15:27:57 -0700 Subject: [PATCH 543/582] fix packet list segment break --- libraries/networking/src/udt/PacketList.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index edf9c4912d..77a324f707 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -83,8 +83,10 @@ qint64 PacketList::writeData(const char* data, qint64 maxSize) { Q_ASSERT(false); } + int segmentSize = _currentPacket->pos() - _segmentStartIndex; + // copy from currentPacket where the segment started to the beginning of the newPacket - newPacket->write(_currentPacket->getPayload() + _segmentStartIndex, numBytesToEnd); + newPacket->write(_currentPacket->getPayload() + _segmentStartIndex, segmentSize); // the current segment now starts at the beginning of the new packet _segmentStartIndex = 0; From d505527e5a810218e23445c221d40e277964950b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 15:38:36 -0700 Subject: [PATCH 544/582] Remove setExtendedheader call --- domain-server/src/DomainServer.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index bd7f476fff..4aee260a20 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -965,26 +965,24 @@ int DomainServer::parseNodeData(QDataStream& packetStream, NodeType_t& nodeType, void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const HifiSockAddr &senderSockAddr, const NodeSet& nodeInterestSet) { - auto limitedNodeList = DependencyManager::get(); - - NLPacketList domainListPackets(PacketType::DomainList); - - // always send the node their own UUID back - QDataStream domainListStream(&domainListPackets); - const int NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES = NUM_BYTES_RFC4122_UUID + NUM_BYTES_RFC4122_UUID + 2; - + // setup the extended header for the domain list packets // this data is at the beginning of each of the domain list packets QByteArray extendedHeader(NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES, 0); QDataStream extendedHeaderStream(&extendedHeader, QIODevice::WriteOnly); - + extendedHeaderStream << limitedNodeList->getSessionUUID(); extendedHeaderStream << node->getUUID(); extendedHeaderStream << (quint8) node->getCanAdjustLocks(); extendedHeaderStream << (quint8) node->getCanRez(); + + auto limitedNodeList = DependencyManager::get(); - domainListPackets.setExtendedHeader(extendedHeader); + NLPacketList domainListPackets(PacketType::DomainList, extendedHeader); + + // always send the node their own UUID back + QDataStream domainListStream(&domainListPackets); DomainServerNodeData* nodeData = reinterpret_cast(node->getLinkedData()); From e3f7c33767f21c1a517cb1a6ce65d0ac615d0273 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 15:39:25 -0700 Subject: [PATCH 545/582] Fix index check in setJointRotation --- interface/src/avatar/SkeletonModel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 0a981706da..85e0a3d1f8 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -270,12 +270,12 @@ void SkeletonModel::applyPalmData(int jointIndex, PalmData& palm) { } void SkeletonModel::updateJointState(int index) { - if (index > _jointStates.size()) { + if (index < 0 && index >= _jointStates.size()) { return; // bail } JointState& state = _jointStates[index]; const FBXJoint& joint = state.getFBXJoint(); - if (joint.parentIndex != -1 && joint.parentIndex <= _jointStates.size()) { + if (joint.parentIndex >= 0 && joint.parentIndex < _jointStates.size()) { const JointState& parentState = _jointStates.at(joint.parentIndex); const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (index == geometry.leanJointIndex) { From 0f534b9f7bd75904d6ad6a9dd045efc33c45911f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 15:43:20 -0700 Subject: [PATCH 546/582] fixes for new read and NLPacketList --- assignment-client/src/AssignmentClientMonitor.cpp | 3 +-- .../src/avatars/AvatarMixerClientData.cpp | 4 +--- domain-server/src/DomainServer.cpp | 4 ++-- libraries/audio/src/InboundAudioStream.cpp | 9 ++------- libraries/avatars/src/AvatarHashMap.cpp | 4 ++-- libraries/networking/src/NLPacketList.cpp | 11 ++++++++++- libraries/networking/src/NLPacketList.h | 1 + libraries/networking/src/udt/PacketList.cpp | 12 ++++++++++-- libraries/networking/src/udt/PacketList.h | 5 ++--- 9 files changed, 31 insertions(+), 22 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index ba2baad12b..d6082c3bc4 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -204,8 +204,7 @@ void AssignmentClientMonitor::checkSpares() { void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { // read out the sender ID - QUuid senderID = QUuid::fromRfc4122(QByteArray::fromRawData(packet->getPayload(), NUM_BYTES_RFC4122_UUID)); - packet->seek(NUM_BYTES_RFC4122_UUID); + QUuid senderID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); auto nodeList = DependencyManager::get(); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index de2e1ac143..fec51f76cb 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -15,9 +15,7 @@ int AvatarMixerClientData::parseData(NLPacket& packet) { // compute the offset to the data payload - QByteArray byteArray = QByteArray::fromRawData(packet.getPayload() + packet.pos(), - packet.bytesLeftToRead()); - return _avatar.parseDataFromBuffer(byteArray); + return _avatar.parseDataFromBuffer(packet.read(packet.bytesLeftToRead())); } bool AvatarMixerClientData::checkAndSetHasReceivedFirstPackets() { diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 4aee260a20..c13de0449e 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -971,13 +971,13 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif // this data is at the beginning of each of the domain list packets QByteArray extendedHeader(NUM_DOMAIN_LIST_EXTENDED_HEADER_BYTES, 0); QDataStream extendedHeaderStream(&extendedHeader, QIODevice::WriteOnly); + + auto limitedNodeList = DependencyManager::get(); extendedHeaderStream << limitedNodeList->getSessionUUID(); extendedHeaderStream << node->getUUID(); extendedHeaderStream << (quint8) node->getCanAdjustLocks(); extendedHeaderStream << (quint8) node->getCanRez(); - - auto limitedNodeList = DependencyManager::get(); NLPacketList domainListPackets(PacketType::DomainList, extendedHeader); diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index deb12a6649..96515e007a 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -112,9 +112,7 @@ int InboundAudioStream::parseData(NLPacket& packet) { int networkSamples; // parse the info after the seq number and before the audio data (the stream properties) - int propertyBytes = parseStreamProperties(packet.getType(), - QByteArray::fromRawData(packet.getPayload() + packet.pos(), packet.bytesLeftToRead()), - networkSamples); + int propertyBytes = parseStreamProperties(packet.getType(), packet.read(packet.bytesLeftToRead()), networkSamples); packet.seek(packet.pos() + propertyBytes); // handle this packet based on its arrival status. @@ -133,10 +131,7 @@ int InboundAudioStream::parseData(NLPacket& packet) { if (packet.getType() == PacketType::SilentAudioFrame) { writeDroppableSilentSamples(networkSamples); } else { - int audioBytes = parseAudioData(packet.getType(), - QByteArray::fromRawData(packet.getPayload() + packet.pos(), - packet.bytesLeftToRead()), - networkSamples); + int audioBytes = parseAudioData(packet.getType(), packet.read(packet.bytesLeftToRead()), networkSamples); packet.seek(packet.pos() + audioBytes); } break; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 75465f0bc5..2540693088 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -55,8 +55,8 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha while (packet->bytesLeftToRead()) { QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); - QByteArray byteArray = QByteArray::fromRawData(packet->getPayload() + packet->pos(), - packet->bytesLeftToRead()); + QByteArray byteArray = packet->read(packet->bytesLeftToRead()); + if (sessionUUID != _lastOwnerSessionUUID) { AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { diff --git a/libraries/networking/src/NLPacketList.cpp b/libraries/networking/src/NLPacketList.cpp index 7ac9fe11c3..5f3770b4a4 100644 --- a/libraries/networking/src/NLPacketList.cpp +++ b/libraries/networking/src/NLPacketList.cpp @@ -13,7 +13,16 @@ #include "NLPacket.h" -NLPacketList::NLPacketList(PacketType::Value packetType) : PacketList(packetType) { +NLPacketList::NLPacketList(PacketType::Value packetType) : + PacketList(packetType) +{ + +} + +NLPacketList::NLPacketList(PacketType::Value packetType, const QByteArray& extendedHeader) : + PacketList(packetType, extendedHeader) +{ + } std::unique_ptr NLPacketList::createPacket() { diff --git a/libraries/networking/src/NLPacketList.h b/libraries/networking/src/NLPacketList.h index a1a483781d..57581e8e12 100644 --- a/libraries/networking/src/NLPacketList.h +++ b/libraries/networking/src/NLPacketList.h @@ -17,6 +17,7 @@ class NLPacketList : public PacketList { public: NLPacketList(PacketType::Value packetType); + NLPacketList(PacketType::Value packetType, const QByteArray& extendedHeader); private: NLPacketList(const NLPacketList& other) = delete; diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 77a324f707..20f6971b83 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -18,11 +18,18 @@ PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType) { + +} + +PacketList::PacketList(PacketType::Value packetType, const QByteArray& extendedHeader) : + _packetType(packetType), + _extendedHeader(extendedHeader) +{ QIODevice::open(WriteOnly); } void PacketList::startSegment() { - _segmentStartIndex = _currentPacket ? _currentPacket->pos() : 0; + _segmentStartIndex = _currentPacket ? _currentPacket->pos() : _extendedHeader.size(); } void PacketList::endSegment() { @@ -39,6 +46,7 @@ std::unique_ptr PacketList::createPacketWithExtendedHeader() { auto packet = createPacket(); if (!_extendedHeader.isEmpty()) { + qDebug() << "Writing a header of" << _extendedHeader.size(); // add the extended header to the front of the packet if (packet->write(_extendedHeader) == -1) { qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" @@ -89,7 +97,7 @@ qint64 PacketList::writeData(const char* data, qint64 maxSize) { newPacket->write(_currentPacket->getPayload() + _segmentStartIndex, segmentSize); // the current segment now starts at the beginning of the new packet - _segmentStartIndex = 0; + _segmentStartIndex = _extendedHeader.size(); // shrink the current payload to the actual size of the packet _currentPacket->setPayloadSize(_segmentStartIndex); diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 0a1bdd080a..2e1413d66b 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -22,6 +22,7 @@ class PacketList : public QIODevice { Q_OBJECT public: PacketList(PacketType::Value packetType); + PacketList(PacketType::Value packetType, const QByteArray& extendedHeader); virtual bool isSequential() const { return true; } @@ -33,8 +34,6 @@ public: void closeCurrentPacket(bool shouldSendEmpty = false); - void setExtendedHeader(const QByteArray& extendedHeader) { _extendedHeader = extendedHeader; } - template qint64 readPrimitive(T* data); template qint64 writePrimitive(const T& data); protected: @@ -83,4 +82,4 @@ template std::unique_ptr PacketList::takeFront() { return std::unique_ptr(dynamic_cast(packet.release())); } -#endif // hifi_PacketList_h \ No newline at end of file +#endif // hifi_PacketList_h From 9c9c3d5120fb433f20b0a7020dc0579bd3238be2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 15:44:17 -0700 Subject: [PATCH 547/582] remove extra debug in PacketList --- libraries/networking/src/udt/PacketList.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 20f6971b83..e988afd9a3 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -46,7 +46,6 @@ std::unique_ptr PacketList::createPacketWithExtendedHeader() { auto packet = createPacket(); if (!_extendedHeader.isEmpty()) { - qDebug() << "Writing a header of" << _extendedHeader.size(); // add the extended header to the front of the packet if (packet->write(_extendedHeader) == -1) { qDebug() << "Could not write extendedHeader in PacketList::createPacketWithExtendedHeader" From b71678dfdb5e7c86261a3f9fe5de010b02edd6c7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 15:47:37 -0700 Subject: [PATCH 548/582] repair constructor that takes QByteArray in PacketList --- libraries/networking/src/NLPacketList.cpp | 8 +------- libraries/networking/src/NLPacketList.h | 3 +-- libraries/networking/src/udt/PacketList.cpp | 8 +------- libraries/networking/src/udt/PacketList.h | 3 +-- 4 files changed, 4 insertions(+), 18 deletions(-) diff --git a/libraries/networking/src/NLPacketList.cpp b/libraries/networking/src/NLPacketList.cpp index 5f3770b4a4..8c794cf5f8 100644 --- a/libraries/networking/src/NLPacketList.cpp +++ b/libraries/networking/src/NLPacketList.cpp @@ -13,13 +13,7 @@ #include "NLPacket.h" -NLPacketList::NLPacketList(PacketType::Value packetType) : - PacketList(packetType) -{ - -} - -NLPacketList::NLPacketList(PacketType::Value packetType, const QByteArray& extendedHeader) : +NLPacketList::NLPacketList(PacketType::Value packetType, QByteArray extendedHeader) : PacketList(packetType, extendedHeader) { diff --git a/libraries/networking/src/NLPacketList.h b/libraries/networking/src/NLPacketList.h index 57581e8e12..28fbde9112 100644 --- a/libraries/networking/src/NLPacketList.h +++ b/libraries/networking/src/NLPacketList.h @@ -16,8 +16,7 @@ class NLPacketList : public PacketList { public: - NLPacketList(PacketType::Value packetType); - NLPacketList(PacketType::Value packetType, const QByteArray& extendedHeader); + NLPacketList(PacketType::Value packetType, QByteArray extendedHeader = QByteArray()); private: NLPacketList(const NLPacketList& other) = delete; diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index e988afd9a3..5dcacfa9b1 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -15,13 +15,7 @@ #include "Packet.h" -PacketList::PacketList(PacketType::Value packetType) : - _packetType(packetType) -{ - -} - -PacketList::PacketList(PacketType::Value packetType, const QByteArray& extendedHeader) : +PacketList::PacketList(PacketType::Value packetType, QByteArray extendedHeader) : _packetType(packetType), _extendedHeader(extendedHeader) { diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 2e1413d66b..5ab3029a60 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -21,8 +21,7 @@ class Packet; class PacketList : public QIODevice { Q_OBJECT public: - PacketList(PacketType::Value packetType); - PacketList(PacketType::Value packetType, const QByteArray& extendedHeader); + PacketList(PacketType::Value packetType, QByteArray extendedHeader = QByteArray()); virtual bool isSequential() const { return true; } From 35c8a60f3bea3c6c688bfc1aaa347209000968ad Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 15:57:52 -0700 Subject: [PATCH 549/582] seek to correct place for bulk avatar data --- libraries/avatars/src/AvatarHashMap.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 2540693088..0c84a0c379 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -54,6 +54,8 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha // only add them if mixerWeakPointer points to something (meaning that mixer is still around) while (packet->bytesLeftToRead()) { QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); + + int positionBeforeRead = packet->pos(); QByteArray byteArray = packet->read(packet->bytesLeftToRead()); @@ -62,15 +64,15 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha if (!avatar) { avatar = addAvatar(sessionUUID, sendingNode); } - + // have the matching (or new) avatar parse the data from the packet int bytesRead = avatar->parseDataFromBuffer(byteArray); - packet->seek(packet->pos() + bytesRead); + packet->seek(positionBeforeRead + bytesRead); } else { // create a dummy AvatarData class to throw this data on the ground AvatarData dummyData; int bytesRead = dummyData.parseDataFromBuffer(byteArray); - packet->seek(packet->pos() + bytesRead); + packet->seek(positionBeforeRead + bytesRead); } } } From 151481d5bf9ad7b52b919c58354b07a6b0aad052 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 15:58:58 -0700 Subject: [PATCH 550/582] Remove seek --- libraries/audio/src/InboundAudioStream.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 96515e007a..31525f0e7a 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -112,8 +112,9 @@ int InboundAudioStream::parseData(NLPacket& packet) { int networkSamples; // parse the info after the seq number and before the audio data (the stream properties) + int oldPos = packet.pos(); int propertyBytes = parseStreamProperties(packet.getType(), packet.read(packet.bytesLeftToRead()), networkSamples); - packet.seek(packet.pos() + propertyBytes); + packet.seek(oldPos + propertyBytes); // handle this packet based on its arrival status. switch (arrivalInfo._status) { From 39272652e57ba3be6c23a992912e618189f96b2a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 15:59:24 -0700 Subject: [PATCH 551/582] fix seeks in InboundAudioStream --- libraries/audio/src/InboundAudioStream.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 96515e007a..15f1ad8746 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -112,9 +112,10 @@ int InboundAudioStream::parseData(NLPacket& packet) { int networkSamples; // parse the info after the seq number and before the audio data (the stream properties) + int prePropertyPosition = packet.pos(); int propertyBytes = parseStreamProperties(packet.getType(), packet.read(packet.bytesLeftToRead()), networkSamples); - packet.seek(packet.pos() + propertyBytes); - + packet.seek(prePropertyPosition + propertyBytes); + // handle this packet based on its arrival status. switch (arrivalInfo._status) { case SequenceNumberStats::Early: { @@ -132,7 +133,6 @@ int InboundAudioStream::parseData(NLPacket& packet) { writeDroppableSilentSamples(networkSamples); } else { int audioBytes = parseAudioData(packet.getType(), packet.read(packet.bytesLeftToRead()), networkSamples); - packet.seek(packet.pos() + audioBytes); } break; } From 331bb54144c92f12cb9d0d1339dfb86ef8efeb44 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 15:59:39 -0700 Subject: [PATCH 552/582] remove unused variable --- libraries/audio/src/InboundAudioStream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 15f1ad8746..6286434588 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -132,7 +132,7 @@ int InboundAudioStream::parseData(NLPacket& packet) { if (packet.getType() == PacketType::SilentAudioFrame) { writeDroppableSilentSamples(networkSamples); } else { - int audioBytes = parseAudioData(packet.getType(), packet.read(packet.bytesLeftToRead()), networkSamples); + parseAudioData(packet.getType(), packet.read(packet.bytesLeftToRead()), networkSamples); } break; } From 487f9dc45dae003d592c998dd9ea252a9b789e76 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 16:17:10 -0700 Subject: [PATCH 553/582] add atomic include for NetworkPeer --- libraries/networking/src/NetworkPeer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/networking/src/NetworkPeer.h b/libraries/networking/src/NetworkPeer.h index 1c39ad96e1..1e03677587 100644 --- a/libraries/networking/src/NetworkPeer.h +++ b/libraries/networking/src/NetworkPeer.h @@ -12,6 +12,8 @@ #ifndef hifi_NetworkPeer_h #define hifi_NetworkPeer_h +#include + #include #include #include From 30ee80313e979cfe757bc77a790c2f004fd1e407 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 16:18:58 -0700 Subject: [PATCH 554/582] add memory include for PacketList --- libraries/networking/src/udt/PacketList.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 5ab3029a60..30288dcaab 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -12,6 +12,8 @@ #ifndef hifi_PacketList_h #define hifi_PacketList_h +#include + #include #include "PacketHeaders.h" From 1a1c2d6bbe65d3dc811adb7d240252df8ea8a110 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 16:20:53 -0700 Subject: [PATCH 555/582] prepend module to QIODevice include --- libraries/networking/src/udt/Packet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 56b63cd702..94fd28f2b8 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -14,7 +14,7 @@ #include -#include +#include #include "../HifiSockAddr.h" #include "PacketHeaders.h" From c846efb203814a4ab6d83bbb03b9f0794b5bb26f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 16:24:25 -0700 Subject: [PATCH 556/582] fix type in Packet constructor --- libraries/networking/src/udt/Packet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 94fd28f2b8..33fa8134bc 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -87,7 +87,7 @@ public: template qint64 writePrimitive(const T& data); protected: - Packet(PacketType::Value type, int64_t size); + Packet(PacketType::Value type, qint64 size); Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); Packet(const Packet& other); Packet& operator=(const Packet& other); From 6419e49f4bdfa8956a6c24dd2fa897bf728b1151 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 16:35:26 -0700 Subject: [PATCH 557/582] call QIODevice constructor from Packet copy --- libraries/networking/src/udt/Packet.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index ab757133ca..5be229e129 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -100,8 +100,11 @@ Packet::Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& send _payloadStart = _packet.get() + (_packetSize - _payloadCapacity); } -Packet::Packet(const Packet& other) { +Packet::Packet(const Packet& other) : + QIODevice() +{ *this = other; + this->seek(other.pos()); } Packet& Packet::operator=(const Packet& other) { From 9794770815e6244180f224b54aa2647ab8c079f2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 17 Jul 2015 16:38:20 -0700 Subject: [PATCH 558/582] put back correct include for memcpy --- libraries/environment/src/EnvironmentData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/environment/src/EnvironmentData.cpp b/libraries/environment/src/EnvironmentData.cpp index 89153893d8..4cb8f7a010 100644 --- a/libraries/environment/src/EnvironmentData.cpp +++ b/libraries/environment/src/EnvironmentData.cpp @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include #include "EnvironmentData.h" From c6e471256d9f35dc7962de4ffce04ac32fccd2b0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 17 Jul 2015 16:55:45 -0700 Subject: [PATCH 559/582] Fix atomic construction --- libraries/networking/src/NetworkPeer.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/NetworkPeer.cpp b/libraries/networking/src/NetworkPeer.cpp index 2e98c096ab..9af0729a22 100644 --- a/libraries/networking/src/NetworkPeer.cpp +++ b/libraries/networking/src/NetworkPeer.cpp @@ -30,10 +30,9 @@ NetworkPeer::NetworkPeer(QObject* parent) : _symmetricSocket(), _activeSocket(NULL), _wakeTimestamp(QDateTime::currentMSecsSinceEpoch()), - _lastHeardMicrostamp(usecTimestampNow()), _connectionAttempts(0) { - + _lastHeardMicrostamp.store(usecTimestampNow()); } NetworkPeer::NetworkPeer(const QUuid& uuid, const HifiSockAddr& publicSocket, const HifiSockAddr& localSocket, QObject* parent) : @@ -44,10 +43,9 @@ NetworkPeer::NetworkPeer(const QUuid& uuid, const HifiSockAddr& publicSocket, co _symmetricSocket(), _activeSocket(NULL), _wakeTimestamp(QDateTime::currentMSecsSinceEpoch()), - _lastHeardMicrostamp(usecTimestampNow()), _connectionAttempts(0) { - + _lastHeardMicrostamp.store(usecTimestampNow()); } void NetworkPeer::setPublicSocket(const HifiSockAddr& publicSocket) { From d68618e2065310d09535f4c0551bdeb1d7e73740 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 00:46:09 -0700 Subject: [PATCH 560/582] Removing GL headers from most files, and some naked GL from application.cpp --- interface/src/Application.cpp | 93 ++--- interface/src/Application.h | 7 +- interface/src/GLCanvas.h | 1 + interface/src/Stars.cpp | 105 ++++-- interface/src/Stars.h | 26 +- interface/src/audio/AudioScope.cpp | 2 - interface/src/avatar/Avatar.cpp | 5 +- interface/src/avatar/Hand.cpp | 3 - interface/src/avatar/Hand.h | 1 - interface/src/avatar/Head.cpp | 1 - interface/src/avatar/Head.h | 1 - interface/src/avatar/MyAvatar.cpp | 1 - interface/src/devices/OculusManager.cpp | 7 +- interface/src/devices/OculusManager.h | 4 +- .../src/octree/OctreePacketProcessor.cpp | 1 - interface/src/starfield/Config.h | 62 ---- interface/src/starfield/Controller.cpp | 70 ---- interface/src/starfield/Controller.h | 44 --- interface/src/starfield/Generator.cpp | 94 ----- interface/src/starfield/Generator.h | 40 --- interface/src/starfield/data/GpuVertex.cpp | 26 -- interface/src/starfield/data/GpuVertex.h | 37 -- interface/src/starfield/data/InputVertex.cpp | 27 -- interface/src/starfield/data/InputVertex.h | 39 --- interface/src/starfield/data/Tile.h | 32 -- interface/src/starfield/renderer/Renderer.cpp | 324 ------------------ interface/src/starfield/renderer/Renderer.h | 142 -------- interface/src/starfield/renderer/Tiling.h | 48 --- .../src/starfield/renderer/VertexOrder.cpp | 20 -- .../src/starfield/renderer/VertexOrder.h | 41 --- interface/src/ui/ApplicationOverlay.cpp | 3 - interface/src/ui/Stats.cpp | 2 - interface/src/ui/Stats.h | 7 +- .../src/EntityTreeRenderer.cpp | 3 - .../src/RenderableBoxEntityItem.cpp | 1 - .../src/RenderableDebugableEntityItem.cpp | 1 - .../src/RenderableLightEntityItem.cpp | 1 - .../src/RenderableLineEntityItem.cpp | 1 - .../src/RenderableModelEntityItem.cpp | 2 - .../RenderableParticleEffectEntityItem.cpp | 2 - .../src/RenderablePolyVoxEntityItem.cpp | 2 - .../src/RenderableSphereEntityItem.cpp | 1 - .../src/RenderableTextEntityItem.cpp | 2 - .../src/RenderableWebEntityItem.cpp | 6 +- .../src/RenderableZoneEntityItem.cpp | 1 - libraries/gpu/src/gpu/Batch.cpp | 17 + libraries/gpu/src/gpu/Batch.h | 70 ++-- libraries/gpu/src/gpu/GLBackend.cpp | 1 + libraries/gpu/src/gpu/GLBackend.h | 2 + libraries/gpu/src/gpu/GLBackendOutput.cpp | 19 + libraries/gpu/src/gpu/Query.h | 1 - .../src/AmbientOcclusionEffect.cpp | 3 - .../render-utils/src/AmbientOcclusionEffect.h | 3 +- .../src/DeferredLightingEffect.cpp | 10 +- .../render-utils/src/DeferredLightingEffect.h | 2 - libraries/render-utils/src/Environment.h | 1 - libraries/render-utils/src/GeometryCache.cpp | 2 - libraries/render-utils/src/GeometryCache.h | 11 +- libraries/render-utils/src/Model.cpp | 2 - libraries/render-utils/src/Model.h | 3 - .../render-utils/src/OffscreenGlCanvas.cpp | 25 +- .../render-utils/src/OffscreenGlCanvas.h | 11 +- .../render-utils/src/OffscreenQmlSurface.cpp | 38 +- .../render-utils/src/OffscreenQmlSurface.h | 41 +-- .../render-utils/src/RenderDeferredTask.cpp | 13 +- libraries/render-utils/src/RenderUtil.cpp | 2 - libraries/render-utils/src/TextRenderer3D.cpp | 2 - libraries/render-utils/src/TextureCache.cpp | 23 -- libraries/render-utils/src/TextureCache.h | 16 +- libraries/render-utils/src/text/Font.cpp | 2 +- libraries/render/src/render/DrawStatus.cpp | 16 +- libraries/render/src/render/DrawTask.cpp | 15 +- libraries/shared/src/RenderArgs.h | 1 + libraries/shared/src/windowshacks.h | 7 + libraries/ui/src/OffscreenQmlElement.h | 82 +++++ libraries/ui/src/OffscreenUi.cpp | 2 +- libraries/ui/src/OffscreenUi.h | 65 +--- 77 files changed, 396 insertions(+), 1451 deletions(-) delete mode 100644 interface/src/starfield/Config.h delete mode 100644 interface/src/starfield/Controller.cpp delete mode 100644 interface/src/starfield/Controller.h delete mode 100644 interface/src/starfield/Generator.cpp delete mode 100644 interface/src/starfield/Generator.h delete mode 100644 interface/src/starfield/data/GpuVertex.cpp delete mode 100644 interface/src/starfield/data/GpuVertex.h delete mode 100644 interface/src/starfield/data/InputVertex.cpp delete mode 100644 interface/src/starfield/data/InputVertex.h delete mode 100644 interface/src/starfield/data/Tile.h delete mode 100644 interface/src/starfield/renderer/Renderer.cpp delete mode 100644 interface/src/starfield/renderer/Renderer.h delete mode 100644 interface/src/starfield/renderer/Tiling.h delete mode 100644 interface/src/starfield/renderer/VertexOrder.cpp delete mode 100644 interface/src/starfield/renderer/VertexOrder.h create mode 100644 libraries/ui/src/OffscreenQmlElement.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1aa9fe0427..45fd7ebc09 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -84,7 +84,6 @@ #include #include #include -#include #include #include #include @@ -100,6 +99,7 @@ #include "Application.h" #include "AudioClient.h" #include "DiscoverabilityManager.h" +#include "GLCanvas.h" #include "InterfaceVersion.h" #include "LODManager.h" #include "Menu.h" @@ -174,8 +174,6 @@ public: using namespace std; // Starfield information -static unsigned STARFIELD_NUM_STARS = 50000; -static unsigned STARFIELD_SEED = 1; static uint8_t THROTTLED_IDLE_TIMER_DELAY = 10; const qint64 MAXIMUM_CACHE_SIZE = 10 * BYTES_PER_GIGABYTES; // 10GB @@ -343,7 +341,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _domainConnectionRefusals(QList()), _maxOctreePPS(maxOctreePacketsPerSecond.get()), _lastFaceTrackerUpdate(0), - _applicationOverlay() + _applicationOverlay(), + _glWidget(new GLCanvas()) { setInstance(this); #ifdef Q_OS_WIN @@ -976,39 +975,41 @@ void Application::paintGL() { } else { PROFILE_RANGE(__FUNCTION__ "/mainRender"); - auto primaryFBO = DependencyManager::get()->getPrimaryFramebuffer(); - GLuint fbo = gpu::GLBackend::getFramebufferID(primaryFBO); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // Viewport is assigned to the size of the framebuffer - QSize size = DependencyManager::get()->getFrameBufferSize(); - glViewport(0, 0, size.width(), size.height()); - renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + { + gpu::Batch batch; + auto primaryFbo = DependencyManager::get()->getPrimaryFramebuffer(); + batch.setFramebuffer(primaryFbo); + // clear the normal and specular buffers + batch.clearFramebuffer( + gpu::Framebuffer::BUFFER_COLOR0 | + gpu::Framebuffer::BUFFER_COLOR1 | + gpu::Framebuffer::BUFFER_COLOR2 | + gpu::Framebuffer::BUFFER_DEPTH, + vec4(vec3(0), 1), 1.0, 0.0); + + // Viewport is assigned to the size of the framebuffer + QSize size = DependencyManager::get()->getFrameBufferSize(); + renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); + batch.setViewportTransform(renderArgs._viewport); + renderArgs._context->render(batch); + } + displaySide(&renderArgs, _myCamera); - glPopMatrix(); - renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { renderRearViewMirror(&renderArgs, _mirrorViewRect); } - renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; - auto finalFbo = DependencyManager::get()->getPrimaryFramebuffer(); - - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - glBindFramebuffer(GL_READ_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo)); - glBlitFramebuffer(0, 0, _renderResolution.x, _renderResolution.y, - 0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height(), - GL_COLOR_BUFFER_BIT, GL_LINEAR); - glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); - - glBindTexture(GL_TEXTURE_2D, 0); // ??? + { + auto geometryCache = DependencyManager::get(); + auto primaryFbo = DependencyManager::get()->getPrimaryFramebuffer(); + gpu::Batch batch; + batch.blit(primaryFbo, glm::ivec4(0, 0, _renderResolution.x, _renderResolution.y), + nullptr, glm::ivec4(0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height())); + renderArgs._context->render(batch); + } _compositor.displayOverlayTexture(&renderArgs); } @@ -1078,11 +1079,7 @@ void Application::resizeGL() { if (_renderResolution != toGlm(renderSize)) { _renderResolution = toGlm(renderSize); DependencyManager::get()->setFrameBufferSize(renderSize); - - glViewport(0, 0, _renderResolution.x, _renderResolution.y); // shouldn't this account for the menu??? - updateProjectionMatrix(); - glLoadIdentity(); } resetCameras(_myCamera, _renderResolution); @@ -1101,16 +1098,10 @@ void Application::updateProjectionMatrix() { void Application::updateProjectionMatrix(Camera& camera, bool updateViewFrustum) { _projectionMatrix = camera.getProjection(); - - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(glm::value_ptr(_projectionMatrix)); - // Tell our viewFrustum about this change, using the application camera if (updateViewFrustum) { loadViewFrustum(camera, _viewFrustum); } - - glMatrixMode(GL_MODELVIEW); } void Application::controlledBroadcastToNodes(const QByteArray& packet, const NodeSet& destinationNodeTypes) { @@ -1954,7 +1945,6 @@ void Application::setEnableVRMode(bool enableVRMode) { OculusManager::connect(_glWidget->context()->contextHandle()); _glWidget->setFocus(); _glWidget->makeCurrent(); - glClear(GL_COLOR_BUFFER_BIT); } OculusManager::recalibrate(); } else { @@ -2157,12 +2147,6 @@ QVector Application::pasteEntities(float x, float y, float z) { } void Application::initDisplay() { - glEnable(GL_BLEND); - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); - glShadeModel(GL_SMOOTH); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_DEPTH_TEST); } void Application::init() { @@ -3322,9 +3306,6 @@ namespace render { PerformanceTimer perfTimer("stars"); PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::payloadRender() ... stars..."); - if (!background->_stars.isStarsLoaded()) { - background->_stars.generate(STARFIELD_NUM_STARS, STARFIELD_SEED); - } // should be the first rendering pass - w/o depth buffer / lighting // compute starfield alpha based on distance from atmosphere @@ -3372,7 +3353,7 @@ namespace render { // finally render the starfield if (hasStars) { - background->_stars.render(args->_viewFrustum->getFieldOfView(), args->_viewFrustum->getAspectRatio(), args->_viewFrustum->getNearClip(), alpha); + background->_stars.render(args, alpha); } // draw the sky dome @@ -3416,14 +3397,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se // load the view frustum loadViewFrustum(theCamera, _displayViewFrustum); - // transform view according to theCamera - // could be myCamera (if in normal mode) - // or could be viewFrustumOffsetCamera if in offset mode - - glm::quat rotation = theCamera.getRotation(); - glm::vec3 axis = glm::axis(rotation); - glRotatef(-glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - // store view matrix without translation, which we'll use for precision-sensitive objects updateUntranslatedViewMatrix(-theCamera.getPosition()); @@ -3432,7 +3405,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se // this is what is used for rendering the Entities and avatars Transform viewTransform; viewTransform.setTranslation(theCamera.getPosition()); - viewTransform.setRotation(rotation); + viewTransform.setRotation(theCamera.getRotation()); if (renderArgs->_renderSide != RenderArgs::MONO) { glm::mat4 invView = glm::inverse(_untranslatedViewMatrix); @@ -3442,8 +3415,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se setViewTransform(viewTransform); - glTranslatef(_viewMatrixTranslation.x, _viewMatrixTranslation.y, _viewMatrixTranslation.z); - // Setup 3D lights (after the camera transform, so that they are positioned in world space) { PerformanceTimer perfTimer("lights"); diff --git a/interface/src/Application.h b/interface/src/Application.h index 1fe1acb25a..c5445db1e8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -12,8 +12,6 @@ #ifndef hifi_Application_h #define hifi_Application_h -#include - #include #include #include @@ -47,7 +45,6 @@ #include "DatagramProcessor.h" #include "Environment.h" #include "FileLogger.h" -#include "GLCanvas.h" #include "Menu.h" #include "PacketHeaders.h" #include "Physics.h" @@ -84,10 +81,10 @@ class QSystemTrayIcon; class QTouchEvent; class QWheelEvent; +class GLCanvas; class FaceTracker; class MainWindow; class Node; -class ProgramObject; class ScriptEngine; static const QString SNAPSHOT_EXTENSION = ".jpg"; @@ -647,7 +644,7 @@ private: QThread _settingsThread; QTimer _settingsTimer; - GLCanvas* _glWidget = new GLCanvas(); // our GLCanvas has a couple extra features + GLCanvas* _glWidget{ nullptr }; void checkSkeleton(); diff --git a/interface/src/GLCanvas.h b/interface/src/GLCanvas.h index 6c53a17e04..925061edd0 100644 --- a/interface/src/GLCanvas.h +++ b/interface/src/GLCanvas.h @@ -13,6 +13,7 @@ #define hifi_GLCanvas_h #include +#include #include #include diff --git a/interface/src/Stars.cpp b/interface/src/Stars.cpp index ab7507a228..ce43f3761d 100644 --- a/interface/src/Stars.cpp +++ b/interface/src/Stars.cpp @@ -13,37 +13,94 @@ #include -#include "InterfaceConfig.h" -#include "starfield/Controller.h" - -Stars::Stars() : - _controller(0l), _starsLoaded(false) { - _controller = new starfield::Controller; +Stars::Stars() { } Stars::~Stars() { - delete _controller; } -bool Stars::generate(unsigned numStars, unsigned seed) { - _starsLoaded = _controller->computeStars(numStars, seed); - return _starsLoaded; +void Stars::render(RenderArgs* args, float alpha) { } -bool Stars::setResolution(unsigned k) { - return _controller->setResolution(k); + +/* +static unsigned STARFIELD_NUM_STARS = 50000; +static unsigned STARFIELD_SEED = 1; +const float Generator::STAR_COLORIZATION = 0.1f; +const float PI_OVER_180 = 3.14159265358979f / 180.0f; + +void Generator::computeStarPositions(InputVertices& destination, unsigned limit, unsigned seed) { + InputVertices* vertices = &destination; + //_limit = limit; + + QElapsedTimer startTime; + startTime.start(); + + srand(seed); + + vertices->clear(); + vertices->reserve(limit); + + const unsigned MILKY_WAY_WIDTH = 12.0; // width in degrees of one half of the Milky Way + const float MILKY_WAY_INCLINATION = 0.0f; // angle of Milky Way from horizontal in degrees + const float MILKY_WAY_RATIO = 0.4f; + const unsigned NUM_DEGREES = 360; + + for (int star = 0; star < floor(limit * (1 - MILKY_WAY_RATIO)); ++star) { + float azimuth, altitude; + azimuth = (((float)rand() / (float)RAND_MAX) * NUM_DEGREES) - (NUM_DEGREES / 2); + altitude = (acos((2.0f * ((float)rand() / (float)RAND_MAX)) - 1.0f) / PI_OVER_180) + 90; + vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION))); + } + + for (int star = 0; star < ceil(limit * MILKY_WAY_RATIO); ++star) { + float azimuth = ((float)rand() / (float)RAND_MAX) * NUM_DEGREES; + float altitude = powf(randFloat()*0.5f, 2.0f) / 0.25f * MILKY_WAY_WIDTH; + if (randFloat() > 0.5f) { + altitude *= -1.0f; + } + + // we need to rotate the Milky Way band to the correct orientation in the sky + // convert from spherical coordinates to cartesian, rotate the point and then convert back. + // An improvement would be to convert all stars to cartesian at this point and not have to convert back. + + float tempX = sin(azimuth * PI_OVER_180) * cos(altitude * PI_OVER_180); + float tempY = sin(altitude * PI_OVER_180); + float tempZ = -cos(azimuth * PI_OVER_180) * cos(altitude * PI_OVER_180); + + float xangle = MILKY_WAY_INCLINATION * PI_OVER_180; + float newX = (tempX * cos(xangle)) - (tempY * sin(xangle)); + float newY = (tempX * sin(xangle)) + (tempY * cos(xangle)); + float newZ = tempZ; + + azimuth = (atan2(newX, -newZ) + Radians::pi()) / PI_OVER_180; + altitude = atan2(-newY, hypotf(newX, newZ)) / PI_OVER_180; + + vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION))); + } + + double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms + qDebug() << "Total time to generate stars: " << timeDiff << " msec"; } -void Stars::render(float fovY, float aspect, float nearZ, float alpha) { - // determine length of screen diagonal from quadrant height and aspect ratio - float quadrantHeight = nearZ * tanf(RADIANS_PER_DEGREE * fovY * 0.5f); - float halfDiagonal = sqrt(quadrantHeight * quadrantHeight * (1.0f + aspect * aspect)); - - // determine fov angle in respect to the diagonal - float fovDiagonal = atanf(halfDiagonal / nearZ) * 2.0f; - - // pull the modelview matrix off the GL stack - glm::mat4 view; glGetFloatv(GL_MODELVIEW_MATRIX, glm::value_ptr(view)); - - _controller->render(fovDiagonal, aspect, glm::affineInverse(view), alpha); +// computeStarColor +// - Generate a star color. +// +// colorization can be a value between 0 and 1 specifying how colorful the resulting star color is. +// +// 0 = completely black & white +// 1 = very colorful +unsigned Generator::computeStarColor(float colorization) { + unsigned char red, green, blue; + if (randFloat() < 0.3f) { + // A few stars are colorful + red = 2 + (rand() % 254); + green = 2 + round((red * (1 - colorization)) + ((rand() % 254) * colorization)); + blue = 2 + round((red * (1 - colorization)) + ((rand() % 254) * colorization)); + } else { + // Most stars are dimmer and white + red = green = blue = 2 + (rand() % 128); + } + return red | (green << 8) | (blue << 16); } +*/ \ No newline at end of file diff --git a/interface/src/Stars.h b/interface/src/Stars.h index 08f218b9fa..73f04755ab 100644 --- a/interface/src/Stars.h +++ b/interface/src/Stars.h @@ -12,9 +12,7 @@ #ifndef hifi_Stars_h #define hifi_Stars_h -#include - -namespace starfield { class Controller; } +class RenderArgs; // Starfield rendering component. class Stars { @@ -22,33 +20,13 @@ public: Stars(); ~Stars(); - // Generate stars from random number - // The numStars parameter sets the number of stars to generate. - bool generate(unsigned numStars, unsigned seed); - // Renders the starfield from a local viewer's perspective. // The parameters specifiy the field of view. - void render(float fovY, float aspect, float nearZ, float alpha); - - // Sets the resolution for FOV culling. - // - // The parameter determines the number of tiles in azimuthal - // and altitudinal directions. - // - // GPU resources are updated upon change in which case 'true' - // is returned. - bool setResolution(unsigned k); - - // Returns true when stars have been loaded - bool isStarsLoaded() const { return _starsLoaded; }; + void render(RenderArgs* args, float alpha); private: // don't copy/assign Stars(Stars const&); // = delete; Stars& operator=(Stars const&); // delete; - - starfield::Controller* _controller; - - bool _starsLoaded; }; diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index 75a5137ca4..8f9d072b8e 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include - #include #include diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 239359c1cf..979995360e 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -11,8 +11,6 @@ #include -#include - #include #include @@ -708,6 +706,9 @@ Transform Avatar::calculateDisplayNameTransform(const ViewFrustum& frustum, floa // Compute pixel alignment offset float clipToPix = 0.5f * windowSizeY / p1.w; // Got from clip to pixel coordinates glm::vec4 screenPos = clipToPix * p1; // in pixels coords +// WTF? +#undef round + glm::vec4 screenOffset = (glm::round(screenPos) - screenPos) / clipToPix; // in clip coords glm::vec3 worldOffset = glm::vec3(screenOffset.x, screenOffset.y, 0.0f) / (float)pixelHeight; diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index 7b2968973c..63604d710d 100644 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -8,13 +8,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include // hack to get windows to build - #include #include #include -#include #include "AvatarManager.h" #include "Hand.h" diff --git a/interface/src/avatar/Hand.h b/interface/src/avatar/Hand.h index f6991c5a55..a4c0265545 100644 --- a/interface/src/avatar/Hand.h +++ b/interface/src/avatar/Hand.h @@ -30,7 +30,6 @@ class Avatar; -class ProgramObject; const float HAND_PADDLE_OFFSET = 0.1f; const float HAND_PADDLE_THICKNESS = 0.01f; diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 98126c3a22..43e68557ce 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -9,7 +9,6 @@ // #include -#include #include #include diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index 3f839d53bc..2baa16f90c 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -26,7 +26,6 @@ const float EYE_EAR_GAP = 0.08f; class Avatar; -class ProgramObject; class Head : public HeadData { public: diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 93303c3536..bd0608a876 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -19,7 +19,6 @@ #include -#include #include #include #include diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index da7c7a7d2f..fd40ca592d 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -10,16 +10,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "InterfaceConfig.h" #include "OculusManager.h" -#include "ui/overlays/Text3DOverlay.h" +#include -#include #include #include #include #include +#include +#include #include #include @@ -35,6 +35,7 @@ #include "InterfaceLogging.h" #include "Application.h" +#include "ui/overlays/Text3DOverlay.h" template void for_each_eye(Function function) { diff --git a/interface/src/devices/OculusManager.h b/interface/src/devices/OculusManager.h index 83ecbf0fb7..87f022a294 100644 --- a/interface/src/devices/OculusManager.h +++ b/interface/src/devices/OculusManager.h @@ -13,14 +13,16 @@ #ifndef hifi_OculusManager_h #define hifi_OculusManager_h -#include #include #include #include +#include + #include "RenderArgs.h" class QOpenGLContext; +class QGLWidget; class Camera; /// Handles interaction with the Oculus Rift. diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 4eac1e6803..33486e3a25 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -103,4 +103,3 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, } } } - diff --git a/interface/src/starfield/Config.h b/interface/src/starfield/Config.h deleted file mode 100644 index 00f827dad7..0000000000 --- a/interface/src/starfield/Config.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// Config.h -// interface/src/starfield -// -// Created by Tobias Schwinger on 3/29/13. -// Copyright 2013 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_Config_h -#define hifi_Config_h - -#include "InterfaceConfig.h" - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "AngleUtil.h" -#include "Radix2InplaceSort.h" -#include "Radix2IntegerScanner.h" -#include "FloodFill.h" - -// Namespace configuration: - -namespace starfield { - - using glm::vec3; - using glm::vec4; - using glm::dot; - using glm::normalize; - using glm::mat4; - using glm::row; - - using namespace std; - - typedef uint32_t nuint; - typedef quint64 wuint; - -} - -#endif // hifi_Config_h diff --git a/interface/src/starfield/Controller.cpp b/interface/src/starfield/Controller.cpp deleted file mode 100644 index d0d46adbdc..0000000000 --- a/interface/src/starfield/Controller.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// Controller.cpp -// interface/src/starfield -// -// Created by Chris Barnard on 10/16/13. -// Copyright 2013 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 - -#include "InterfaceLogging.h" -#include "starfield/Controller.h" - -using namespace starfield; - -bool Controller::computeStars(unsigned numStars, unsigned seed) { - QElapsedTimer startTime; - startTime.start(); - - Generator::computeStarPositions(_inputSequence, numStars, seed); - - this->retile(numStars, _tileResolution); - - double NSEC_TO_MSEC = 1.0 / 1000000.0; - double timeDiff = (double)startTime.nsecsElapsed() * NSEC_TO_MSEC; - qCDebug(interfaceapp) << "Total time to retile and generate stars: " << timeDiff << "msec"; - - return true; -} - -bool Controller::setResolution(unsigned tileResolution) { - if (tileResolution <= 3) { - return false; - } - - if (tileResolution != _tileResolution) { - - this->retile(_numStars, tileResolution); - - return true; - } else { - return false; - } -} - -void Controller::render(float perspective, float angle, mat4 const& orientation, float alpha) { - Renderer* renderer = _renderer; - - if (renderer != 0l) { - renderer->render(perspective, angle, orientation, alpha); - } -} - -void Controller::retile(unsigned numStars, unsigned tileResolution) { - Tiling tiling(tileResolution); - VertexOrder scanner(tiling); - radix2InplaceSort(_inputSequence.begin(), _inputSequence.end(), scanner); - - recreateRenderer(numStars, tileResolution); - - _tileResolution = tileResolution; -} - -void Controller::recreateRenderer(unsigned numStars, unsigned tileResolution) { - delete _renderer; - _renderer = new Renderer(_inputSequence, numStars, tileResolution); -} diff --git a/interface/src/starfield/Controller.h b/interface/src/starfield/Controller.h deleted file mode 100644 index 06db5cb833..0000000000 --- a/interface/src/starfield/Controller.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// Controller.h -// interface/src/starfield -// -// Created by Tobias Schwinger on 3/29/13. -// Modified by Chris Barnard on 10/16/13. -// Copyright 2013 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_Controller_h -#define hifi_Controller_h - -#include - -#include "starfield/Generator.h" -#include "starfield/data/InputVertex.h" -#include "starfield/renderer/Renderer.h" -#include "starfield/renderer/VertexOrder.h" - -namespace starfield { - class Controller { - public: - Controller() : _tileResolution(20), _renderer(0l) { } - - ~Controller() { delete _renderer; } - - bool computeStars(unsigned numStars, unsigned seed); - bool setResolution(unsigned tileResolution); - void render(float perspective, float angle, mat4 const& orientation, float alpha); - private: - void retile(unsigned numStars, unsigned tileResolution); - - void recreateRenderer(unsigned numStars, unsigned tileResolution); - - InputVertices _inputSequence; - unsigned _tileResolution; - unsigned _numStars; - Renderer* _renderer; - }; -} -#endif // hifi_Controller_h diff --git a/interface/src/starfield/Generator.cpp b/interface/src/starfield/Generator.cpp deleted file mode 100644 index f20521bfbf..0000000000 --- a/interface/src/starfield/Generator.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// Generator.cpp -// interface/src/starfield -// -// Created by Chris Barnard on 10/13/13. -// Copyright 2013 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 - -#include "starfield/Generator.h" - -using namespace starfield; - -const float Generator::STAR_COLORIZATION = 0.1f; -const float PI_OVER_180 = 3.14159265358979f / 180.0f; - -void Generator::computeStarPositions(InputVertices& destination, unsigned limit, unsigned seed) { - InputVertices* vertices = & destination; - //_limit = limit; - - QElapsedTimer startTime; - startTime.start(); - - srand(seed); - - vertices->clear(); - vertices->reserve(limit); - - const unsigned MILKY_WAY_WIDTH = 12.0; // width in degrees of one half of the Milky Way - const float MILKY_WAY_INCLINATION = 0.0f; // angle of Milky Way from horizontal in degrees - const float MILKY_WAY_RATIO = 0.4f; - const unsigned NUM_DEGREES = 360; - - for(int star = 0; star < floor(limit * (1 - MILKY_WAY_RATIO)); ++star) { - float azimuth, altitude; - azimuth = (((float)rand() / (float) RAND_MAX) * NUM_DEGREES) - (NUM_DEGREES / 2); - altitude = (acos((2.0f * ((float)rand() / (float)RAND_MAX)) - 1.0f) / PI_OVER_180) + 90; - vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION))); - } - - for(int star = 0; star < ceil(limit * MILKY_WAY_RATIO); ++star) { - float azimuth = ((float)rand() / (float) RAND_MAX) * NUM_DEGREES; - float altitude = powf(randFloat()*0.5f, 2.0f)/0.25f * MILKY_WAY_WIDTH; - if (randFloat() > 0.5f) { - altitude *= -1.0f; - } - - // we need to rotate the Milky Way band to the correct orientation in the sky - // convert from spherical coordinates to cartesian, rotate the point and then convert back. - // An improvement would be to convert all stars to cartesian at this point and not have to convert back. - - float tempX = sin(azimuth * PI_OVER_180) * cos(altitude * PI_OVER_180); - float tempY = sin(altitude * PI_OVER_180); - float tempZ = -cos(azimuth * PI_OVER_180) * cos(altitude * PI_OVER_180); - - float xangle = MILKY_WAY_INCLINATION * PI_OVER_180; - float newX = (tempX * cos(xangle)) - (tempY * sin(xangle)); - float newY = (tempX * sin(xangle)) + (tempY * cos(xangle)); - float newZ = tempZ; - - azimuth = (atan2(newX,-newZ) + Radians::pi()) / PI_OVER_180; - altitude = atan2(-newY, hypotf(newX, newZ)) / PI_OVER_180; - - vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION))); - } - - double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms - qDebug() << "Total time to generate stars: " << timeDiff << " msec"; -} - -// computeStarColor -// - Generate a star color. -// -// colorization can be a value between 0 and 1 specifying how colorful the resulting star color is. -// -// 0 = completely black & white -// 1 = very colorful -unsigned Generator::computeStarColor(float colorization) { - unsigned char red, green, blue; - if (randFloat() < 0.3f) { - // A few stars are colorful - red = 2 + (rand() % 254); - green = 2 + round((red * (1 - colorization)) + ((rand() % 254) * colorization)); - blue = 2 + round((red * (1 - colorization)) + ((rand() % 254) * colorization)); - } else { - // Most stars are dimmer and white - red = green = blue = 2 + (rand() % 128); - } - return red | (green << 8) | (blue << 16); -} diff --git a/interface/src/starfield/Generator.h b/interface/src/starfield/Generator.h deleted file mode 100644 index 5352b3daf1..0000000000 --- a/interface/src/starfield/Generator.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// Generator.h -// interface/src/starfield -// -// Created by Chris Barnard on 10/13/13. -// Copyright 2013 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_Generator_h -#define hifi_Generator_h - -#include -#include - -#include "Config.h" -#include "SharedUtil.h" - -#include "starfield/data/InputVertex.h" - -namespace starfield { - - class Generator { - - public: - Generator() {} - ~Generator() {} - - static void computeStarPositions(InputVertices& destination, unsigned limit, unsigned seed); - static unsigned computeStarColor(float colorization); - - private: - static const float STAR_COLORIZATION; - - }; - -} -#endif // hifi_Generator_h diff --git a/interface/src/starfield/data/GpuVertex.cpp b/interface/src/starfield/data/GpuVertex.cpp deleted file mode 100644 index b7fee1f2b1..0000000000 --- a/interface/src/starfield/data/GpuVertex.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// GpuVertex.cpp -// interface/src/starfield/data -// -// Created by Chris Barnard on 10/17/13. -// Based on code by Tobias Schwinger on 3/29/13. -// Copyright 2013 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 "starfield/data/GpuVertex.h" - -using namespace starfield; - -GpuVertex::GpuVertex(InputVertex const& inputVertex) { - _color = inputVertex.getColor(); - float azimuth = inputVertex.getAzimuth(); - float altitude = inputVertex.getAltitude(); - - // compute altitude/azimuth into X/Y/Z point on a sphere - _valX = sin(azimuth) * cos(altitude); - _valY = sin(altitude); - _valZ = -cos(azimuth) * cos(altitude); -} diff --git a/interface/src/starfield/data/GpuVertex.h b/interface/src/starfield/data/GpuVertex.h deleted file mode 100644 index f3b3ccd451..0000000000 --- a/interface/src/starfield/data/GpuVertex.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// GpuVertex.h -// interface/src/starfield/data -// -// Created by Tobias Schwinger on 3/29/13. -// Modified by Chris Barnard on 10/17/13. -// Copyright 2013 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_GpuVertex_h -#define hifi_GpuVertex_h - -#include "starfield/data/InputVertex.h" - -namespace starfield { - - class GpuVertex { - public: - GpuVertex() { } - - GpuVertex(InputVertex const& inputVertex); - - unsigned getColor() const { return _color; } - - private: - unsigned _color; - float _valX; - float _valY; - float _valZ; - }; - -} - -#endif // hifi_GpuVertex_h diff --git a/interface/src/starfield/data/InputVertex.cpp b/interface/src/starfield/data/InputVertex.cpp deleted file mode 100644 index 5dead34beb..0000000000 --- a/interface/src/starfield/data/InputVertex.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// InputVertex.cpp -// interface/src/starfield/data -// -// Created by Chris Barnard on 10/17/13. -// Based on code by Tobias Schwinger 3/29/13. -// Copyright 2013 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 "starfield/data/InputVertex.h" - -using namespace starfield; - -InputVertex::InputVertex(float azimuth, float altitude, unsigned color) { - _color = color | 0xff000000u; - - azimuth = angleConvert(azimuth); - altitude = angleConvert(altitude); - - angleHorizontalPolar(azimuth, altitude); - - _azimuth = azimuth; - _altitude = altitude; -} diff --git a/interface/src/starfield/data/InputVertex.h b/interface/src/starfield/data/InputVertex.h deleted file mode 100644 index 2eeda183ec..0000000000 --- a/interface/src/starfield/data/InputVertex.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// InputVertex.h -// interface/src/starfield/data -// -// Created by Tobias Schwinger on 3/29/13. -// Modified by Chris Barnard on 10/17/13. -// Copyright 2013 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_InputVertex_h -#define hifi_InputVertex_h - -#include "starfield/Config.h" - -namespace starfield { - - class InputVertex { - public: - - InputVertex(float azimuth, float altitude, unsigned color); - - float getAzimuth() const { return _azimuth; } - float getAltitude() const { return _altitude; } - unsigned getColor() const { return _color; } - - private: - unsigned _color; - float _azimuth; - float _altitude; - }; - - typedef std::vector InputVertices; - -} - -#endif // hifi_InputVertex_h diff --git a/interface/src/starfield/data/Tile.h b/interface/src/starfield/data/Tile.h deleted file mode 100644 index 7273394984..0000000000 --- a/interface/src/starfield/data/Tile.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// Tile.h -// interface/src/starfield/data -// -// Created by Tobias Schwinger on 3/22/13. -// Copyright 2013 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_Tile_h -#define hifi_Tile_h - -#include "starfield/Config.h" - -namespace starfield { - - struct Tile { - nuint offset; - nuint count; - nuint flags; - - // flags - static uint16_t const checked = 1; - static uint16_t const visited = 2; - static uint16_t const render = 4; - }; - -} - -#endif // hifi_Tile_h diff --git a/interface/src/starfield/renderer/Renderer.cpp b/interface/src/starfield/renderer/Renderer.cpp deleted file mode 100644 index 5fc858d952..0000000000 --- a/interface/src/starfield/renderer/Renderer.cpp +++ /dev/null @@ -1,324 +0,0 @@ -// -// Renderer.cpp -// interface/src/starfield/renderer -// -// Created by Chris Barnard on 10/17/13. -// Based on earlier work by Tobias Schwinger 3/22/13. -// Copyright 2013 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 "starfield/renderer/Renderer.h" -#include "Application.h" - -using namespace starfield; - -Renderer::Renderer(InputVertices const& stars, unsigned numStars, unsigned tileResolution) : _dataArray(0l), -_tileArray(0l), _tiling(tileResolution) { - this->glAlloc(); - - Tiling tiling(tileResolution); - size_t numTiles = tiling.getTileCount(); - - // REVISIT: batch arrays are probably oversized, but - hey - they - // are not very large (unless for insane tiling) and we're better - // off safe than sorry - _dataArray = new GpuVertex[numStars]; - _tileArray = new Tile[numTiles + 1]; - _batchOffs = new GLint[numTiles * 2]; - _batchCountArray = new GLsizei[numTiles * 2]; - - prepareVertexData(stars, numStars, tiling); - - this->glUpload(numStars); -} - -Renderer::~Renderer() { - delete[] _dataArray; - delete[] _tileArray; - delete[] _batchCountArray; - delete[] _batchOffs; - - this->glFree(); -} - -void Renderer::render(float perspective, float aspect, mat4 const& orientation, float alpha) { - float halfPersp = perspective * 0.5f; - - // cancel all translation - mat4 matrix = orientation; - matrix[3][0] = 0.0f; - matrix[3][1] = 0.0f; - matrix[3][2] = 0.0f; - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadMatrixf(glm::value_ptr(qApp->getDisplayViewFrustum()->getProjection())); - glMatrixMode(GL_MODELVIEW); - // extract local z vector - vec3 ahead = vec3(matrix[2]); - - float azimuth = atan2(ahead.x,-ahead.z) + Radians::pi(); - float altitude = atan2(-ahead.y, hypotf(ahead.x, ahead.z)); - angleHorizontalPolar(azimuth, altitude); - float const eps = 0.002f; - altitude = glm::clamp(altitude, -Radians::halfPi() + eps, Radians::halfPi() - eps); - - matrix = glm::affineInverse(matrix); - - this->_outIndexPos = (unsigned*) _batchOffs; - this->_wRowVec = -vec3(row(matrix, 2)); - this->_halfPerspectiveAngle = halfPersp; - - TileSelection::Cursor cursor; - cursor.current = _tileArray + _tiling.getTileIndex(azimuth, altitude); - cursor.firstInRow = _tileArray + _tiling.getTileIndex(0.0f, altitude); - - floodFill(cursor, TileSelection(*this, _tileArray, _tileArray + _tiling.getTileCount(), (TileSelection::Cursor*) _batchCountArray)); - - this->glBatch(glm::value_ptr(matrix), prepareBatch((unsigned*) _batchOffs, _outIndexPos), alpha); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - -} - -// renderer construction - -void Renderer::prepareVertexData(InputVertices const& vertices, unsigned numStars, Tiling const& tiling) { - - size_t nTiles = tiling.getTileCount(); - size_t vertexIndex = 0u, currTileIndex = 0u, count_active = 0u; - - _tileArray[0].offset = 0u; - _tileArray[0].flags = 0u; - - for (InputVertices::const_iterator i = vertices.begin(), e = vertices.end(); i != e; ++i) { - size_t tileIndex = tiling.getTileIndex(i->getAzimuth(), i->getAltitude()); - assert(tileIndex >= currTileIndex); - - // moved on to another tile? -> flush - if (tileIndex != currTileIndex) { - - Tile* tile = _tileArray + currTileIndex; - Tile* lastTile = _tileArray + tileIndex; - - // set count of active vertices (upcoming lod) - tile->count = count_active; - // generate skipped, empty tiles - for(size_t offset = vertexIndex; ++tile != lastTile ;) { - tile->offset = offset, tile->count = 0u, tile->flags = 0u; - } - - // initialize next (as far as possible here) - lastTile->offset = vertexIndex; - lastTile->flags = 0u; - - currTileIndex = tileIndex; - count_active = 0u; - } - - ++count_active; - - // write converted vertex - _dataArray[vertexIndex++] = *i; - } - assert(vertexIndex == numStars); - - // flush last tile (see above) - Tile* tile = _tileArray + currTileIndex; - tile->count = count_active; - for (Tile* e = _tileArray + nTiles + 1; ++tile != e;) { - tile->offset = vertexIndex, tile->count = 0u, tile->flags = 0; - } -} - -bool Renderer::visitTile(Tile* tile) { - unsigned index = tile - _tileArray; - *_outIndexPos++ = index; - - return isTileVisible(index); -} - -bool Renderer::isTileVisible(unsigned index) { - - float slice = _tiling.getSliceAngle(); - float halfSlice = 0.5f * slice; - unsigned stride = _tiling.getAzimuthalTiles(); - float azimuth = (index % stride) * slice; - float altitude = (index / stride) * slice - Radians::halfPi(); - float groundX = sin(azimuth); - float groundZ = -cos(azimuth); - float elevation = cos(altitude); - vec3 tileCenter = vec3(groundX * elevation, sin(altitude), groundZ * elevation); - float w = dot(_wRowVec, tileCenter); - - float daz = halfSlice * cos(std::max(0.0f, abs(altitude) - halfSlice)); - float dal = halfSlice; - float adjustedNear = cos(_halfPerspectiveAngle + sqrt(daz * daz + dal * dal)); - - return w >= adjustedNear; -} - -unsigned Renderer::prepareBatch(unsigned const* indices, unsigned const* indicesEnd) { - unsigned nRanges = 0u; - GLint* offs = _batchOffs; - GLsizei* count = _batchCountArray; - - for (unsigned* i = (unsigned*) _batchOffs; i != indicesEnd; ++i) { - Tile* t = _tileArray + *i; - if ((t->flags & Tile::render) > 0u && t->count > 0u) { - *offs++ = t->offset; - *count++ = t->count; - ++nRanges; - } - t->flags = 0; - } - return nRanges; -} - -// GL API handling - -void Renderer::glAlloc() { - GLchar const* const VERTEX_SHADER = - "#version 120\n" - "uniform float alpha;\n" - "void main(void) {\n" - " vec3 c = gl_Color.rgb * 1.22;\n" - " float s = min(max(tan((c.r + c.g + c.b) / 3), 1.0), 3.0);\n" - " gl_Position = ftransform();\n" - " gl_FrontColor= gl_Color * alpha * 1.5;\n" - " gl_PointSize = s;\n" - "}\n"; - - _program.addShaderFromSourceCode(QGLShader::Vertex, VERTEX_SHADER); - - GLchar const* const FRAGMENT_SHADER = - "#version 120\n" - "void main(void) {\n" - " gl_FragColor = gl_Color;\n" - "}\n"; - - _program.addShaderFromSourceCode(QGLShader::Fragment, FRAGMENT_SHADER); - _program.link(); - _alphaLocationHandle = _program.uniformLocation("alpha"); - - glGenBuffersARB(1, & _vertexArrayHandle); -} - -void Renderer::glFree() { - glDeleteBuffersARB(1, & _vertexArrayHandle); -} - -void Renderer::glUpload(GLsizei numStars) { - glBindBufferARB(GL_ARRAY_BUFFER, _vertexArrayHandle); - glBufferData(GL_ARRAY_BUFFER, numStars * sizeof(GpuVertex), _dataArray, GL_STATIC_DRAW); - glBindBufferARB(GL_ARRAY_BUFFER, 0); -} - -void Renderer::glBatch(GLfloat const* matrix, GLsizei n_ranges, float alpha) { - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - - // setup modelview matrix - glPushMatrix(); - glLoadMatrixf(matrix); - - // set point size and smoothing + shader control - glPointSize(1.0f); - glEnable(GL_POINT_SMOOTH); - glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); - glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); - - // select shader and vertex array - _program.bind(); - _program.setUniformValue(_alphaLocationHandle, alpha); - glBindBufferARB(GL_ARRAY_BUFFER, _vertexArrayHandle); - glInterleavedArrays(GL_C4UB_V3F, sizeof(GpuVertex), 0l); - - // render - glMultiDrawArrays(GL_POINTS, _batchOffs, _batchCountArray, n_ranges); - - // restore state - glBindBufferARB(GL_ARRAY_BUFFER, 0); - _program.release(); - glDisable(GL_VERTEX_PROGRAM_POINT_SIZE); - glDisable(GL_POINT_SMOOTH); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - - glPopMatrix(); -} - -// flood fill strategy - -bool Renderer::TileSelection::select(Renderer::TileSelection::Cursor const& cursor) { - Tile* tile = cursor.current; - - if (tile < _tileArray || tile >= _tilesEnd || !! (tile->flags & Tile::checked)) { - // out of bounds or been here already - return false; - } - - // will check now and never again - tile->flags |= Tile::checked; - if (_rendererRef.visitTile(tile)) { - // good one -> remember (for batching) and propagate - tile->flags |= Tile::render; - return true; - } - - return false; -} - -bool Renderer::TileSelection::process(Renderer::TileSelection::Cursor const& cursor) { - Tile* tile = cursor.current; - - if (! (tile->flags & Tile::visited)) { - tile->flags |= Tile::visited; - return true; - } - - return false; -} - -void Renderer::TileSelection::right(Renderer::TileSelection::Cursor& cursor) const { - cursor.current += 1; - if (cursor.current == cursor.firstInRow + _rendererRef._tiling.getAzimuthalTiles()) { - cursor.current = cursor.firstInRow; - } -} - -void Renderer::TileSelection::left(Renderer::TileSelection::Cursor& cursor) const { - if (cursor.current == cursor.firstInRow) { - cursor.current = cursor.firstInRow + _rendererRef._tiling.getAzimuthalTiles(); - } - cursor.current -= 1; -} - -void Renderer::TileSelection::up(Renderer::TileSelection::Cursor& cursor) const { - unsigned numTiles = _rendererRef._tiling.getAzimuthalTiles(); - cursor.current += numTiles; - cursor.firstInRow += numTiles; -} - -void Renderer::TileSelection::down(Renderer::TileSelection::Cursor& cursor) const { - unsigned numTiles = _rendererRef._tiling.getAzimuthalTiles(); - cursor.current -= numTiles; - cursor.firstInRow -= numTiles; -} - -void Renderer::TileSelection::defer(Renderer::TileSelection::Cursor const& cursor) { - *_stackPos++ = cursor; -} - -bool Renderer::TileSelection::deferred(Renderer::TileSelection::Cursor& cursor) { - if (_stackPos != _stackArray) { - cursor = *--_stackPos; - return true; - } - return false; -} diff --git a/interface/src/starfield/renderer/Renderer.h b/interface/src/starfield/renderer/Renderer.h deleted file mode 100644 index 1e271512d2..0000000000 --- a/interface/src/starfield/renderer/Renderer.h +++ /dev/null @@ -1,142 +0,0 @@ -// -// Renderer.h -// interface/src/starfield/renderer -// -// Created by Tobias Schwinger on 3/22/13. -// Modified by Chris Barnard on 10/17/13. -// Copyright 2013 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_Renderer_h -#define hifi_Renderer_h - -#include "starfield/Config.h" -#include "starfield/data/InputVertex.h" -#include "starfield/data/Tile.h" -#include "starfield/data/GpuVertex.h" -#include "starfield/renderer/Tiling.h" - -// -// FOV culling -// =========== -// -// As stars can be thought of as at infinity distance, the field of view only -// depends on perspective and rotation: -// -// _----_ <-- visible stars -// from above +-near-+ - - -// \ / | -// near width: \ / | cos(p/2) -// 2sin(p/2) \/ _ -// center -// -// -// Now it is important to note that a change in altitude maps uniformly to a -// distance on a sphere. This is NOT the case for azimuthal angles: In this -// case a factor of 'cos(alt)' (the orbital radius) applies: -// -// -// |<-cos alt ->| | |<-|<----->|->| d_azi cos(alt) -// | -// __--* | --------- - -// __-- * | | | ^ d_alt -// __-- alt) * | | | v -// --------------*- | ------------- - -// | -// side view | tile on sphere -// -// -// This lets us find a worst-case (Eigen) angle from the center to the edge -// of a tile as -// -// hypot( 0.5 d_alt, 0.5 d_azi cos(alt_absmin) ). -// -// This angle must be added to 'p' (the perspective angle) in order to find -// an altered near plane for the culling decision. -// - -namespace starfield { - - class Renderer { - public: - - Renderer(InputVertices const& src, unsigned numStars, unsigned tileResolution); - ~Renderer(); - void render(float perspective, float aspect, mat4 const& orientation, float alpha); - - private: - // renderer construction - - void prepareVertexData(InputVertices const& vertices, unsigned numStars, Tiling const& tiling); - - // FOV culling / LOD - - class TileSelection; - friend class Renderer::TileSelection; - - class TileSelection { - - public: - struct Cursor { Tile* current, * firstInRow; }; - - private: - Renderer& _rendererRef; - Cursor* const _stackArray; - Cursor* _stackPos; - Tile const* const _tileArray; - Tile const* const _tilesEnd; - - public: - TileSelection(Renderer& renderer, Tile const* tiles, Tile const* tiles_end, Cursor* stack) : - _rendererRef(renderer), - _stackArray(stack), - _stackPos(stack), - _tileArray(tiles), - _tilesEnd(tiles_end) { } - - protected: - bool select(Cursor const& cursor); - bool process(Cursor const& cursor); - void right(Cursor& cursor) const; - void left(Cursor& cursor) const; - void up(Cursor& cursor) const; - void down(Cursor& cursor) const; - void defer(Cursor const& cursor); - bool deferred(Cursor& cursor); - }; - - bool visitTile(Tile* tile); - bool isTileVisible(unsigned index); - unsigned prepareBatch(unsigned const* indices, unsigned const* indicesEnd); - - // GL API handling - - void glAlloc(); - void glFree(); - void glUpload(GLsizei numStars); - void glBatch(GLfloat const* matrix, GLsizei n_ranges, float alpha); - - // variables - - GpuVertex* _dataArray; - Tile* _tileArray; - GLint* _batchOffs; - GLsizei* _batchCountArray; - GLuint _vertexArrayHandle; - ProgramObject _program; - int _alphaLocationHandle; - - Tiling _tiling; - - unsigned* _outIndexPos; - vec3 _wRowVec; - float _halfPerspectiveAngle; - - }; - -} - -#endif // hifi_Renderer_h diff --git a/interface/src/starfield/renderer/Tiling.h b/interface/src/starfield/renderer/Tiling.h deleted file mode 100644 index e299b0998f..0000000000 --- a/interface/src/starfield/renderer/Tiling.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// Tiling.h -// interface/src/starfield/renderer -// -// Created by Tobias Schwinger on 3/22/13. -// Copyright 2013 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_Tiling_h -#define hifi_Tiling_h - -#include "starfield/Config.h" - -namespace starfield { - const float LOG2 = 1.4426950408889634f; - - class Tiling { - public: - Tiling(unsigned tileResolution) : _tileResolution(tileResolution), _rcpSlice(tileResolution / Radians::twicePi()) { - _nBits = ceil(log((float)getTileCount()) * LOG2); } - - unsigned getAzimuthalTiles() const { return _tileResolution; } - unsigned getAltitudinalTiles() const { return _tileResolution / 2 + 1; } - unsigned getTileIndexBits() const { return _nBits; } - unsigned getTileCount() const { return getAzimuthalTiles() * getAltitudinalTiles(); } - unsigned getTileIndex(float azimuth, float altitude) const { return discreteAzimuth(azimuth) + - _tileResolution * discreteAltitude(altitude); } - float getSliceAngle() const { return 1.0f / _rcpSlice; } - - private: - - unsigned discreteAngle(float unsigned_angle) const { return unsigned(floor(unsigned_angle * _rcpSlice + 0.5f)); } - unsigned discreteAzimuth(float angle) const { return discreteAngle(angle) % _tileResolution; } - unsigned discreteAltitude(float angle) const { return min( getAltitudinalTiles() - 1, - discreteAngle(angle + Radians::halfPi()) ); } - - // variables - - unsigned _tileResolution; - float _rcpSlice; - unsigned _nBits; - }; -} - -#endif // hifi_Tiling_h diff --git a/interface/src/starfield/renderer/VertexOrder.cpp b/interface/src/starfield/renderer/VertexOrder.cpp deleted file mode 100644 index ec36f1eea2..0000000000 --- a/interface/src/starfield/renderer/VertexOrder.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// VertexOrder.cpp -// interface/src/starfield/renderer -// -// Created by Chris Barnard on 10/17/13. -// Based on code by Tobias Schwinger on 3/22/13. -// Copyright 2013 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 "starfield/renderer/VertexOrder.h" - -using namespace starfield; - -bool VertexOrder::bit(InputVertex const& vertex, state_type const& state) const { - unsigned key = _tiling.getTileIndex(vertex.getAzimuth(), vertex.getAltitude()); - return base::bit(key, state); -} diff --git a/interface/src/starfield/renderer/VertexOrder.h b/interface/src/starfield/renderer/VertexOrder.h deleted file mode 100644 index e45ccdedb0..0000000000 --- a/interface/src/starfield/renderer/VertexOrder.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// VertexOrder.h -// interface/src/starfield/renderer -// -// Created by Tobias Schwinger on 3/22/13. -// Copyright 2013 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_VertexOrder_h -#define hifi_VertexOrder_h - -#include "starfield/Config.h" -#include "starfield/data/InputVertex.h" -#include "starfield/renderer/Tiling.h" - -namespace starfield { - - // Defines the vertex order for the renderer as a bit extractor for - //binary in-place Radix Sort. - - class VertexOrder : public Radix2IntegerScanner - { - public: - explicit VertexOrder(Tiling const& tiling) : - - base(tiling.getTileIndexBits()), _tiling(tiling) { } - - bool bit(InputVertex const& vertex, state_type const& state) const; - - private: - Tiling _tiling; - - typedef Radix2IntegerScanner base; - }; - -} // anonymous namespace - -#endif // hifi_VertexOrder_h diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index da76e9c032..f1bf8265ef 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -11,9 +11,6 @@ #include "InterfaceConfig.h" -#include -#include - #include #include diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 49e93739a6..3993c48b36 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -6,8 +6,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include - #include "Stats.h" #include diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index a897e0422e..af6824d1a3 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -9,12 +9,9 @@ #ifndef hifi_Stats_h #define hifi_Stats_h -#include -#include -#include - -#include +#include #include +#include #define STATS_PROPERTY(type, name, initialValue) \ Q_PROPERTY(type name READ name NOTIFY name##Changed) \ diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 43f3492091..150b4cb8b8 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -9,9 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include -#include - #include #include diff --git a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp index 23b93250bc..bb51dd1aad 100644 --- a/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableBoxEntityItem.cpp @@ -13,7 +13,6 @@ #include -#include #include #include diff --git a/libraries/entities-renderer/src/RenderableDebugableEntityItem.cpp b/libraries/entities-renderer/src/RenderableDebugableEntityItem.cpp index 6a511e0d30..2770c4edc2 100644 --- a/libraries/entities-renderer/src/RenderableDebugableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableDebugableEntityItem.cpp @@ -14,7 +14,6 @@ #include -#include #include #include #include diff --git a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp index 819989d5ec..d07d7f99fd 100644 --- a/libraries/entities-renderer/src/RenderableLightEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLightEntityItem.cpp @@ -11,7 +11,6 @@ #include -#include #include #include diff --git a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp index 6eb575814a..893e8a5f39 100644 --- a/libraries/entities-renderer/src/RenderableLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableLineEntityItem.cpp @@ -11,7 +11,6 @@ #include -#include #include #include diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 09411c53d5..38fa67003f 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -11,8 +11,6 @@ #include -#include - #include #include diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp index 2eb95d1bef..dec4e4644c 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp @@ -10,8 +10,6 @@ #include -#include - #include #include #include diff --git a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp index 46cfcefa40..a9f6d52622 100644 --- a/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyVoxEntityItem.cpp @@ -23,8 +23,6 @@ #pragma GCC diagnostic pop #endif -#include - #include #include #include diff --git a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp index 6d9cb525d6..cf44efc42e 100644 --- a/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableSphereEntityItem.cpp @@ -13,7 +13,6 @@ #include -#include #include #include diff --git a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp index 0c9b36dd87..d3e8e99e6e 100644 --- a/libraries/entities-renderer/src/RenderableTextEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableTextEntityItem.cpp @@ -11,8 +11,6 @@ #include -#include - #include #include #include diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 219d066611..e4d9d40bf4 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -8,12 +8,14 @@ #include "RenderableWebEntityItem.h" +#include #include +#include +#include +#include #include -#include - #include #include #include diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 8c147cac05..c0ebc64ea6 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -11,7 +11,6 @@ #include "RenderableZoneEntityItem.h" -#include #include #include diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index 9f75f9a94f..e3e9088afa 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "Batch.h" +#include "GPUConfig.h" #include @@ -254,6 +255,22 @@ void Batch::setFramebuffer(const FramebufferPointer& framebuffer) { } +void Batch::blit(const FramebufferPointer& src, const Vec4i& srcViewport, + const FramebufferPointer& dst, const Vec4i& dstViewport) { + ADD_COMMAND(blit); + + _params.push_back(_framebuffers.cache(src)); + _params.push_back(srcViewport.x); + _params.push_back(srcViewport.y); + _params.push_back(srcViewport.z); + _params.push_back(srcViewport.w); + _params.push_back(_framebuffers.cache(dst)); + _params.push_back(dstViewport.x); + _params.push_back(dstViewport.y); + _params.push_back(dstViewport.z); + _params.push_back(dstViewport.w); +} + void Batch::beginQuery(const QueryPointer& query) { ADD_COMMAND(beginQuery); diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index ac4f624bda..2f1d2e8ece 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -11,20 +11,14 @@ #ifndef hifi_gpu_Batch_h #define hifi_gpu_Batch_h -#include -#include "GPUConfig.h" - -#include "Transform.h" - #include +#include "Framebuffer.h" +#include "Pipeline.h" #include "Query.h" #include "Stream.h" #include "Texture.h" - -#include "Pipeline.h" - -#include "Framebuffer.h" +#include "Transform.h" #if defined(NSIGHT_FOUND) class ProfileRange { @@ -111,6 +105,9 @@ public: // Framebuffer Stage void setFramebuffer(const FramebufferPointer& framebuffer); + void blit(const FramebufferPointer& src, const Vec4i& srcViewport, + const FramebufferPointer& dst, const Vec4i& dstViewport); + // Query Section void beginQuery(const QueryPointer& query); @@ -123,42 +120,42 @@ public: // For now, instead of calling the raw gl Call, use the equivalent call on the batch so the call is beeing recorded // THe implementation of these functions is in GLBackend.cpp - void _glEnable(GLenum cap); - void _glDisable(GLenum cap); + void _glEnable(unsigned int cap); + void _glDisable(unsigned int cap); - void _glEnableClientState(GLenum array); - void _glDisableClientState(GLenum array); + void _glEnableClientState(unsigned int array); + void _glDisableClientState(unsigned int array); - void _glCullFace(GLenum mode); - void _glAlphaFunc(GLenum func, GLclampf ref); + void _glCullFace(unsigned int mode); + void _glAlphaFunc(unsigned int func, float ref); - void _glDepthFunc(GLenum func); - void _glDepthMask(GLboolean flag); - void _glDepthRange(GLfloat zNear, GLfloat zFar); + void _glDepthFunc(unsigned int func); + void _glDepthMask(unsigned char flag); + void _glDepthRange(float zNear, float zFar); - void _glBindBuffer(GLenum target, GLuint buffer); + void _glBindBuffer(unsigned int target, unsigned int buffer); - void _glBindTexture(GLenum target, GLuint texture); - void _glActiveTexture(GLenum texture); - void _glTexParameteri(GLenum target, GLenum pname, GLint param); + void _glBindTexture(unsigned int target, unsigned int texture); + void _glActiveTexture(unsigned int texture); + void _glTexParameteri(unsigned int target, unsigned int pname, int param); - void _glDrawBuffers(GLsizei n, const GLenum* bufs); + void _glDrawBuffers(int n, const unsigned int* bufs); - void _glUseProgram(GLuint program); - void _glUniform1i(GLint location, GLint v0); - void _glUniform1f(GLint location, GLfloat v0); - void _glUniform2f(GLint location, GLfloat v0, GLfloat v1); - void _glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - void _glUniform3fv(GLint location, GLsizei count, const GLfloat* value); - void _glUniform4fv(GLint location, GLsizei count, const GLfloat* value); - void _glUniform4iv(GLint location, GLsizei count, const GLint* value); - void _glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + void _glUseProgram(unsigned int program); + void _glUniform1i(int location, int v0); + void _glUniform1f(int location, float v0); + void _glUniform2f(int location, float v0, float v1); + void _glUniform3f(int location, float v0, float v1, float v2); + void _glUniform3fv(int location, int count, const float* value); + void _glUniform4fv(int location, int count, const float* value); + void _glUniform4iv(int location, int count, const int* value); + void _glUniformMatrix4fv(int location, int count, unsigned char transpose, const float* value); - void _glEnableVertexAttribArray(GLint location); - void _glDisableVertexAttribArray(GLint location); + void _glEnableVertexAttribArray(int location); + void _glDisableVertexAttribArray(int location); - void _glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); - void _glLineWidth(GLfloat width); + void _glColor4f(float red, float green, float blue, float alpha); + void _glLineWidth(float width); enum Command { COMMAND_draw = 0, @@ -185,6 +182,7 @@ public: COMMAND_setResourceTexture, COMMAND_setFramebuffer, + COMMAND_blit, COMMAND_beginQuery, COMMAND_endQuery, diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index ea7dca09b5..29f432e498 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -39,6 +39,7 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = (&::gpu::GLBackend::do_setResourceTexture), (&::gpu::GLBackend::do_setFramebuffer), + (&::gpu::GLBackend::do_blit), (&::gpu::GLBackend::do_beginQuery), (&::gpu::GLBackend::do_endQuery), diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index aedf058c82..2cdab49f29 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -394,6 +394,8 @@ protected: // Output stage void do_setFramebuffer(Batch& batch, uint32 paramOffset); + void do_blit(Batch& batch, uint32 paramOffset); + struct OutputStageState { diff --git a/libraries/gpu/src/gpu/GLBackendOutput.cpp b/libraries/gpu/src/gpu/GLBackendOutput.cpp index 1a7c5d2281..8876db95ac 100755 --- a/libraries/gpu/src/gpu/GLBackendOutput.cpp +++ b/libraries/gpu/src/gpu/GLBackendOutput.cpp @@ -166,3 +166,22 @@ void GLBackend::do_setFramebuffer(Batch& batch, uint32 paramOffset) { _output._framebuffer = framebuffer; } } + +void GLBackend::do_blit(Batch& batch, uint32 paramOffset) { + auto srcframebuffer = batch._framebuffers.get(batch._params[paramOffset]._uint); + Vec4i srcvp; + for (size_t i = 0; i < 4; ++i) { + srcvp[i] = batch._params[paramOffset + 1 + i]._int; + } + + auto dstframebuffer = batch._framebuffers.get(batch._params[paramOffset + 5]._uint); + Vec4i dstvp; + for (size_t i = 0; i < 4; ++i) { + dstvp[i] = batch._params[paramOffset + 6 + i]._int; + } + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, getFramebufferID(dstframebuffer)); + glBindFramebuffer(GL_READ_FRAMEBUFFER, getFramebufferID(srcframebuffer)); + glBlitFramebuffer(srcvp.x, srcvp.y, srcvp.z, srcvp.w, + dstvp.x, dstvp.y, dstvp.z, dstvp.w, + GL_COLOR_BUFFER_BIT, GL_LINEAR); +} diff --git a/libraries/gpu/src/gpu/Query.h b/libraries/gpu/src/gpu/Query.h index 0a4d554e77..d9c3185d9e 100644 --- a/libraries/gpu/src/gpu/Query.h +++ b/libraries/gpu/src/gpu/Query.h @@ -14,7 +14,6 @@ #include #include #include -#include "GPUConfig.h" #include "Format.h" diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index 8a77d4090a..1b0b5aeebc 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -9,9 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QOpenGLFramebufferObject, which includes an earlier version of OpenGL -#include - #include #include diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.h b/libraries/render-utils/src/AmbientOcclusionEffect.h index c7acb90133..a397a6e3d0 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.h +++ b/libraries/render-utils/src/AmbientOcclusionEffect.h @@ -12,6 +12,7 @@ #ifndef hifi_AmbientOcclusionEffect_h #define hifi_AmbientOcclusionEffect_h +#include #include class AbstractViewStateInterface; @@ -43,7 +44,7 @@ private: ProgramObject* _blurProgram; int _blurScaleLocation; - GLuint _rotationTextureID; + uint32_t _rotationTextureID; AbstractViewStateInterface* _viewState; }; diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 72c3f72fa1..582864991a 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -9,21 +9,21 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include "DeferredLightingEffect.h" #include +#include +#include +#include +#include #include #include #include "AbstractViewStateInterface.h" -#include "DeferredLightingEffect.h" #include "GeometryCache.h" #include "RenderUtil.h" #include "TextureCache.h" -#include "gpu/Batch.h" -#include "gpu/Context.h" -#include "gpu/StandardShaderLib.h" #include "simple_vert.h" #include "simple_textured_frag.h" diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index 2c5ef6bb83..ba4fbd6d69 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -17,8 +17,6 @@ #include #include -#include "ProgramObject.h" - #include "model/Light.h" #include "model/Stage.h" #include "model/Geometry.h" diff --git a/libraries/render-utils/src/Environment.h b/libraries/render-utils/src/Environment.h index 65e0df4b36..6fa5a1a782 100644 --- a/libraries/render-utils/src/Environment.h +++ b/libraries/render-utils/src/Environment.h @@ -21,7 +21,6 @@ #include class ViewFrustum; -class ProgramObject; class Environment { public: diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index b8a6fd939d..d566265982 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -10,8 +10,6 @@ // // include this before QOpenGLBuffer, which includes an earlier version of OpenGL -#include - #include #include diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 47490bca0d..147b4f8093 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -12,11 +12,7 @@ #ifndef hifi_GeometryCache_h #define hifi_GeometryCache_h -// include this before QOpenGLBuffer, which includes an earlier version of OpenGL -#include - #include -#include #include #include @@ -264,12 +260,7 @@ private: virtual ~GeometryCache(); typedef QPair IntPair; - typedef QPair VerticesIndices; - struct BufferDetails { - QOpenGLBuffer buffer; - int vertices; - int vertexSize; - }; + typedef QPair VerticesIndices; gpu::PipelinePointer _standardDrawPipeline; QHash _cubeVerticies; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 07df7fbda4..285daec247 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include - #include #include #include diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index b3a62b8da7..8c792c8a3b 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -12,8 +12,6 @@ #ifndef hifi_Model_h #define hifi_Model_h -#include - #include #include #include @@ -36,7 +34,6 @@ #include "AnimationHandle.h" #include "GeometryCache.h" #include "JointState.h" -#include "ProgramObject.h" #include "TextureCache.h" class AbstractViewStateInterface; diff --git a/libraries/render-utils/src/OffscreenGlCanvas.cpp b/libraries/render-utils/src/OffscreenGlCanvas.cpp index e41209a40c..9154149809 100644 --- a/libraries/render-utils/src/OffscreenGlCanvas.cpp +++ b/libraries/render-utils/src/OffscreenGlCanvas.cpp @@ -11,9 +11,12 @@ #include "OffscreenGlCanvas.h" -#include -OffscreenGlCanvas::OffscreenGlCanvas() { +#include +#include +#include + +OffscreenGlCanvas::OffscreenGlCanvas() : _context(new QOpenGLContext), _offscreenSurface(new QOffscreenSurface){ } OffscreenGlCanvas::~OffscreenGlCanvas() { @@ -24,14 +27,14 @@ OffscreenGlCanvas::~OffscreenGlCanvas() { _logger = nullptr; } #endif - _context.doneCurrent(); + _context->doneCurrent(); } void OffscreenGlCanvas::create(QOpenGLContext* sharedContext) { if (nullptr != sharedContext) { sharedContext->doneCurrent(); - _context.setFormat(sharedContext->format()); - _context.setShareContext(sharedContext); + _context->setFormat(sharedContext->format()); + _context->setShareContext(sharedContext); } else { QSurfaceFormat format; format.setDepthBufferSize(16); @@ -42,17 +45,17 @@ void OffscreenGlCanvas::create(QOpenGLContext* sharedContext) { #ifdef DEBUG format.setOption(QSurfaceFormat::DebugContext); #endif - _context.setFormat(format); + _context->setFormat(format); } - _context.create(); + _context->create(); - _offscreenSurface.setFormat(_context.format()); - _offscreenSurface.create(); + _offscreenSurface->setFormat(_context->format()); + _offscreenSurface->create(); } bool OffscreenGlCanvas::makeCurrent() { - bool result = _context.makeCurrent(&_offscreenSurface); + bool result = _context->makeCurrent(_offscreenSurface); #ifdef DEBUG if (result && !_logger) { @@ -71,6 +74,6 @@ bool OffscreenGlCanvas::makeCurrent() { } void OffscreenGlCanvas::doneCurrent() { - _context.doneCurrent(); + _context->doneCurrent(); } diff --git a/libraries/render-utils/src/OffscreenGlCanvas.h b/libraries/render-utils/src/OffscreenGlCanvas.h index 7a69e276e4..0fa226a30d 100644 --- a/libraries/render-utils/src/OffscreenGlCanvas.h +++ b/libraries/render-utils/src/OffscreenGlCanvas.h @@ -12,9 +12,10 @@ #ifndef hifi_OffscreenGlCanvas_h #define hifi_OffscreenGlCanvas_h -#include -#include +#include +class QOpenGLContext; +class QOffscreenSurface; class QOpenGLDebugLogger; class OffscreenGlCanvas : public QObject { @@ -25,12 +26,12 @@ public: bool makeCurrent(); void doneCurrent(); QOpenGLContext* getContext() { - return &_context; + return _context; } protected: - QOpenGLContext _context; - QOffscreenSurface _offscreenSurface; + QOpenGLContext* _context; + QOffscreenSurface* _offscreenSurface; #ifdef DEBUG QOpenGLDebugLogger* _logger{ nullptr }; #endif diff --git a/libraries/render-utils/src/OffscreenQmlSurface.cpp b/libraries/render-utils/src/OffscreenQmlSurface.cpp index b6bc6b721e..3ebc7704a8 100644 --- a/libraries/render-utils/src/OffscreenQmlSurface.cpp +++ b/libraries/render-utils/src/OffscreenQmlSurface.cpp @@ -11,9 +11,31 @@ #include #include #include +#include +#include +#include +#include +#include +#include "FboCache.h" #include +class QMyQuickRenderControl : public QQuickRenderControl { +protected: + QWindow* renderWindow(QPoint* offset) Q_DECL_OVERRIDE{ + if (nullptr == _renderWindow) { + return QQuickRenderControl::renderWindow(offset); + } + if (nullptr != offset) { + offset->rx() = offset->ry() = 0; + } + return _renderWindow; + } + +private: + QWindow* _renderWindow{ nullptr }; + friend class OffscreenQmlSurface; +}; #include "AbstractViewStateInterface.h" Q_DECLARE_LOGGING_CATEGORY(offscreenFocus) @@ -24,7 +46,8 @@ Q_LOGGING_CATEGORY(offscreenFocus, "hifi.offscreen.focus") // achieve. static const int SMALL_INTERVAL = 5; -OffscreenQmlSurface::OffscreenQmlSurface() { +OffscreenQmlSurface::OffscreenQmlSurface() : + _renderControl(new QMyQuickRenderControl), _fboCache(new FboCache) { } OffscreenQmlSurface::~OffscreenQmlSurface() { @@ -43,6 +66,7 @@ OffscreenQmlSurface::~OffscreenQmlSurface() { delete _qmlEngine; doneCurrent(); + delete _fboCache; } void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { @@ -87,7 +111,7 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { _qmlComponent = new QQmlComponent(_qmlEngine); // Initialize the render control and our OpenGL resources. makeCurrent(); - _renderControl->initialize(&_context); + _renderControl->initialize(_context); } void OffscreenQmlSurface::resize(const QSize& newSize) { @@ -101,14 +125,14 @@ void OffscreenQmlSurface::resize(const QSize& newSize) { pixelRatio = AbstractViewStateInterface::instance()->getDevicePixelRatio(); } QSize newOffscreenSize = newSize * pixelRatio; - if (newOffscreenSize == _fboCache.getSize()) { + if (newOffscreenSize == _fboCache->getSize()) { return; } // Clear out any fbos with the old size makeCurrent(); qDebug() << "Offscreen UI resizing to " << newSize.width() << "x" << newSize.height() << " with pixel ratio " << pixelRatio; - _fboCache.setSize(newSize * pixelRatio); + _fboCache->setSize(newSize * pixelRatio); if (_quickWindow) { _quickWindow->setGeometry(QRect(QPoint(), newSize)); @@ -233,7 +257,7 @@ void OffscreenQmlSurface::updateQuick() { _polish = false; } - QOpenGLFramebufferObject* fbo = _fboCache.getReadyFbo(); + QOpenGLFramebufferObject* fbo = _fboCache->getReadyFbo(); _quickWindow->setRenderTarget(fbo); fbo->bind(); @@ -354,11 +378,11 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even } void OffscreenQmlSurface::lockTexture(int texture) { - _fboCache.lockTexture(texture); + _fboCache->lockTexture(texture); } void OffscreenQmlSurface::releaseTexture(int texture) { - _fboCache.releaseTexture(texture); + _fboCache->releaseTexture(texture); } void OffscreenQmlSurface::pause() { diff --git a/libraries/render-utils/src/OffscreenQmlSurface.h b/libraries/render-utils/src/OffscreenQmlSurface.h index a1b66b48ad..b892806c44 100644 --- a/libraries/render-utils/src/OffscreenQmlSurface.h +++ b/libraries/render-utils/src/OffscreenQmlSurface.h @@ -9,15 +9,8 @@ #ifndef hifi_OffscreenQmlSurface_h #define hifi_OffscreenQmlSurface_h -#include -#include -#include -#include -#include -#include #include -#include - +#include #include #include @@ -25,27 +18,19 @@ #include #include "OffscreenGlCanvas.h" -#include "FboCache.h" + +class QWindow; +class QMyQuickRenderControl; +class QQmlEngine; +class QQmlContext; +class QQmlComponent; +class QQuickWindow; +class QQuickItem; +class FboCache; class OffscreenQmlSurface : public OffscreenGlCanvas { Q_OBJECT -protected: - class QMyQuickRenderControl : public QQuickRenderControl { - protected: - QWindow* renderWindow(QPoint* offset) Q_DECL_OVERRIDE{ - if (nullptr == _renderWindow) { - return QQuickRenderControl::renderWindow(offset); - } - if (nullptr != offset) { - offset->rx() = offset->ry() = 0; - } - return _renderWindow; - } - private: - QWindow* _renderWindow{ nullptr }; - friend class OffscreenQmlSurface; - }; public: OffscreenQmlSurface(); virtual ~OffscreenQmlSurface(); @@ -76,7 +61,7 @@ public: virtual bool eventFilter(QObject* originalDestination, QEvent* event); signals: - void textureUpdated(GLuint texture); + void textureUpdated(unsigned int texture); public slots: void requestUpdate(); @@ -95,12 +80,12 @@ protected: QQuickWindow* _quickWindow{ nullptr }; private: - QMyQuickRenderControl* _renderControl{ new QMyQuickRenderControl }; + QMyQuickRenderControl* _renderControl{ nullptr }; QQmlEngine* _qmlEngine{ nullptr }; QQmlComponent* _qmlComponent{ nullptr }; QQuickItem* _rootItem{ nullptr }; QTimer _updateTimer; - FboCache _fboCache; + FboCache* _fboCache; bool _polish{ true }; bool _paused{ true }; MouseTranslator _mouseTranslator{ [](const QPointF& p) { return p; } }; diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index fab134913d..3069e7b556 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -10,17 +10,18 @@ // #include "RenderDeferredTask.h" -#include "gpu/Batch.h" -#include "gpu/Context.h" +#include +#include +#include +#include +#include +#include + #include "DeferredLightingEffect.h" -#include "ViewFrustum.h" -#include "RenderArgs.h" #include "TextureCache.h" #include "render/DrawStatus.h" -#include - #include "overlay3D_vert.h" #include "overlay3D_frag.h" diff --git a/libraries/render-utils/src/RenderUtil.cpp b/libraries/render-utils/src/RenderUtil.cpp index 7744817625..44733418ff 100644 --- a/libraries/render-utils/src/RenderUtil.cpp +++ b/libraries/render-utils/src/RenderUtil.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include - #include #include "GeometryCache.h" diff --git a/libraries/render-utils/src/TextRenderer3D.cpp b/libraries/render-utils/src/TextRenderer3D.cpp index a93ba1daec..5519300a2e 100644 --- a/libraries/render-utils/src/TextRenderer3D.cpp +++ b/libraries/render-utils/src/TextRenderer3D.cpp @@ -12,8 +12,6 @@ #include "TextRenderer3D.h" #include -#include -#include #include #include diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index 953cfda910..910cf3386b 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -237,18 +237,6 @@ GLuint TextureCache::getPrimaryDepthTextureID() { return gpu::GLBackend::getTextureID(getPrimaryDepthTexture()); } -GLuint TextureCache::getPrimaryColorTextureID() { - return gpu::GLBackend::getTextureID(getPrimaryColorTexture()); -} - -GLuint TextureCache::getPrimaryNormalTextureID() { - return gpu::GLBackend::getTextureID(getPrimaryNormalTexture()); -} - -GLuint TextureCache::getPrimarySpecularTextureID() { - return gpu::GLBackend::getTextureID(getPrimarySpecularTexture()); -} - void TextureCache::setPrimaryDrawBuffers(bool color, bool normal, bool specular) { gpu::Batch batch; setPrimaryDrawBuffers(batch, color, normal, specular); @@ -284,7 +272,6 @@ gpu::FramebufferPointer TextureCache::getTertiaryFramebuffer() { return _tertiaryFramebuffer; } - gpu::FramebufferPointer TextureCache::getShadowFramebuffer() { if (!_shadowFramebuffer) { const int SHADOW_MAP_SIZE = 2048; @@ -295,12 +282,6 @@ gpu::FramebufferPointer TextureCache::getShadowFramebuffer() { return _shadowFramebuffer; } -GLuint TextureCache::getShadowDepthTextureID() { - // ensure that the shadow framebuffer object is initialized before returning the depth texture id - getShadowFramebuffer(); - return gpu::GLBackend::getTextureID(_shadowTexture); -} - /// Returns a texture version of an image file gpu::TexturePointer TextureCache::getImageTexture(const QString& path) { QImage image = QImage(path).mirrored(false, true); @@ -331,10 +312,6 @@ Texture::Texture() { Texture::~Texture() { } -GLuint Texture::getID() const { - return gpu::GLBackend::getTextureID(_gpuTexture); -} - NetworkTexture::NetworkTexture(const QUrl& url, TextureType type, const QByteArray& content) : Resource(url, !content.isEmpty()), _type(type), diff --git a/libraries/render-utils/src/TextureCache.h b/libraries/render-utils/src/TextureCache.h index fc02438c84..6b4fff4f6b 100644 --- a/libraries/render-utils/src/TextureCache.h +++ b/libraries/render-utils/src/TextureCache.h @@ -12,7 +12,6 @@ #ifndef hifi_TextureCache_h #define hifi_TextureCache_h -#include #include #include @@ -78,14 +77,7 @@ public: gpu::TexturePointer getPrimarySpecularTexture(); /// Returns the ID of the primary framebuffer object's depth texture. This contains the Z buffer used in rendering. - GLuint getPrimaryDepthTextureID(); - GLuint getPrimaryColorTextureID(); - - /// Returns the ID of the primary framebuffer object's normal texture. - GLuint getPrimaryNormalTextureID(); - - /// Returns the ID of the primary framebuffer object's specular texture. - GLuint getPrimarySpecularTextureID(); + uint32_t getPrimaryDepthTextureID(); /// Enables or disables draw buffers on the primary framebuffer. Note: the primary framebuffer must be bound. void setPrimaryDrawBuffers(bool color, bool normal = false, bool specular = false); @@ -102,10 +94,6 @@ public: /// Returns the framebuffer object used to render shadow maps; gpu::FramebufferPointer getShadowFramebuffer(); - - /// Returns the ID of the shadow framebuffer object's depth texture. - GLuint getShadowDepthTextureID(); - protected: virtual QSharedPointer createResource(const QUrl& url, @@ -149,8 +137,6 @@ public: Texture(); ~Texture(); - GLuint getID() const; - const gpu::TexturePointer& getGPUTexture() const { return _gpuTexture; } protected: diff --git a/libraries/render-utils/src/text/Font.cpp b/libraries/render-utils/src/text/Font.cpp index 6aae7ae81a..99a96b45f3 100644 --- a/libraries/render-utils/src/text/Font.cpp +++ b/libraries/render-utils/src/text/Font.cpp @@ -314,7 +314,7 @@ void Font::drawString(gpu::Batch& batch, float x, float y, const QString& str, c batch.setPipeline(_pipeline); batch.setResourceTexture(_fontLoc, _texture); batch._glUniform1i(_outlineLoc, (effectType == OUTLINE_EFFECT)); - batch._glUniform4fv(_colorLoc, 1, (const GLfloat*)color); + batch._glUniform4fv(_colorLoc, 1, (const float*)color); batch.setInputFormat(_format); batch.setInputBuffer(0, _verticesBuffer, 0, _format->getChannels().at(0)._stride); diff --git a/libraries/render/src/render/DrawStatus.cpp b/libraries/render/src/render/DrawStatus.cpp index 90d167cc2a..5a34b3dc03 100644 --- a/libraries/render/src/render/DrawStatus.cpp +++ b/libraries/render/src/render/DrawStatus.cpp @@ -9,20 +9,20 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "DrawStatus.h" + #include #include -#include "DrawStatus.h" - #include -#include "gpu/GPULogging.h" +#include +#include +#include +#include -#include "gpu/Batch.h" -#include "gpu/Context.h" - -#include "ViewFrustum.h" -#include "RenderArgs.h" +#include +#include #include "drawItemBounds_vert.h" #include "drawItemBounds_frag.h" diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 6b028e6c4b..0e3eba0b53 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -9,18 +9,17 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "DrawTask.h" + #include #include -#include "DrawTask.h" - +#include +#include +#include #include - -#include "gpu/Batch.h" -#include "gpu/Context.h" - -#include "ViewFrustum.h" -#include "RenderArgs.h" +#include +#include using namespace render; diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index 5507072b2c..604cb46731 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -14,6 +14,7 @@ #include #include +#include "GLMHelpers.h" class AABox; diff --git a/libraries/shared/src/windowshacks.h b/libraries/shared/src/windowshacks.h index 67c6f8be0c..60ad650c24 100644 --- a/libraries/shared/src/windowshacks.h +++ b/libraries/shared/src/windowshacks.h @@ -54,6 +54,13 @@ inline int c99_snprintf(char* str, size_t size, const char* format, ...) { #endif // SNPRINTF_FIX #endif // _MSC_VER +#include +#include + +#else // WIN32 + +#include #endif // WIN32 + #endif // hifi_windowshacks_h diff --git a/libraries/ui/src/OffscreenQmlElement.h b/libraries/ui/src/OffscreenQmlElement.h new file mode 100644 index 0000000000..87b404a4bd --- /dev/null +++ b/libraries/ui/src/OffscreenQmlElement.h @@ -0,0 +1,82 @@ +// +// OffscreenUi.h +// interface/src/entities +// +// Created by Bradley Austin Davis on 2015-07-17 +// 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 +// +#pragma once +#ifndef hifi_OffscreenQmlElement_h +#define hifi_OffscreenQmlElement_h + +#include +class QQmlContext; + +#define HIFI_QML_DECL \ +private: \ + static const QString NAME; \ + static const QUrl QML; \ +public: \ + static void registerType(); \ + static void show(std::function f = [](QQmlContext*, QObject*) {}); \ + static void toggle(std::function f = [](QQmlContext*, QObject*) {}); \ + static void load(std::function f = [](QQmlContext*, QObject*) {}); \ +private: + +#define HIFI_QML_DECL_LAMBDA \ +protected: \ + static const QString NAME; \ + static const QUrl QML; \ +public: \ + static void registerType(); \ + static void show(); \ + static void toggle(); \ + static void load(); \ +private: + +#define HIFI_QML_DEF(x) \ + const QUrl x::QML = QUrl(#x ".qml"); \ + const QString x::NAME = #x; \ + \ + void x::registerType() { \ + qmlRegisterType("Hifi", 1, 0, NAME.toLocal8Bit().constData()); \ + } \ + \ + void x::show(std::function f) { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->show(QML, NAME, f); \ + } \ + \ + void x::toggle(std::function f) { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->toggle(QML, NAME, f); \ + } \ + void x::load(std::function f) { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->load(QML, f); \ + } + +#define HIFI_QML_DEF_LAMBDA(x, f) \ + const QUrl x::QML = QUrl(#x ".qml"); \ + const QString x::NAME = #x; \ + \ + void x::registerType() { \ + qmlRegisterType("Hifi", 1, 0, NAME.toLocal8Bit().constData()); \ + } \ + void x::show() { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->show(QML, NAME, f); \ + } \ + void x::toggle() { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->toggle(QML, NAME, f); \ + } \ + void x::load() { \ + auto offscreenUi = DependencyManager::get(); \ + offscreenUi->load(QML, f); \ + } + +#endif diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index d94cad20d2..916cdf8659 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -11,12 +11,12 @@ #include "OffscreenUi.h" #include #include +#include #include #include #include "ErrorDialog.h" #include "MessageDialog.h" - class OffscreenUiRoot : public QQuickItem { Q_OBJECT public: diff --git a/libraries/ui/src/OffscreenUi.h b/libraries/ui/src/OffscreenUi.h index c7fd205236..4c8b4a8304 100644 --- a/libraries/ui/src/OffscreenUi.h +++ b/libraries/ui/src/OffscreenUi.h @@ -14,72 +14,11 @@ #include "OffscreenQmlSurface.h" +#include #include +#include "OffscreenQmlElement.h" -#define HIFI_QML_DECL \ -private: \ - static const QString NAME; \ - static const QUrl QML; \ -public: \ - static void registerType(); \ - static void show(std::function f = [](QQmlContext*, QObject*) {}); \ - static void toggle(std::function f = [](QQmlContext*, QObject*) {}); \ - static void load(std::function f = [](QQmlContext*, QObject*) {}); \ -private: - -#define HIFI_QML_DECL_LAMBDA \ -protected: \ - static const QString NAME; \ - static const QUrl QML; \ -public: \ - static void registerType(); \ - static void show(); \ - static void toggle(); \ - static void load(); \ -private: - -#define HIFI_QML_DEF(x) \ - const QUrl x::QML = QUrl(#x ".qml"); \ - const QString x::NAME = #x; \ - \ - void x::registerType() { \ - qmlRegisterType("Hifi", 1, 0, NAME.toLocal8Bit().constData()); \ - } \ - \ - void x::show(std::function f) { \ - auto offscreenUi = DependencyManager::get(); \ - offscreenUi->show(QML, NAME, f); \ - } \ - \ - void x::toggle(std::function f) { \ - auto offscreenUi = DependencyManager::get(); \ - offscreenUi->toggle(QML, NAME, f); \ - } \ - void x::load(std::function f) { \ - auto offscreenUi = DependencyManager::get(); \ - offscreenUi->load(QML, f); \ - } - -#define HIFI_QML_DEF_LAMBDA(x, f) \ - const QUrl x::QML = QUrl(#x ".qml"); \ - const QString x::NAME = #x; \ - \ - void x::registerType() { \ - qmlRegisterType("Hifi", 1, 0, NAME.toLocal8Bit().constData()); \ - } \ - void x::show() { \ - auto offscreenUi = DependencyManager::get(); \ - offscreenUi->show(QML, NAME, f); \ - } \ - void x::toggle() { \ - auto offscreenUi = DependencyManager::get(); \ - offscreenUi->toggle(QML, NAME, f); \ - } \ - void x::load() { \ - auto offscreenUi = DependencyManager::get(); \ - offscreenUi->load(QML, f); \ - } class OffscreenUi : public OffscreenQmlSurface, public Dependency { Q_OBJECT From b7fdfd8663a9e0fd5111d79fd61b8e1c70308961 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 10:55:53 -0700 Subject: [PATCH 561/582] Working on lighting --- interface/src/Application.cpp | 34 +++++++----------- interface/src/Application.h | 2 +- libraries/gpu/src/gpu/Batch.cpp | 23 +++++++++++++ libraries/gpu/src/gpu/Batch.h | 5 +++ libraries/gpu/src/gpu/GLBackend.cpp | 44 ++---------------------- libraries/gpu/src/gpu/GLBackend.h | 6 ++-- libraries/gpu/src/gpu/GLBackendInput.cpp | 28 +++++++++++++++ libraries/gpu/src/gpu/GLBackendShared.h | 2 -- libraries/gpu/src/gpu/Light.h | 31 +++++++++++++++++ 9 files changed, 105 insertions(+), 70 deletions(-) create mode 100644 libraries/gpu/src/gpu/Light.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 45fd7ebc09..185191b8ce 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3130,27 +3130,19 @@ void Application::updateShadowMap(RenderArgs* renderArgs) { activeRenderingThread = nullptr; } -const GLfloat WORLD_AMBIENT_COLOR[] = { 0.525f, 0.525f, 0.6f }; -const GLfloat WORLD_DIFFUSE_COLOR[] = { 0.6f, 0.525f, 0.525f }; -const GLfloat WORLD_SPECULAR_COLOR[] = { 0.08f, 0.08f, 0.08f, 1.0f }; - -const glm::vec3 GLOBAL_LIGHT_COLOR = { 0.6f, 0.525f, 0.525f }; - -void Application::setupWorldLight() { - - // Setup 3D lights (after the camera transform, so that they are positioned in world space) - glEnable(GL_COLOR_MATERIAL); - glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); - - glm::vec3 sunDirection = getSunDirection(); - GLfloat light_position0[] = { sunDirection.x, sunDirection.y, sunDirection.z, 0.0 }; - glLightfv(GL_LIGHT0, GL_POSITION, light_position0); - glLightfv(GL_LIGHT0, GL_AMBIENT, WORLD_AMBIENT_COLOR); - glLightfv(GL_LIGHT0, GL_DIFFUSE, WORLD_DIFFUSE_COLOR); - glLightfv(GL_LIGHT0, GL_SPECULAR, WORLD_SPECULAR_COLOR); - glMaterialfv(GL_FRONT, GL_SPECULAR, WORLD_SPECULAR_COLOR); - glMateriali(GL_FRONT, GL_SHININESS, 96); +static gpu::Light defaultLight{ + vec3( 0.525f, 0.525f, 0.6f), // ambient + vec3( 0.6f, 0.525f, 0.525f), // diffuse + vec4(0.08f, 0.08f, 0.08f, 1.0f), // specular + vec4( 0, 0, 0, 0 ), // position + 96 // shininess +}; +void Application::setupWorldLight(RenderArgs* renderArgs) { + gpu::Batch batch; + defaultLight._position = vec4(getSunDirection(), 0); + batch.setLight(0, defaultLight); + renderArgs->_context->render(batch); } bool Application::shouldRenderMesh(float largestDimension, float distanceToCamera) { @@ -3418,7 +3410,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se // Setup 3D lights (after the camera transform, so that they are positioned in world space) { PerformanceTimer perfTimer("lights"); - setupWorldLight(); + setupWorldLight(renderArgs); } // setup shadow matrices (again, after the camera transform) diff --git a/interface/src/Application.h b/interface/src/Application.h index c5445db1e8..3cdf6e729a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -262,7 +262,7 @@ public: void controlledBroadcastToNodes(const QByteArray& packet, const NodeSet& destinationNodeTypes); - virtual void setupWorldLight(); + virtual void setupWorldLight(RenderArgs* renderArgs); virtual bool shouldRenderMesh(float largestDimension, float distanceToCamera); QImage renderAvatarBillboard(RenderArgs* renderArgs); diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index e3e9088afa..f8d530bb74 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -288,3 +288,26 @@ void Batch::getQuery(const QueryPointer& query) { _params.push_back(_queries.cache(query)); } + +void push_back(Batch::Params& params, const vec3& v) { + params.push_back(v.x); + params.push_back(v.y); + params.push_back(v.z); +} + +void push_back(Batch::Params& params, const vec4& v) { + params.push_back(v.x); + params.push_back(v.y); + params.push_back(v.z); + params.push_back(v.a); +} + +void Batch::setLight(uint8_t index, const Light& light) { + ADD_COMMAND(setLight); + _params.push_back(index); + push_back(_params, light._ambientColor); + push_back(_params, light._diffuseColor); + push_back(_params, light._position); + push_back(_params, light._specularColor); + _params.push_back(light._shininess); +} \ No newline at end of file diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index 2f1d2e8ece..3954127783 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -14,6 +14,7 @@ #include #include "Framebuffer.h" +#include "Light.h" #include "Pipeline.h" #include "Query.h" #include "Stream.h" @@ -76,6 +77,8 @@ public: void setIndexBuffer(Type type, const BufferPointer& buffer, Offset offset); void setIndexBuffer(const BufferView& buffer); // not a command, just a shortcut from a BufferView + void setLight(uint8_t index, const Light& light); + // Transform Stage // Vertex position is transformed by ModelTransform from object space to world space // Then by the inverse of the ViewTransform from world space to eye space @@ -169,6 +172,8 @@ public: COMMAND_setInputBuffer, COMMAND_setIndexBuffer, + COMMAND_setLight, + COMMAND_setModelTransform, COMMAND_setViewTransform, COMMAND_setProjectionTransform, diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 29f432e498..f6b9bb8706 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -26,6 +26,8 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = (&::gpu::GLBackend::do_setInputBuffer), (&::gpu::GLBackend::do_setIndexBuffer), + (&::gpu::GLBackend::do_setLight), + (&::gpu::GLBackend::do_setModelTransform), (&::gpu::GLBackend::do_setViewTransform), (&::gpu::GLBackend::do_setProjectionTransform), @@ -747,45 +749,3 @@ void GLBackend::do_glLineWidth(Batch& batch, uint32 paramOffset) { glLineWidth(batch._params[paramOffset]._float); (void) CHECK_GL_ERROR(); } - -void GLBackend::loadMatrix(GLenum target, const glm::mat4 & m) { - glMatrixMode(target); - glLoadMatrixf(glm::value_ptr(m)); -} - -void GLBackend::fetchMatrix(GLenum target, glm::mat4 & m) { - switch (target) { - case GL_MODELVIEW_MATRIX: - case GL_PROJECTION_MATRIX: - break; - - // Lazy cheating - case GL_MODELVIEW: - target = GL_MODELVIEW_MATRIX; - break; - case GL_PROJECTION: - target = GL_PROJECTION_MATRIX; - break; - default: - Q_ASSERT_X(false, "GLBackend::fetchMatrix", "Bad matrix target"); - } - glGetFloatv(target, glm::value_ptr(m)); -} - -void GLBackend::checkGLStackStable(std::function f) { -#ifdef DEBUG - GLint mvDepth, prDepth; - glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &mvDepth); - glGetIntegerv(GL_PROJECTION_STACK_DEPTH, &prDepth); -#endif - - f(); - -#ifdef DEBUG - GLint mvDepthFinal, prDepthFinal; - glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &mvDepthFinal); - glGetIntegerv(GL_PROJECTION_STACK_DEPTH, &prDepthFinal); - Q_ASSERT(mvDepth == mvDepthFinal); - Q_ASSERT(prDepth == prDepthFinal); -#endif -} diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 2cdab49f29..eab880f14d 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -107,10 +107,6 @@ public: static GLShader* syncGPUObject(const Shader& shader); static GLuint getShaderID(const ShaderPointer& shader); - // FIXME: Please remove these 2 calls once the text renderer doesn't use naked gl calls anymore - static void loadMatrix(GLenum target, const glm::mat4 & m); - static void fetchMatrix(GLenum target, glm::mat4 & m); - class GLState : public GPUObject { public: class Command { @@ -257,6 +253,8 @@ protected: void do_setInputBuffer(Batch& batch, uint32 paramOffset); void do_setIndexBuffer(Batch& batch, uint32 paramOffset); + void do_setLight(Batch& batch, uint32 paramOffset); + void initInput(); void killInput(); void syncInputStateCache(); diff --git a/libraries/gpu/src/gpu/GLBackendInput.cpp b/libraries/gpu/src/gpu/GLBackendInput.cpp index 34b1b1761f..e356dbcb9a 100755 --- a/libraries/gpu/src/gpu/GLBackendInput.cpp +++ b/libraries/gpu/src/gpu/GLBackendInput.cpp @@ -298,3 +298,31 @@ void GLBackend::do_setIndexBuffer(Batch& batch, uint32 paramOffset) { } (void) CHECK_GL_ERROR(); } + +template +void popParam(Batch::Params& params, uint32& paramOffset, V& v) { + for (size_t i = 0; i < v.length(); ++i) { + v[i] = params[paramOffset++]._float; + } +} + +void GLBackend::do_setLight(Batch& batch, uint32 paramOffset) { + int index = batch._params[paramOffset++]._uint; + gpu::Light light; + popParam(batch._params, paramOffset, light._ambientColor); + popParam(batch._params, paramOffset, light._diffuseColor); + popParam(batch._params, paramOffset, light._position); + popParam(batch._params, paramOffset, light._specularColor); + light._shininess = batch._params[paramOffset++]._int; + + // Setup 3D lights (after the camera transform, so that they are positioned in world space) + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + glLightfv(GL_LIGHT0 + index, GL_POSITION, &light._position.x); + glLightfv(GL_LIGHT0 + index, GL_AMBIENT, &light._ambientColor.r); + glLightfv(GL_LIGHT0 + index, GL_DIFFUSE, &light._diffuseColor.r); + glLightfv(GL_LIGHT0 + index, GL_SPECULAR, &light._specularColor.r); + glMaterialfv(GL_FRONT + index, GL_SPECULAR, &light._specularColor.r); + glMateriali(GL_FRONT + index, GL_SHININESS, light._shininess); +} + diff --git a/libraries/gpu/src/gpu/GLBackendShared.h b/libraries/gpu/src/gpu/GLBackendShared.h index 365934379f..27f58fcbe3 100644 --- a/libraries/gpu/src/gpu/GLBackendShared.h +++ b/libraries/gpu/src/gpu/GLBackendShared.h @@ -53,6 +53,4 @@ static const GLenum _elementTypeToGLType[gpu::NUM_TYPES] = { // #define CHECK_GL_ERROR() gpu::GLBackend::checkGLErrorDebug(__FUNCTION__ ":" CHECK_GL_ERROR_HELPER(__LINE__)) #define CHECK_GL_ERROR() gpu::GLBackend::checkGLErrorDebug(__FUNCTION__) -#define CHECK_GL_STACK_STABLE(f) gpu::GLBackend::checkGLStackStable(f) - #endif diff --git a/libraries/gpu/src/gpu/Light.h b/libraries/gpu/src/gpu/Light.h new file mode 100644 index 0000000000..080a117405 --- /dev/null +++ b/libraries/gpu/src/gpu/Light.h @@ -0,0 +1,31 @@ +// +// Created by Bradley Austin Davis 2015/07/18 +// Copyright 2014 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 +// +#pragma once +#ifndef hifi_gpu_Light_h +#define hifi_gpu_Light_h + +#include + +namespace gpu { + +struct Light { + Light() {} + Light(const vec3& ambient, const vec3& diffuse, const vec4& position, const vec4& specular = vec4(), int shininess = 0) : + _ambientColor(ambient), _diffuseColor(diffuse), _specularColor(specular), _position(position), _shininess(shininess) { + + } + vec3 _ambientColor; + vec3 _diffuseColor; + vec4 _position; + vec4 _specularColor; + int _shininess{0}; +}; + +} + +#endif From 5e0a0409bfa9f7955342047aab1198a5fe1c79f0 Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Sat, 18 Jul 2015 12:16:51 -0700 Subject: [PATCH 562/582] Removing setupWorldLight from viewstateinterface --- libraries/gpu/src/gpu/Light.h | 2 +- libraries/render-utils/src/AbstractViewStateInterface.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/gpu/src/gpu/Light.h b/libraries/gpu/src/gpu/Light.h index 080a117405..6ce8eb637f 100644 --- a/libraries/gpu/src/gpu/Light.h +++ b/libraries/gpu/src/gpu/Light.h @@ -16,7 +16,7 @@ namespace gpu { struct Light { Light() {} Light(const vec3& ambient, const vec3& diffuse, const vec4& position, const vec4& specular = vec4(), int shininess = 0) : - _ambientColor(ambient), _diffuseColor(diffuse), _specularColor(specular), _position(position), _shininess(shininess) { + _ambientColor(ambient), _diffuseColor(diffuse), _position(position), _specularColor(specular), _shininess(shininess) { } vec3 _ambientColor; diff --git a/libraries/render-utils/src/AbstractViewStateInterface.h b/libraries/render-utils/src/AbstractViewStateInterface.h index ff417da85e..b6783f7455 100644 --- a/libraries/render-utils/src/AbstractViewStateInterface.h +++ b/libraries/render-utils/src/AbstractViewStateInterface.h @@ -52,7 +52,6 @@ public: virtual QThread* getMainThread() = 0; virtual const Transform& getViewTransform() const = 0; - virtual void setupWorldLight() = 0; virtual bool shouldRenderMesh(float largestDimension, float distanceToCamera) = 0; virtual float getSizeScale() const = 0; virtual int getBoundaryLevelAdjust() const = 0; From e4f6586c3c50b71577098980fbeb3671ababe9a8 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 16:40:54 -0700 Subject: [PATCH 563/582] Working on star rendering, removal of naked GL --- interface/src/Application.cpp | 60 +++----- interface/src/Stars.cpp | 176 ++++++++++++++++-------- interface/src/ui/ApplicationOverlay.cpp | 1 - 3 files changed, 135 insertions(+), 102 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 185191b8ce..9cecae2854 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2991,15 +2991,26 @@ glm::vec3 Application::getSunDirection() { static QThread * activeRenderingThread = nullptr; void Application::updateShadowMap(RenderArgs* renderArgs) { + // TODO fix shadows and make them use the GPU library +#if 0 activeRenderingThread = QThread::currentThread(); PerformanceTimer perfTimer("shadowMap"); auto shadowFramebuffer = DependencyManager::get()->getShadowFramebuffer(); - glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(shadowFramebuffer)); - - glEnable(GL_DEPTH_TEST); - glClear(GL_DEPTH_BUFFER_BIT); + { + gpu::Batch batch; + auto primaryFbo = DependencyManager::get()->getPrimaryFramebuffer(); + batch.setFramebuffer(shadowFramebuffer); + // clear the normal and specular buffers + batch.clearFramebuffer( + gpu::Framebuffer::BUFFER_DEPTH, + vec4(vec3(0), 1), 1.0, 0.0); + // Viewport is assigned to the size of the framebuffer + QSize size = DependencyManager::get()->getFrameBufferSize(); + renderArgs->_context->render(batch); + } + glm::vec3 lightDirection = getSunDirection(); glm::quat rotation = rotationBetween(IDENTITY_FRONT, lightDirection); glm::quat inverseRotation = glm::inverse(rotation); @@ -3079,30 +3090,13 @@ void Application::updateShadowMap(RenderArgs* renderArgs) { _shadowViewFrustum.setProjection(glm::ortho(minima.x, maxima.x, minima.y, maxima.y, minima.z, maxima.z)); _shadowViewFrustum.calculate(); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glOrtho(minima.x, maxima.x, minima.y, maxima.y, -maxima.z, -minima.z); - - glm::mat4 projAgain; - glGetFloatv(GL_PROJECTION_MATRIX, (GLfloat*)&projAgain); - - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - glm::vec3 axis = glm::axis(inverseRotation); - glRotatef(glm::degrees(glm::angle(inverseRotation)), axis.x, axis.y, axis.z); - // store view matrix without translation, which we'll use for precision-sensitive objects updateUntranslatedViewMatrix(); - // Equivalent to what is happening with _untranslatedViewMatrix and the _viewMatrixTranslation // the viewTransofmr object is updatded with the correct values and saved, // this is what is used for rendering the Entities and avatars Transform viewTransform; viewTransform.setRotation(rotation); - // viewTransform.postTranslate(shadowFrustumCenter); setViewTransform(viewTransform); @@ -3115,19 +3109,11 @@ void Application::updateShadowMap(RenderArgs* renderArgs) { } glDisable(GL_POLYGON_OFFSET_FILL); - - glPopMatrix(); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - - glMatrixMode(GL_MODELVIEW); } - // fbo->release(); - glViewport(0, 0, _glWidget->getDeviceWidth(), _glWidget->getDeviceHeight()); activeRenderingThread = nullptr; +#endif } static gpu::Light defaultLight{ @@ -3412,7 +3398,9 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se PerformanceTimer perfTimer("lights"); setupWorldLight(renderArgs); } - + + // TODO fix shadows and make them use the GPU library +#if 0 // setup shadow matrices (again, after the camera transform) int shadowMatrixCount = 0; if (Menu::getInstance()->isOptionChecked(MenuOption::SimpleShadows)) { @@ -3426,7 +3414,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se glTexGenfv(GL_T, GL_EYE_PLANE, (const GLfloat*)&_shadowMatrices[i][1]); glTexGenfv(GL_R, GL_EYE_PLANE, (const GLfloat*)&_shadowMatrices[i][2]); } - +#endif // The pending changes collecting the changes here render::PendingChanges pendingChanges; @@ -3444,11 +3432,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } - glEnable(GL_LIGHTING); - glEnable(GL_DEPTH_TEST); - // Assuming nothing get's rendered through that - if (!selfAvatarOnly) { if (DependencyManager::get()->shouldRenderEntities()) { // render models... @@ -3574,7 +3558,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se } void Application::updateUntranslatedViewMatrix(const glm::vec3& viewMatrixTranslation) { - glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat*)&_untranslatedViewMatrix); _viewMatrixTranslation = viewMatrixTranslation; } @@ -3583,9 +3566,6 @@ void Application::setViewTransform(const Transform& view) { } void Application::loadTranslatedViewMatrix(const glm::vec3& translation) { - glLoadMatrixf((const GLfloat*)&_untranslatedViewMatrix); - glTranslatef(translation.x + _viewMatrixTranslation.x, translation.y + _viewMatrixTranslation.y, - translation.z + _viewMatrixTranslation.z); } void Application::getModelViewMatrix(glm::dmat4* modelViewMatrix) { diff --git a/interface/src/Stars.cpp b/interface/src/Stars.cpp index ce43f3761d..8ac49da78f 100644 --- a/interface/src/Stars.cpp +++ b/interface/src/Stars.cpp @@ -11,7 +11,37 @@ #include "Stars.h" +#include + +#include + +#include +#include #include +#include +#include +#include +#include +#include + +static const unsigned int STARFIELD_NUM_STARS = 50000; +static const unsigned int STARFIELD_SEED = 1; +static const float STAR_COLORIZATION = 0.1f; + +static const float TAU = 6.28318530717958f; +static const float HALF_TAU = TAU / 2.0f; +static const float QUARTER_TAU = TAU / 4.0f; +static const float MILKY_WAY_WIDTH = TAU / 30.0f; // width in radians of one half of the Milky Way +static const float MILKY_WAY_INCLINATION = 0.0f; // angle of Milky Way from horizontal in degrees +static const float MILKY_WAY_RATIO = 0.4f; + +#include "../../libraries/render-utils/standardTransformPNTC_vert.h" + +const char stars_frag[] = R"SCRIBE(#version 430 compatibility +void main(void) { + gl_FragColor = vec4( 1.0 ); +} +)SCRIBE"; Stars::Stars() { } @@ -19,70 +49,43 @@ Stars::Stars() { Stars::~Stars() { } -void Stars::render(RenderArgs* args, float alpha) { +// Produce a random float value between 0 and 1 +static float frand() { + return (float)rand() / (float)RAND_MAX; +} + +// Produce a random radian value between 0 and 2 PI (TAU) +static float rrand() { + return frand() * TAU; +} + +// http://mathworld.wolfram.com/SpherePointPicking.html +static vec2 randPolar() { + vec2 result(frand(), frand()); + result.x *= TAU; + result.y = powf(result.y, 2.0) / 2.0f; + if (frand() > 0.5f) { + result.y = 0.5f - result.y; + } else { + result.y += 0.5f; + } + result.y = acos((2.0f * result.y) - 1.0f); + return result; } -/* -static unsigned STARFIELD_NUM_STARS = 50000; -static unsigned STARFIELD_SEED = 1; -const float Generator::STAR_COLORIZATION = 0.1f; -const float PI_OVER_180 = 3.14159265358979f / 180.0f; - -void Generator::computeStarPositions(InputVertices& destination, unsigned limit, unsigned seed) { - InputVertices* vertices = &destination; - //_limit = limit; - - QElapsedTimer startTime; - startTime.start(); - - srand(seed); - - vertices->clear(); - vertices->reserve(limit); - - const unsigned MILKY_WAY_WIDTH = 12.0; // width in degrees of one half of the Milky Way - const float MILKY_WAY_INCLINATION = 0.0f; // angle of Milky Way from horizontal in degrees - const float MILKY_WAY_RATIO = 0.4f; - const unsigned NUM_DEGREES = 360; - - for (int star = 0; star < floor(limit * (1 - MILKY_WAY_RATIO)); ++star) { - float azimuth, altitude; - azimuth = (((float)rand() / (float)RAND_MAX) * NUM_DEGREES) - (NUM_DEGREES / 2); - altitude = (acos((2.0f * ((float)rand() / (float)RAND_MAX)) - 1.0f) / PI_OVER_180) + 90; - vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION))); - } - - for (int star = 0; star < ceil(limit * MILKY_WAY_RATIO); ++star) { - float azimuth = ((float)rand() / (float)RAND_MAX) * NUM_DEGREES; - float altitude = powf(randFloat()*0.5f, 2.0f) / 0.25f * MILKY_WAY_WIDTH; - if (randFloat() > 0.5f) { - altitude *= -1.0f; - } - - // we need to rotate the Milky Way band to the correct orientation in the sky - // convert from spherical coordinates to cartesian, rotate the point and then convert back. - // An improvement would be to convert all stars to cartesian at this point and not have to convert back. - - float tempX = sin(azimuth * PI_OVER_180) * cos(altitude * PI_OVER_180); - float tempY = sin(altitude * PI_OVER_180); - float tempZ = -cos(azimuth * PI_OVER_180) * cos(altitude * PI_OVER_180); - - float xangle = MILKY_WAY_INCLINATION * PI_OVER_180; - float newX = (tempX * cos(xangle)) - (tempY * sin(xangle)); - float newY = (tempX * sin(xangle)) + (tempY * cos(xangle)); - float newZ = tempZ; - - azimuth = (atan2(newX, -newZ) + Radians::pi()) / PI_OVER_180; - altitude = atan2(-newY, hypotf(newX, newZ)) / PI_OVER_180; - - vertices->push_back(InputVertex(azimuth, altitude, computeStarColor(STAR_COLORIZATION))); - } - - double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms - qDebug() << "Total time to generate stars: " << timeDiff << " msec"; +static vec3 fromPolar(const vec2& polar) { + float sinTheta = sin(polar.x); + float cosTheta = cos(polar.x); + float sinPhi = sin(polar.y); + float cosPhi = cos(polar.y); + return vec3( + cosTheta * sinPhi, + cosPhi, + sinTheta * sinPhi); } + // computeStarColor // - Generate a star color. // @@ -90,7 +93,7 @@ void Generator::computeStarPositions(InputVertices& destination, unsigned limit, // // 0 = completely black & white // 1 = very colorful -unsigned Generator::computeStarColor(float colorization) { +unsigned computeStarColor(float colorization) { unsigned char red, green, blue; if (randFloat() < 0.3f) { // A few stars are colorful @@ -103,4 +106,55 @@ unsigned Generator::computeStarColor(float colorization) { } return red | (green << 8) | (blue << 16); } -*/ \ No newline at end of file + +// FIXME star colors +void Stars::render(RenderArgs* renderArgs, float alpha) { + static gpu::BufferPointer vertexBuffer; + static gpu::Stream::FormatPointer streamFormat; + static gpu::Element positionElement, colorElement; + + const int VERTICES_SLOT = 0; + const int COLOR_SLOT = 2; + + static std::once_flag once; + + std::call_once(once, [&] { + QElapsedTimer startTime; + startTime.start(); + + vertexBuffer.reset(new gpu::Buffer); + + srand(STARFIELD_SEED); + unsigned limit = STARFIELD_NUM_STARS; + std::vector points; + points.reserve(limit); + for (size_t star = 0; star < limit; ++star) { + points[star] = fromPolar(randPolar()); + //auto color = computeStarColor(STAR_COLORIZATION); + //vertexBuffer->append(sizeof(color), (const gpu::Byte*)&color); + } + vertexBuffer->append(sizeof(vec3) * limit, (const gpu::Byte*)&points[0]); + streamFormat.reset(new gpu::Stream::Format()); // 1 for everyone + streamFormat->setAttribute(gpu::Stream::POSITION, VERTICES_SLOT, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); + positionElement = streamFormat->getAttributes().at(gpu::Stream::POSITION)._element; + double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms + qDebug() << "Total time to generate stars: " << timeDiff << " msec"; + }); + + gpu::Batch batch; + batch.setInputFormat(streamFormat); + batch.setInputBuffer(VERTICES_SLOT, gpu::BufferView(vertexBuffer, positionElement)); + Transform tr; +// tr.setTranslation(renderArgs->_viewFrustum->getPosition()); + tr.setRotation(glm::inverse(renderArgs->_viewFrustum->getOrientation())); + batch.setViewTransform(Transform()); + batch.setModelTransform(tr); + batch.setProjectionTransform(renderArgs->_viewFrustum->getProjection()); + auto geometryCache = DependencyManager::get(); + auto textureCache = DependencyManager::get(); + geometryCache->useSimpleDrawPipeline(batch); + batch.setResourceTexture(0, textureCache->getWhiteTexture()); + batch.draw(gpu::Primitive::POINTS, STARFIELD_NUM_STARS); + renderArgs->_context->syncCache(); + renderArgs->_context->render(batch); +} diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index f1bf8265ef..1ab1210881 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -51,7 +51,6 @@ ApplicationOverlay::ApplicationOverlay() connect(offscreenUi.data(), &OffscreenUi::textureUpdated, this, [&](GLuint textureId) { auto offscreenUi = DependencyManager::get(); offscreenUi->lockTexture(textureId); - assert(!glGetError()); std::swap(_uiTexture, textureId); if (textureId) { offscreenUi->releaseTexture(textureId); From c446bb307d279fd049d24e72f111fb9c570ab4f3 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 16:56:32 -0700 Subject: [PATCH 564/582] Adding convenience return *this to many transform methods --- interface/src/Stars.cpp | 6 +- libraries/shared/src/Transform.h | 119 +++++++++++++++++-------------- 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/interface/src/Stars.cpp b/interface/src/Stars.cpp index 8ac49da78f..3ef909786d 100644 --- a/interface/src/Stars.cpp +++ b/interface/src/Stars.cpp @@ -144,17 +144,13 @@ void Stars::render(RenderArgs* renderArgs, float alpha) { gpu::Batch batch; batch.setInputFormat(streamFormat); batch.setInputBuffer(VERTICES_SLOT, gpu::BufferView(vertexBuffer, positionElement)); - Transform tr; -// tr.setTranslation(renderArgs->_viewFrustum->getPosition()); - tr.setRotation(glm::inverse(renderArgs->_viewFrustum->getOrientation())); batch.setViewTransform(Transform()); - batch.setModelTransform(tr); batch.setProjectionTransform(renderArgs->_viewFrustum->getProjection()); + batch.setModelTransform(Transform().setRotation(glm::inverse(renderArgs->_viewFrustum->getOrientation()))); auto geometryCache = DependencyManager::get(); auto textureCache = DependencyManager::get(); geometryCache->useSimpleDrawPipeline(batch); batch.setResourceTexture(0, textureCache->getWhiteTexture()); batch.draw(gpu::Primitive::POINTS, STARFIELD_NUM_STARS); - renderArgs->_context->syncCache(); renderArgs->_context->render(batch); } diff --git a/libraries/shared/src/Transform.h b/libraries/shared/src/Transform.h index 3b66bcd814..1ec81fbc43 100644 --- a/libraries/shared/src/Transform.h +++ b/libraries/shared/src/Transform.h @@ -82,25 +82,25 @@ public: return (*this); } - void setIdentity(); + Transform& setIdentity(); const Vec3& getTranslation() const; - void setTranslation(const Vec3& translation); // [new this] = [translation] * [this.rotation] * [this.scale] - void preTranslate(const Vec3& translation); // [new this] = [translation] * [this] - void postTranslate(const Vec3& translation); // [new this] = [this] * [translation] equivalent to:glTranslate + Transform& setTranslation(const Vec3& translation); // [new this] = [translation] * [this.rotation] * [this.scale] + Transform& preTranslate(const Vec3& translation); // [new this] = [translation] * [this] + Transform& postTranslate(const Vec3& translation); // [new this] = [this] * [translation] equivalent to:glTranslate const Quat& getRotation() const; - void setRotation(const Quat& rotation); // [new this] = [this.translation] * [rotation] * [this.scale] - void preRotate(const Quat& rotation); // [new this] = [rotation] * [this] - void postRotate(const Quat& rotation); // [new this] = [this] * [rotation] equivalent to:glRotate + Transform& setRotation(const Quat& rotation); // [new this] = [this.translation] * [rotation] * [this.scale] + Transform& preRotate(const Quat& rotation); // [new this] = [rotation] * [this] + Transform& postRotate(const Quat& rotation); // [new this] = [this] * [rotation] equivalent to:glRotate const Vec3& getScale() const; - void setScale(float scale); - void setScale(const Vec3& scale); // [new this] = [this.translation] * [this.rotation] * [scale] - void preScale(float scale); - void preScale(const Vec3& scale); - void postScale(float scale); // [new this] = [this] * [scale] equivalent to:glScale - void postScale(const Vec3& scale); // [new this] = [this] * [scale] equivalent to:glScale + Transform& setScale(float scale); + Transform& setScale(const Vec3& scale); // [new this] = [this.translation] * [this.rotation] * [scale] + Transform& preScale(float scale); + Transform& preScale(const Vec3& scale); + Transform& postScale(float scale); // [new this] = [this] * [scale] equivalent to:glScale + Transform& postScale(const Vec3& scale); // [new this] = [this] * [scale] equivalent to:glScale bool isIdentity() const { return (_flags & ~Flags(FLAG_CACHE_INVALID_BITSET)).none(); } bool isTranslating() const { return _flags[FLAG_TRANSLATION]; } @@ -109,8 +109,8 @@ public: bool isUniform() const { return !isNonUniform(); } bool isNonUniform() const { return _flags[FLAG_NON_UNIFORM]; } - void evalFromRawMatrix(const Mat4& matrix); - void evalFromRawMatrix(const Mat3& rotationScalematrix); + Transform& evalFromRawMatrix(const Mat4& matrix); + Transform& evalFromRawMatrix(const Mat3& rotationScalematrix); Mat4& getMatrix(Mat4& result) const; Mat4& getInverseMatrix(Mat4& result) const; @@ -182,18 +182,19 @@ protected: Mat4& getCachedMatrix(Mat4& result) const; }; -inline void Transform::setIdentity() { +inline Transform& Transform::setIdentity() { _translation = Vec3(0.0f); _rotation = Quat(1.0f, 0.0f, 0.0f, 0.0f); _scale = Vec3(1.0f); _flags = Flags(FLAG_CACHE_INVALID_BITSET); + return *this; } inline const Transform::Vec3& Transform::getTranslation() const { return _translation; } -inline void Transform::setTranslation(const Vec3& translation) { +inline Transform& Transform::setTranslation(const Vec3& translation) { invalidCache(); if (translation == Vec3()) { unflagTranslation(); @@ -201,20 +202,22 @@ inline void Transform::setTranslation(const Vec3& translation) { flagTranslation(); } _translation = translation; + return *this; } -inline void Transform::preTranslate(const Vec3& translation) { +inline Transform& Transform::preTranslate(const Vec3& translation) { if (translation == Vec3()) { - return; + return *this; } invalidCache(); flagTranslation(); _translation += translation; + return *this; } -inline void Transform::postTranslate(const Vec3& translation) { +inline Transform& Transform::postTranslate(const Vec3& translation) { if (translation == Vec3()) { - return; + return *this; } invalidCache(); flagTranslation(); @@ -229,13 +232,14 @@ inline void Transform::postTranslate(const Vec3& translation) { } else { _translation += scaledT; } + return *this; } inline const Transform::Quat& Transform::getRotation() const { return _rotation; } -inline void Transform::setRotation(const Quat& rotation) { +inline Transform& Transform::setRotation(const Quat& rotation) { invalidCache(); if (rotation == Quat()) { unflagRotation(); @@ -243,11 +247,12 @@ inline void Transform::setRotation(const Quat& rotation) { flagRotation(); } _rotation = rotation; + return *this; } -inline void Transform::preRotate(const Quat& rotation) { +inline Transform& Transform::preRotate(const Quat& rotation) { if (rotation == Quat()) { - return; + return *this; } invalidCache(); if (isRotating()) { @@ -258,11 +263,12 @@ inline void Transform::preRotate(const Quat& rotation) { flagRotation(); _translation = glm::rotate(rotation, _translation); + return *this; } -inline void Transform::postRotate(const Quat& rotation) { +inline Transform& Transform::postRotate(const Quat& rotation) { if (rotation == Quat()) { - return; + return *this; } invalidCache(); @@ -289,15 +295,16 @@ inline void Transform::postRotate(const Quat& rotation) { } } flagRotation(); + return *this; } inline const Transform::Vec3& Transform::getScale() const { return _scale; } -inline void Transform::setScale(float scale) { +inline Transform& Transform::setScale(float scale) { if (!isValidScale(scale)) { - return; + return *this; } invalidCache(); flagUniform(); @@ -308,46 +315,49 @@ inline void Transform::setScale(float scale) { flagScaling(); } _scale = Vec3(scale); + return *this; } -inline void Transform::setScale(const Vec3& scale) { +inline Transform& Transform::setScale(const Vec3& scale) { if (!isValidScale(scale)) { - return; + return *this; } + if ((scale.x == scale.y) && (scale.x == scale.z)) { - setScale(scale.x); - } else { - invalidCache(); - flagScaling(); - flagNonUniform(); - _scale = scale; - } + return setScale(scale.x); + } + + invalidCache(); + flagScaling(); + flagNonUniform(); + _scale = scale; + return *this; } -inline void Transform::preScale(float scale) { - setScale(getScale() * scale); +inline Transform& Transform::preScale(float scale) { + return setScale(getScale() * scale); } -inline void Transform::preScale(const Vec3& scale) { - setScale(getScale() * scale); +inline Transform& Transform::preScale(const Vec3& scale) { + return setScale(getScale() * scale); } -inline void Transform::postScale(float scale) { +inline Transform& Transform::postScale(float scale) { if (!isValidScale(scale) || scale == 1.0f) { - return; + return *this; } - if (isScaling()) { - // if already scaling, just invalid cache and apply uniform scale - invalidCache(); - _scale *= scale; - } else { - setScale(scale); + if (!isScaling()) { + return setScale(scale); } + // if already scaling, just invalid cache and apply uniform scale + invalidCache(); + _scale *= scale; + return *this; } -inline void Transform::postScale(const Vec3& scale) { +inline Transform& Transform::postScale(const Vec3& scale) { if (!isValidScale(scale)) { - return; + return *this; } invalidCache(); if (isScaling()) { @@ -356,6 +366,7 @@ inline void Transform::postScale(const Vec3& scale) { _scale = scale; } flagScaling(); + return *this; } inline Transform::Mat4& Transform::getMatrix(Transform::Mat4& result) const { @@ -405,20 +416,22 @@ inline Transform::Mat4& Transform::getRotationScaleMatrixInverse(Mat4& result) c return result; } -inline void Transform::evalFromRawMatrix(const Mat4& matrix) { +inline Transform& Transform::evalFromRawMatrix(const Mat4& matrix) { // for now works only in the case of TRS transformation if ((matrix[0][3] == 0.0f) && (matrix[1][3] == 0.0f) && (matrix[2][3] == 0.0f) && (matrix[3][3] == 1.0f)) { setTranslation(Vec3(matrix[3])); evalFromRawMatrix(Mat3(matrix)); } + return *this; } -inline void Transform::evalFromRawMatrix(const Mat3& rotationScaleMatrix) { +inline Transform& Transform::evalFromRawMatrix(const Mat3& rotationScaleMatrix) { Quat rotation; Vec3 scale; evalRotationScale(rotation, scale, rotationScaleMatrix); setRotation(rotation); setScale(scale); + return *this; } inline Transform& Transform::evalInverse(Transform& inverse) const { From 005620856526bcf0f5a7a552a8f23795e7a0f8fc Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 17:04:44 -0700 Subject: [PATCH 565/582] Another whack at GL headers --- interface/InterfaceConfig.h.in | 3 +-- interface/src/ui/ApplicationCompositor.h | 2 +- interface/src/ui/ApplicationOverlay.h | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/interface/InterfaceConfig.h.in b/interface/InterfaceConfig.h.in index b2b1881d67..c44fc6b8a8 100644 --- a/interface/InterfaceConfig.h.in +++ b/interface/InterfaceConfig.h.in @@ -12,7 +12,6 @@ #ifndef interface__InterfaceConfig__ #define interface__InterfaceConfig__ -#define GL_GLEXT_PROTOTYPES 1 -@GL_HEADERS@ +#include #endif diff --git a/interface/src/ui/ApplicationCompositor.h b/interface/src/ui/ApplicationCompositor.h index 5df145afa2..8ae6f0930e 100644 --- a/interface/src/ui/ApplicationCompositor.h +++ b/interface/src/ui/ApplicationCompositor.h @@ -62,7 +62,7 @@ public: glm::vec2 screenToOverlay(const glm::vec2 & screenPos) const; glm::vec2 overlayToScreen(const glm::vec2 & overlayPos) const; void computeHmdPickRay(glm::vec2 cursorPos, glm::vec3& origin, glm::vec3& direction) const; - GLuint getOverlayTexture() const; + uint32_t getOverlayTexture() const; static glm::vec2 directionToSpherical(const glm::vec3 & direction); static glm::vec3 sphericalToDirection(const glm::vec2 & sphericalPos); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index 6aa5d2a9e8..92485fba82 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -40,7 +40,7 @@ private: float _alpha{ 1.0f }; float _trailingAudioLoudness{ 0.0f }; - GLuint _uiTexture{ 0 }; + uint32_t _uiTexture{ 0 }; int _domainStatusBorder; int _magnifierBorder; From 35f7307f30c72c7c9249d017c6dc13828ec35176 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 22:15:50 -0700 Subject: [PATCH 566/582] More header cleanup --- interface/InterfaceConfig.h.in | 2 - interface/src/Application.cpp | 2 - interface/src/Menu.cpp | 3 - interface/src/Util.cpp | 1 - interface/src/avatar/Avatar.h | 1 - interface/src/avatar/Hand.h | 2 - interface/src/avatar/Head.h | 1 - interface/src/devices/OculusManager.cpp | 17 --- interface/src/devices/TV3DManager.cpp | 15 -- interface/src/ui/LogDialog.cpp | 1 - interface/src/ui/LogDialog.h | 2 - interface/src/ui/OctreeStatsDialog.cpp | 4 +- interface/src/ui/Stats.cpp | 1 - interface/src/ui/overlays/Base3DOverlay.cpp | 3 - .../src/ui/overlays/BillboardOverlay.cpp | 6 + interface/src/ui/overlays/Circle3DOverlay.h | 2 - interface/src/ui/overlays/Grid3DOverlay.cpp | 9 +- interface/src/ui/overlays/Grid3DOverlay.h | 7 - interface/src/ui/overlays/ImageOverlay.h | 2 - interface/src/ui/overlays/Overlay.h | 2 - interface/src/ui/overlays/Overlay2D.h | 3 - interface/src/ui/overlays/Planar3DOverlay.h | 3 - interface/src/ui/overlays/Text3DOverlay.h | 3 - interface/src/ui/overlays/TextOverlay.h | 3 - interface/src/ui/overlays/Volume3DOverlay.h | 3 - libraries/gpu/src/gpu/GLBackendInput.cpp | 2 +- libraries/gpu/src/gpu/GPUConfig.h | 1 - .../src/AmbientOcclusionEffect.cpp | 128 +++++++++++------- .../render-utils/src/AmbientOcclusionEffect.h | 6 +- libraries/render-utils/src/ProgramObject.cpp | 56 -------- libraries/render-utils/src/ProgramObject.h | 42 ------ 31 files changed, 91 insertions(+), 242 deletions(-) delete mode 100644 libraries/render-utils/src/ProgramObject.cpp delete mode 100644 libraries/render-utils/src/ProgramObject.h diff --git a/interface/InterfaceConfig.h.in b/interface/InterfaceConfig.h.in index c44fc6b8a8..fba2b7e4d6 100644 --- a/interface/InterfaceConfig.h.in +++ b/interface/InterfaceConfig.h.in @@ -12,6 +12,4 @@ #ifndef interface__InterfaceConfig__ #define interface__InterfaceConfig__ -#include - #endif diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9cecae2854..404193aa3a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3688,9 +3688,7 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // render rear mirror view - glPushMatrix(); displaySide(renderArgs, _mirrorCamera, true, billboard); - glPopMatrix(); // reset Viewport and projection matrix renderArgs->_viewport = glm::ivec4(viewport[0], viewport[1], viewport[2], viewport[3]); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7213d4eb79..75ae88e296 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -9,9 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include #include diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 5d625ba3a3..cb3865d336 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -24,7 +24,6 @@ #include #include -#include "InterfaceConfig.h" #include "world.h" #include "Application.h" #include "InterfaceLogging.h" diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index b67caa1641..a694a82ac7 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -24,7 +24,6 @@ #include "Hand.h" #include "Head.h" -#include "InterfaceConfig.h" #include "SkeletonModel.h" #include "world.h" diff --git a/interface/src/avatar/Hand.h b/interface/src/avatar/Hand.h index a4c0265545..ddc9d13489 100644 --- a/interface/src/avatar/Hand.h +++ b/interface/src/avatar/Hand.h @@ -11,8 +11,6 @@ #ifndef hifi_Hand_h #define hifi_Hand_h -#include "InterfaceConfig.h" - #include #include diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index 2baa16f90c..d7a8462693 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -19,7 +19,6 @@ #include #include "FaceModel.h" -#include "InterfaceConfig.h" #include "world.h" diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index fd40ca592d..9395584a66 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -648,12 +648,6 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFBO)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glm::quat orientation; glm::vec3 trackerPosition; auto deviceSize = qApp->getDeviceSize(); @@ -697,12 +691,6 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const configureCamera(*_camera); _camera->update(1.0f / Application::getInstance()->getFps()); - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(glm::value_ptr(_camera->getProjection())); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - ovrRecti & vp = _eyeViewports[eye]; vp.Size.h = _recommendedTexSize.h * _offscreenRenderScale; vp.Size.w = _recommendedTexSize.w * _offscreenRenderScale; @@ -715,15 +703,10 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const }); _activeEye = ovrEye_Count; - glPopMatrix(); - gpu::FramebufferPointer finalFbo; finalFbo = DependencyManager::get()->getPrimaryFramebuffer(); glBindFramebuffer(GL_FRAMEBUFFER, 0); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - // restore our normal viewport glViewport(0, 0, deviceSize.width(), deviceSize.height()); diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index 24cf529a33..fefaf060bd 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "InterfaceConfig.h" - #include #include @@ -74,10 +72,6 @@ void TV3DManager::configureCamera(Camera& whichCamera, int screenWidth, int scre setFrustum(whichCamera); glViewport (0, 0, _screenWidth, _screenHeight); // sets drawing viewport - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); } void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { @@ -105,7 +99,6 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { eyeCamera.setPosition(whichCamera.getPosition()); glEnable(GL_SCISSOR_TEST); - glPushMatrix(); forEachEye([&](eyeFrustum& eye){ _activeEye = &eye; glViewport(portalX, portalY, portalW, portalH); @@ -115,14 +108,7 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { glm::mat4 projection = glm::frustum(eye.left, eye.right, eye.bottom, eye.top, nearZ, farZ); projection = glm::translate(projection, vec3(eye.modelTranslation, 0, 0)); eyeCamera.setProjection(projection); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); // reset projection matrix - glLoadMatrixf(glm::value_ptr(projection)); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); renderArgs->_renderSide = RenderArgs::MONO; - qApp->displaySide(renderArgs, eyeCamera, false); qApp->getApplicationCompositor().displayOverlayTexture(renderArgs); _activeEye = NULL; @@ -130,7 +116,6 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { // render right side view portalX = deviceSize.width() / 2; }); - glPopMatrix(); glDisable(GL_SCISSOR_TEST); // FIXME - glow effect is removed, 3D TV mode broken until we get display plugins working diff --git a/interface/src/ui/LogDialog.cpp b/interface/src/ui/LogDialog.cpp index d7d1eef74a..0d2d0d11f6 100644 --- a/interface/src/ui/LogDialog.cpp +++ b/interface/src/ui/LogDialog.cpp @@ -18,7 +18,6 @@ #include #include -#include #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop diff --git a/interface/src/ui/LogDialog.h b/interface/src/ui/LogDialog.h index 914e1b4949..999a8394cc 100644 --- a/interface/src/ui/LogDialog.h +++ b/interface/src/ui/LogDialog.h @@ -12,8 +12,6 @@ #ifndef hifi_LogDialog_h #define hifi_LogDialog_h -#include "InterfaceConfig.h" - #include #include #include diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index fbfc3ea662..89e5899acd 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -94,7 +94,6 @@ void OctreeStatsDialog::moreless(const QString& link) { int OctreeStatsDialog::AddStatItem(const char* caption, unsigned colorRGBA) { - char strBuf[64]; const int STATS_LABEL_WIDTH = 600; _statCount++; // increment our current stat count @@ -115,8 +114,7 @@ int OctreeStatsDialog::AddStatItem(const char* caption, unsigned colorRGBA) { rgb = ((rgb & colorpart1) >> 1) + ((rgb & colorpart2) >> 3); palette.setColor(QPalette::WindowText, QColor::fromRgb(rgb)); label->setPalette(palette); - snprintf(strBuf, sizeof(strBuf), " %s:", caption); - _form->addRow(strBuf, label); + _form->addRow(QString(" %1:").arg(caption), label); label->setFixedWidth(STATS_LABEL_WIDTH); return _statCount; diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 3993c48b36..db140e53e2 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -24,7 +24,6 @@ #include #include "BandwidthRecorder.h" -#include "InterfaceConfig.h" #include "Menu.h" #include "Util.h" #include "SequenceNumberStats.h" diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 06e26e0781..108f092465 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -8,9 +8,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include "Application.h" diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index 90ef5989fc..b2843230f3 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -11,6 +11,12 @@ #include "BillboardOverlay.h" +#include + +#include +#include +#include + #include "Application.h" #include "GeometryUtil.h" diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index 0a2352148a..d83703fcd0 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -12,8 +12,6 @@ #define hifi_Circle3DOverlay_h // include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "Planar3DOverlay.h" class Circle3DOverlay : public Planar3DOverlay { diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index baf7b42ac5..ad64c6091b 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -9,17 +9,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "Grid3DOverlay.h" #include - #include "Application.h" -ProgramObject Grid3DOverlay::_gridProgram; - Grid3DOverlay::Grid3DOverlay() : _minorGridWidth(1.0), _majorGridEvery(5) { @@ -42,7 +36,7 @@ void Grid3DOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; // center the grid around the camera position on the plane - glm::vec3 rotated = glm::inverse(getRotation()) * Application::getInstance()->getCamera()->getPosition(); + glm::vec3 rotated = glm::inverse(getRotation()) * args->_viewFrustum->getPosition(); float spacing = _minorGridWidth; @@ -118,3 +112,4 @@ QScriptValue Grid3DOverlay::getProperty(const QString& property) { Grid3DOverlay* Grid3DOverlay::createClone() const { return new Grid3DOverlay(this); } + diff --git a/interface/src/ui/overlays/Grid3DOverlay.h b/interface/src/ui/overlays/Grid3DOverlay.h index ac0f2834fe..80ec4b84b9 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.h +++ b/interface/src/ui/overlays/Grid3DOverlay.h @@ -12,11 +12,6 @@ #ifndef hifi_Grid3DOverlay_h #define hifi_Grid3DOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include - #include "Planar3DOverlay.h" class Grid3DOverlay : public Planar3DOverlay { @@ -35,8 +30,6 @@ public: private: float _minorGridWidth; int _majorGridEvery; - - static ProgramObject _gridProgram; }; #endif // hifi_Grid3DOverlay_h diff --git a/interface/src/ui/overlays/ImageOverlay.h b/interface/src/ui/overlays/ImageOverlay.h index b7924bdb71..59d4102933 100644 --- a/interface/src/ui/overlays/ImageOverlay.h +++ b/interface/src/ui/overlays/ImageOverlay.h @@ -12,8 +12,6 @@ #define hifi_ImageOverlay_h // include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include #include diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index 375a1c3bb9..1698d71fc3 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -12,8 +12,6 @@ #define hifi_Overlay_h // include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include // for xColor #include diff --git a/interface/src/ui/overlays/Overlay2D.h b/interface/src/ui/overlays/Overlay2D.h index d91a20b070..382105c047 100644 --- a/interface/src/ui/overlays/Overlay2D.h +++ b/interface/src/ui/overlays/Overlay2D.h @@ -11,9 +11,6 @@ #ifndef hifi_Overlay2D_h #define hifi_Overlay2D_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include "Overlay.h" diff --git a/interface/src/ui/overlays/Planar3DOverlay.h b/interface/src/ui/overlays/Planar3DOverlay.h index 9683cb3357..fe8c513efd 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.h +++ b/interface/src/ui/overlays/Planar3DOverlay.h @@ -11,9 +11,6 @@ #ifndef hifi_Planar3DOverlay_h #define hifi_Planar3DOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "Base3DOverlay.h" class Planar3DOverlay : public Base3DOverlay { diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index 93d4106708..666b43d8b1 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -11,9 +11,6 @@ #ifndef hifi_Text3DOverlay_h #define hifi_Text3DOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include "Planar3DOverlay.h" diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index 7ada26f892..b70b95ca3b 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -11,9 +11,6 @@ #ifndef hifi_TextOverlay_h #define hifi_TextOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include diff --git a/interface/src/ui/overlays/Volume3DOverlay.h b/interface/src/ui/overlays/Volume3DOverlay.h index 51f63dc580..ada485a663 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.h +++ b/interface/src/ui/overlays/Volume3DOverlay.h @@ -11,9 +11,6 @@ #ifndef hifi_Volume3DOverlay_h #define hifi_Volume3DOverlay_h -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "Base3DOverlay.h" class Volume3DOverlay : public Base3DOverlay { diff --git a/libraries/gpu/src/gpu/GLBackendInput.cpp b/libraries/gpu/src/gpu/GLBackendInput.cpp index e356dbcb9a..59719bd000 100755 --- a/libraries/gpu/src/gpu/GLBackendInput.cpp +++ b/libraries/gpu/src/gpu/GLBackendInput.cpp @@ -101,7 +101,7 @@ void GLBackend::syncInputStateCache() { //_input._defaultVAO glBindVertexArray(_input._defaultVAO); #else - int i = 0; + size_t i = 0; #if defined(SUPPORT_LEGACY_OPENGL) for (; i < NUM_CLASSIC_ATTRIBS; i++) { _input._attributeActivation[i] = glIsEnabled(attributeSlotToClassicAttribName[i]); diff --git a/libraries/gpu/src/gpu/GPUConfig.h b/libraries/gpu/src/gpu/GPUConfig.h index 0b2d93b18d..1d092dbc6a 100644 --- a/libraries/gpu/src/gpu/GPUConfig.h +++ b/libraries/gpu/src/gpu/GPUConfig.h @@ -25,7 +25,6 @@ #define GPU_TRANSFORM_PROFILE GPU_LEGACY #elif defined(WIN32) -#include #include #include diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index 1b0b5aeebc..ee1af18494 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -9,32 +9,50 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "AmbientOcclusionEffect.h" + +#include +#include + #include - #include - #include #include #include "AbstractViewStateInterface.h" -#include "AmbientOcclusionEffect.h" -#include "ProgramObject.h" #include "RenderUtil.h" #include "TextureCache.h" const int ROTATION_WIDTH = 4; const int ROTATION_HEIGHT = 4; +static QString readFile(const QString& path) { + QFile file(path); + QString result; + if (file.open(QFile::ReadOnly | QFile::Text)) { + QTextStream in(&file); + result = in.readAll(); + } + return result; +} + void AmbientOcclusionEffect::init(AbstractViewStateInterface* viewState) { +#if 0 _viewState = viewState; // we will use this for view state services - - _occlusionProgram = new ProgramObject(); - _occlusionProgram->addShaderFromSourceFile(QGLShader::Vertex, PathUtils::resourcesPath() - + "shaders/ambient_occlusion.vert"); - _occlusionProgram->addShaderFromSourceFile(QGLShader::Fragment, PathUtils::resourcesPath() - + "shaders/ambient_occlusion.frag"); - _occlusionProgram->link(); - + + { + gpu::Shader::Source vertexSource = std::string(readFile(PathUtils::resourcesPath() + + "shaders/ambient_occlusion.vert").toLocal8Bit().data()); + gpu::Shader::Source fragmentSource = std::string(readFile(PathUtils::resourcesPath() + + "shaders/ambient_occlusion.frag").toLocal8Bit().data()); + auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(vertexSource)); + auto fs = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentSource)); + _occlusionProgram = gpu::ShaderPointer(gpu::Shader::createProgram(vs, fs)); + } + foreach(auto uniform, _occlusionProgram->getUniforms()) { + qDebug() << uniform._location; + } + // create the sample kernel: an array of hemispherically distributed offset vectors const int SAMPLE_KERNEL_SIZE = 16; QVector3D sampleKernel[SAMPLE_KERNEL_SIZE]; @@ -48,20 +66,20 @@ void AmbientOcclusionEffect::init(AbstractViewStateInterface* viewState) { sampleKernel[i] = QVector3D(vector.x, vector.y, vector.z); } - _occlusionProgram->bind(); - _occlusionProgram->setUniformValue("depthTexture", 0); - _occlusionProgram->setUniformValue("rotationTexture", 1); - _occlusionProgram->setUniformValueArray("sampleKernel", sampleKernel, SAMPLE_KERNEL_SIZE); - _occlusionProgram->setUniformValue("radius", 0.1f); - _occlusionProgram->release(); - - _nearLocation = _occlusionProgram->uniformLocation("near"); - _farLocation = _occlusionProgram->uniformLocation("far"); - _leftBottomLocation = _occlusionProgram->uniformLocation("leftBottom"); - _rightTopLocation = _occlusionProgram->uniformLocation("rightTop"); - _noiseScaleLocation = _occlusionProgram->uniformLocation("noiseScale"); - _texCoordOffsetLocation = _occlusionProgram->uniformLocation("texCoordOffset"); - _texCoordScaleLocation = _occlusionProgram->uniformLocation("texCoordScale"); + glUseProgram(gpu::GLBackend::getShaderID(_occlusionProgram)); + glUniform1i(_occlusionProgram->getUniforms().findLocation("depthTexture"), 0); + glUniform1i(_occlusionProgram->getUniforms().findLocation("rotationTexture"), 1); + glUniform1f(_occlusionProgram->getUniforms().findLocation("radius"), 0.1f); + //_occlusionProgram->setUniformValueArray("sampleKernel", sampleKernel, SAMPLE_KERNEL_SIZE); + glUseProgram(0); + + _nearLocation = _occlusionProgram->getUniforms().findLocation("near"); + _farLocation = _occlusionProgram->getUniforms().findLocation("far"); + _leftBottomLocation = _occlusionProgram->getUniforms().findLocation("leftBottom"); + _rightTopLocation = _occlusionProgram->getUniforms().findLocation("rightTop"); + _noiseScaleLocation = _occlusionProgram->getUniforms().findLocation("noiseScale"); + _texCoordOffsetLocation = _occlusionProgram->getUniforms().findLocation("texCoordOffset"); + _texCoordScaleLocation = _occlusionProgram->getUniforms().findLocation("texCoordScale"); // generate the random rotation texture glGenTextures(1, &_rotationTextureID); @@ -79,20 +97,29 @@ void AmbientOcclusionEffect::init(AbstractViewStateInterface* viewState) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); - - _blurProgram = new ProgramObject(); - _blurProgram->addShaderFromSourceFile(QGLShader::Vertex, PathUtils::resourcesPath() + "shaders/ambient_occlusion.vert"); - _blurProgram->addShaderFromSourceFile(QGLShader::Fragment, PathUtils::resourcesPath() + "shaders/occlusion_blur.frag"); - _blurProgram->link(); - - _blurProgram->bind(); - _blurProgram->setUniformValue("originalTexture", 0); - _blurProgram->release(); - - _blurScaleLocation = _blurProgram->uniformLocation("blurScale"); + + { + gpu::Shader::Source vertexSource = std::string(readFile(PathUtils::resourcesPath() + + "shaders/ambient_occlusion.vert").toLocal8Bit().data()); + gpu::Shader::Source fragmentSource = std::string(readFile(PathUtils::resourcesPath() + + "shaders/occlusion_blur.frag").toLocal8Bit().data()); + auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(vertexSource)); + auto fs = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentSource)); + _blurProgram = gpu::ShaderPointer(gpu::Shader::createProgram(vs, fs)); + } + + glUseProgram(gpu::GLBackend::getShaderID(_blurProgram)); + foreach(auto uniform, _blurProgram->getUniforms()) { + qDebug() << uniform._location; + } + glUniform1f(_blurProgram->getUniforms().findLocation("originalTexture"), 0); + glUseProgram(0); + _blurScaleLocation = _blurProgram->getUniforms().findLocation("blurScale"); +#endif } void AmbientOcclusionEffect::render() { +#if 0 glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); @@ -119,19 +146,19 @@ void AmbientOcclusionEffect::render() { float sMin = viewport[VIEWPORT_X_INDEX] / (float)framebufferSize.width(); float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)framebufferSize.width(); - _occlusionProgram->bind(); - _occlusionProgram->setUniformValue(_nearLocation, nearVal); - _occlusionProgram->setUniformValue(_farLocation, farVal); - _occlusionProgram->setUniformValue(_leftBottomLocation, left, bottom); - _occlusionProgram->setUniformValue(_rightTopLocation, right, top); - _occlusionProgram->setUniformValue(_noiseScaleLocation, viewport[VIEWPORT_WIDTH_INDEX] / (float)ROTATION_WIDTH, + glUseProgram(gpu::GLBackend::getShaderID(_occlusionProgram)); + glUniform1f(_nearLocation, nearVal); + glUniform1f(_farLocation, farVal); + glUniform2f(_leftBottomLocation, left, bottom); + glUniform2f(_rightTopLocation, right, top); + glUniform2f(_noiseScaleLocation, viewport[VIEWPORT_WIDTH_INDEX] / (float)ROTATION_WIDTH, framebufferSize.height() / (float)ROTATION_HEIGHT); - _occlusionProgram->setUniformValue(_texCoordOffsetLocation, sMin, 0.0f); - _occlusionProgram->setUniformValue(_texCoordScaleLocation, sWidth, 1.0f); + glUniform2f(_texCoordOffsetLocation, sMin, 0.0f); + glUniform2f(_texCoordScaleLocation, sWidth, 1.0f); renderFullscreenQuad(); - _occlusionProgram->release(); + glUseProgram(0); glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -149,16 +176,17 @@ void AmbientOcclusionEffect::render() { auto freeFramebufferTexture = nullptr; // freeFramebuffer->getRenderBuffer(0); // FIXME glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(freeFramebufferTexture)); - _blurProgram->bind(); - _blurProgram->setUniformValue(_blurScaleLocation, 1.0f / framebufferSize.width(), 1.0f / framebufferSize.height()); + glUseProgram(gpu::GLBackend::getShaderID(_occlusionProgram)); + glUniform2f(_blurScaleLocation, 1.0f / framebufferSize.width(), 1.0f / framebufferSize.height()); renderFullscreenQuad(sMin, sMin + sWidth); - _blurProgram->release(); - + glUseProgram(0); + glBindTexture(GL_TEXTURE_2D, 0); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); +#endif } diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.h b/libraries/render-utils/src/AmbientOcclusionEffect.h index a397a6e3d0..e8d49cd3a3 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.h +++ b/libraries/render-utils/src/AmbientOcclusionEffect.h @@ -14,9 +14,9 @@ #include #include +#include class AbstractViewStateInterface; -class ProgramObject; /// A screen space ambient occlusion effect. See John Chapman's tutorial at /// http://john-chapman-graphics.blogspot.co.uk/2013/01/ssao-tutorial.html for reference. @@ -32,7 +32,7 @@ private: AmbientOcclusionEffect() {} virtual ~AmbientOcclusionEffect() {} - ProgramObject* _occlusionProgram; + gpu::ShaderPointer _occlusionProgram; int _nearLocation; int _farLocation; int _leftBottomLocation; @@ -41,7 +41,7 @@ private: int _texCoordOffsetLocation; int _texCoordScaleLocation; - ProgramObject* _blurProgram; + gpu::ShaderPointer _blurProgram; int _blurScaleLocation; uint32_t _rotationTextureID; diff --git a/libraries/render-utils/src/ProgramObject.cpp b/libraries/render-utils/src/ProgramObject.cpp deleted file mode 100644 index 56fd48bff7..0000000000 --- a/libraries/render-utils/src/ProgramObject.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// -// ProgramObject.cpp -// interface/src/renderer -// -// Created by Andrzej Kapolka on 5/7/13. -// Copyright 2013 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 - -#include "ProgramObject.h" - -ProgramObject::ProgramObject(QObject* parent) : QGLShaderProgram(parent) { -} - -void ProgramObject::setUniform(int location, const glm::vec2& value) { - setUniformValue(location, value.x, value.y); -} - -void ProgramObject::setUniform(const char* name, const glm::vec2& value) { - setUniformValue(name, value.x, value.y); -} - -void ProgramObject::setUniform(int location, const glm::vec3& value) { - setUniformValue(location, value.x, value.y, value.z); -} - -void ProgramObject::setUniform(const char* name, const glm::vec3& value) { - setUniformValue(name, value.x, value.y, value.z); -} - -void ProgramObject::setUniform(int location, const glm::vec4& value) { - setUniformValue(location, value.x, value.y, value.z, value.w); -} - -void ProgramObject::setUniform(const char* name, const glm::vec4& value) { - setUniformValue(name, value.x, value.y, value.z, value.w); -} - -void ProgramObject::setUniformArray(const char* name, const glm::vec3* values, int count) { - GLfloat* floatVal = new GLfloat[count*3]; - int index = 0; - for (int i = 0; i < count; i++) { - assert(index < count*3); - const float* valPtr = glm::value_ptr(values[i]); - floatVal[index++] = valPtr[0]; - floatVal[index++] = valPtr[1]; - floatVal[index++] = valPtr[2]; - } - - setUniformValueArray(name, floatVal, count, 3); - delete[] floatVal; -} diff --git a/libraries/render-utils/src/ProgramObject.h b/libraries/render-utils/src/ProgramObject.h deleted file mode 100644 index 2b7dad71a5..0000000000 --- a/libraries/render-utils/src/ProgramObject.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// ProgramObject.h -// interface/src/renderer -// -// Created by Andrzej Kapolka on 5/7/13. -// Copyright 2013 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_ProgramObject_h -#define hifi_ProgramObject_h - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdouble-promotion" -#endif - -#include - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#include - -class ProgramObject : public QGLShaderProgram { -public: - - ProgramObject(QObject* parent = 0); - - void setUniform(int location, const glm::vec2& value); - void setUniform(const char* name, const glm::vec2& value); - void setUniform(int location, const glm::vec3& value); - void setUniform(const char* name, const glm::vec3& value); - void setUniform(int location, const glm::vec4& value); - void setUniform(const char* name, const glm::vec4& value); - void setUniformArray(const char* name, const glm::vec3* values, int count); -}; - -#endif // hifi_ProgramObject_h From 5b494c23fd4a59217eea123cb976265ea62bfde4 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 22:38:26 -0700 Subject: [PATCH 567/582] More header cleanup --- interface/src/Application.cpp | 3 --- interface/src/ui/ApplicationCompositor.cpp | 2 -- interface/src/ui/ApplicationOverlay.cpp | 2 -- interface/src/ui/AudioStatsDialog.cpp | 5 ++--- interface/src/ui/LogDialog.cpp | 2 -- interface/src/ui/overlays/Base3DOverlay.cpp | 8 ++++++-- interface/src/ui/overlays/Cube3DOverlay.cpp | 9 +++++---- interface/src/ui/overlays/Grid3DOverlay.cpp | 6 +++++- interface/src/ui/overlays/ImageOverlay.cpp | 7 ++----- interface/src/ui/overlays/Line3DOverlay.cpp | 6 +----- .../src/ui/overlays/LocalModelsOverlay.cpp | 11 +++++------ interface/src/ui/overlays/ModelOverlay.cpp | 2 +- interface/src/ui/overlays/Overlays.cpp | 3 ++- .../src/ui/overlays/Rectangle3DOverlay.cpp | 3 --- interface/src/ui/overlays/Sphere3DOverlay.cpp | 10 ++++------ interface/src/ui/overlays/Text3DOverlay.cpp | 3 --- interface/src/ui/overlays/TextOverlay.cpp | 17 +++++++++-------- 17 files changed, 42 insertions(+), 57 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 404193aa3a..0ce7698afe 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -21,9 +21,6 @@ #include #include -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include #include #include diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index cd28ca0732..dad626ae44 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "InterfaceConfig.h" - #include "ApplicationCompositor.h" #include diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 1ab1210881..ed2c68aba5 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "InterfaceConfig.h" - #include #include diff --git a/interface/src/ui/AudioStatsDialog.cpp b/interface/src/ui/AudioStatsDialog.cpp index 1d6d84a15b..116cc60b5e 100644 --- a/interface/src/ui/AudioStatsDialog.cpp +++ b/interface/src/ui/AudioStatsDialog.cpp @@ -9,9 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include "AudioStatsDialog.h" -#include "InterfaceConfig.h" +#include #include #include @@ -22,7 +22,6 @@ #include -#include "AudioStatsDialog.h" const unsigned COLOR0 = 0x33cc99ff; const unsigned COLOR1 = 0xffef40c0; diff --git a/interface/src/ui/LogDialog.cpp b/interface/src/ui/LogDialog.cpp index 0d2d0d11f6..c9a303461f 100644 --- a/interface/src/ui/LogDialog.cpp +++ b/interface/src/ui/LogDialog.cpp @@ -9,8 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "InterfaceConfig.h" - #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdouble-promotion" diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 108f092465..e1252836d7 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -8,10 +8,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // + +#include "Base3DOverlay.h" + +#include + +#include #include -#include "Application.h" -#include "Base3DOverlay.h" const float DEFAULT_LINE_WIDTH = 1.0f; const bool DEFAULT_IS_SOLID = false; diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 7f6fd5f971..961d7f765b 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -9,14 +9,15 @@ // // include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" +#include "Cube3DOverlay.h" + +#include #include #include #include - -#include "Application.h" -#include "Cube3DOverlay.h" +#include +#include Cube3DOverlay::Cube3DOverlay(const Cube3DOverlay* cube3DOverlay) : Volume3DOverlay(cube3DOverlay) diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index ad64c6091b..956eae35ff 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -11,8 +11,12 @@ #include "Grid3DOverlay.h" +#include + +#include +#include #include -#include "Application.h" +#include Grid3DOverlay::Grid3DOverlay() : _minorGridWidth(1.0), diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 73a3f7e39c..cad9010531 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -12,13 +12,10 @@ #include #include +#include +#include #include -#include "qapplication.h" - -#include "gpu/Context.h" -#include "gpu/StandardShaderLib.h" - ImageOverlay::ImageOverlay() : _imageURL(), _renderImage(false), diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 4e2763d260..d026e5f56e 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -8,15 +8,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" +#include "Line3DOverlay.h" #include #include -#include "Line3DOverlay.h" - - Line3DOverlay::Line3DOverlay() : _geometryCacheID(DependencyManager::get()->allocateID()) { diff --git a/interface/src/ui/overlays/LocalModelsOverlay.cpp b/interface/src/ui/overlays/LocalModelsOverlay.cpp index 06b27f8f22..9a2733c739 100644 --- a/interface/src/ui/overlays/LocalModelsOverlay.cpp +++ b/interface/src/ui/overlays/LocalModelsOverlay.cpp @@ -9,10 +9,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "Application.h" - #include "LocalModelsOverlay.h" +#include +#include + LocalModelsOverlay::LocalModelsOverlay(EntityTreeRenderer* entityTreeRenderer) : Volume3DOverlay(), _entityTreeRenderer(entityTreeRenderer) { @@ -33,13 +34,11 @@ void LocalModelsOverlay::render(RenderArgs* args) { float glowLevel = getGlowLevel(); // FIXME, glowing removed for now auto batch = args ->_batch; - Application* app = Application::getInstance(); - glm::vec3 oldTranslation = app->getViewMatrixTranslation(); Transform transform = Transform(); - transform.setTranslation(oldTranslation + getPosition()); + transform.setTranslation(args->_viewFrustum->getPosition() + getPosition()); batch->setViewTransform(transform); _entityTreeRenderer->render(args); - transform.setTranslation(oldTranslation); + transform.setTranslation(args->_viewFrustum->getPosition()); batch->setViewTransform(transform); } } diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 5a399aef76..ed15e57d43 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -11,7 +11,7 @@ #include "ModelOverlay.h" -#include +#include "Application.h" ModelOverlay::ModelOverlay() : _model(), diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 63b87a30ae..6f28cf8352 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -14,10 +14,11 @@ #include -#include #include #include +#include +#include "Application.h" #include "BillboardOverlay.h" #include "Circle3DOverlay.h" #include "Cube3DOverlay.h" diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 0ab9174da8..1d5183b833 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -8,9 +8,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "Rectangle3DOverlay.h" #include diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 8d751c73c5..307b60b2ce 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -8,14 +8,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - -#include - #include "Sphere3DOverlay.h" -#include "Application.h" +#include +#include +#include +#include Sphere3DOverlay::Sphere3DOverlay(const Sphere3DOverlay* Sphere3DOverlay) : Volume3DOverlay(Sphere3DOverlay) diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 17dc8d03a8..737b2d0bc5 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -8,9 +8,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" - #include "Text3DOverlay.h" #include diff --git a/interface/src/ui/overlays/TextOverlay.cpp b/interface/src/ui/overlays/TextOverlay.cpp index 597a630e3c..467014427d 100644 --- a/interface/src/ui/overlays/TextOverlay.cpp +++ b/interface/src/ui/overlays/TextOverlay.cpp @@ -8,21 +8,22 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// include this before QGLWidget, which includes an earlier version of OpenGL -#include "InterfaceConfig.h" -#include "Application.h" #include "TextOverlay.h" -#include "OffscreenUi.h" -#include "text/FontFamilies.h" -#include + +#include + #include #include -#include #include +#include +#include #include #include +#include #include -#include + +#include "Application.h" +#include "text/FontFamilies.h" #define TEXT_OVERLAY_PROPERTY(type, name, initialValue) \ Q_PROPERTY(type name READ name WRITE set##name NOTIFY name##Changed) \ From 0da8b27fcf67006d8be1d188d0acc6a5e500067f Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 22:53:43 -0700 Subject: [PATCH 568/582] Removing unused files --- interface/CMakeLists.txt | 15 -- interface/InterfaceConfig.h.in | 15 -- interface/src/ui/FlowLayout.cpp | 222 ------------------------ interface/src/ui/FlowLayout.h | 78 --------- interface/src/ui/ScriptEditorWindow.cpp | 1 - 5 files changed, 331 deletions(-) delete mode 100644 interface/InterfaceConfig.h.in delete mode 100644 interface/src/ui/FlowLayout.cpp delete mode 100644 interface/src/ui/FlowLayout.h diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 017a9d3c5f..beeaab8567 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -22,23 +22,8 @@ else () set(BUILD_SEQ "dev") endif () -if (APPLE) - set(GL_HEADERS "#include ") -elseif (UNIX) - # include the right GL headers for UNIX - set(GL_HEADERS "#include \n#include ") -elseif (WIN32) - add_definitions(-D_USE_MATH_DEFINES) # apparently needed to get M_PI and other defines from cmath/math.h - add_definitions(-DWINDOWS_LEAN_AND_MEAN) # needed to make sure windows doesn't go to crazy with its defines - - set(GL_HEADERS "#include \n#include \n#include ") -endif () - -# create the InterfaceConfig.h file based on GL_HEADERS above -configure_file(InterfaceConfig.h.in "${PROJECT_BINARY_DIR}/includes/InterfaceConfig.h") configure_file(InterfaceVersion.h.in "${PROJECT_BINARY_DIR}/includes/InterfaceVersion.h") - macro(GroupSources curdir) file(GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*) foreach(child ${children}) diff --git a/interface/InterfaceConfig.h.in b/interface/InterfaceConfig.h.in deleted file mode 100644 index fba2b7e4d6..0000000000 --- a/interface/InterfaceConfig.h.in +++ /dev/null @@ -1,15 +0,0 @@ -// -// InterfaceConfig.h -// interface/src -// -// Created by Stephen Birarda on 2/8/13. -// Copyright 2013 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 interface__InterfaceConfig__ -#define interface__InterfaceConfig__ - -#endif diff --git a/interface/src/ui/FlowLayout.cpp b/interface/src/ui/FlowLayout.cpp deleted file mode 100644 index ed68204d90..0000000000 --- a/interface/src/ui/FlowLayout.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdouble-promotion" -#endif - -#include - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif - -#include "FlowLayout.h" -//! [1] -FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) - : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing) -{ - setContentsMargins(margin, margin, margin, margin); -} - -FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) - : m_hSpace(hSpacing), m_vSpace(vSpacing) -{ - setContentsMargins(margin, margin, margin, margin); -} -//! [1] - -//! [2] -FlowLayout::~FlowLayout() -{ - QLayoutItem *item; - while ((item = takeAt(0))) - delete item; -} -//! [2] - -//! [3] -void FlowLayout::addItem(QLayoutItem *item) -{ - itemList.append(item); -} -//! [3] - -//! [4] -int FlowLayout::horizontalSpacing() const -{ - if (m_hSpace >= 0) { - return m_hSpace; - } else { - return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); - } -} - -int FlowLayout::verticalSpacing() const -{ - if (m_vSpace >= 0) { - return m_vSpace; - } else { - return smartSpacing(QStyle::PM_LayoutVerticalSpacing); - } -} -//! [4] - -//! [5] -int FlowLayout::count() const -{ - return itemList.size(); -} - -QLayoutItem *FlowLayout::itemAt(int index) const -{ - return itemList.value(index); -} - -QLayoutItem *FlowLayout::takeAt(int index) -{ - if (index >= 0 && index < itemList.size()) - return itemList.takeAt(index); - else - return 0; -} -//! [5] - -//! [6] -Qt::Orientations FlowLayout::expandingDirections() const -{ - return 0; -} -//! [6] - -//! [7] -bool FlowLayout::hasHeightForWidth() const -{ - return true; -} - -int FlowLayout::heightForWidth(int width) const -{ - int height = doLayout(QRect(0, 0, width, 0), true); - return height; -} -//! [7] - -//! [8] -void FlowLayout::setGeometry(const QRect &rect) -{ - QLayout::setGeometry(rect); - doLayout(rect, false); -} - -QSize FlowLayout::sizeHint() const -{ - return minimumSize(); -} - -QSize FlowLayout::minimumSize() const -{ - QSize size; - QLayoutItem *item; - foreach (item, itemList) - size = size.expandedTo(item->minimumSize()); - - size += QSize(2*margin(), 2*margin()); - return size; -} -//! [8] - -//! [9] -int FlowLayout::doLayout(const QRect &rect, bool testOnly) const -{ - int left, top, right, bottom; - getContentsMargins(&left, &top, &right, &bottom); - QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom); - int x = effectiveRect.x(); - int y = effectiveRect.y(); - int lineHeight = 0; -//! [9] - -//! [10] - QLayoutItem *item; - foreach (item, itemList) { - QWidget *wid = item->widget(); - int spaceX = horizontalSpacing(); - if (spaceX == -1) - spaceX = wid->style()->layoutSpacing( - QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); - int spaceY = verticalSpacing(); - if (spaceY == -1) - spaceY = wid->style()->layoutSpacing( - QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); -//! [10] -//! [11] - int nextX = x + item->sizeHint().width() + spaceX; - if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) { - x = effectiveRect.x(); - y = y + lineHeight + spaceY; - nextX = x + item->sizeHint().width() + spaceX; - lineHeight = 0; - } - - if (!testOnly) - item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); - - x = nextX; - lineHeight = qMax(lineHeight, item->sizeHint().height()); - } - return y + lineHeight - rect.y() + bottom; -} -//! [11] -//! [12] -int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const -{ - QObject *parent = this->parent(); - if (!parent) { - return -1; - } else if (parent->isWidgetType()) { - QWidget *pw = static_cast(parent); - return pw->style()->pixelMetric(pm, 0, pw); - } else { - return static_cast(parent)->spacing(); - } -} -//! [12] diff --git a/interface/src/ui/FlowLayout.h b/interface/src/ui/FlowLayout.h deleted file mode 100644 index f7107be6b2..0000000000 --- a/interface/src/ui/FlowLayout.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef FLOWLAYOUT_H -#define FLOWLAYOUT_H - -#include -#include -#include -//! [0] -class FlowLayout : public QLayout -{ -public: - explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1); - explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1); - ~FlowLayout(); - - void addItem(QLayoutItem *item); - int horizontalSpacing() const; - int verticalSpacing() const; - Qt::Orientations expandingDirections() const; - bool hasHeightForWidth() const; - int heightForWidth(int) const; - int count() const; - QLayoutItem *itemAt(int index) const; - QSize minimumSize() const; - void setGeometry(const QRect &rect); - QSize sizeHint() const; - QLayoutItem *takeAt(int index); - -private: - int doLayout(const QRect &rect, bool testOnly) const; - int smartSpacing(QStyle::PixelMetric pm) const; - - QList itemList; - int m_hSpace; - int m_vSpace; -}; -//! [0] - -#endif // FLOWLAYOUT_H diff --git a/interface/src/ui/ScriptEditorWindow.cpp b/interface/src/ui/ScriptEditorWindow.cpp index 424b649b02..41d172cf48 100644 --- a/interface/src/ui/ScriptEditorWindow.cpp +++ b/interface/src/ui/ScriptEditorWindow.cpp @@ -28,7 +28,6 @@ #include #include "Application.h" -#include "FlowLayout.h" #include "JSConsole.h" #include "PathUtils.h" From f13152b2b4d5142fc2572d7de0cb298dc83bbe6c Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sat, 18 Jul 2015 23:04:16 -0700 Subject: [PATCH 569/582] Fixing reference to PI/2 --- interface/src/devices/SixenseManager.cpp | 5 +++-- interface/src/ui/ApplicationCompositor.cpp | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index c82027cb38..19763ee3bf 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -13,6 +13,7 @@ #include #include +#include #include "Application.h" #include "SixenseManager.h" @@ -527,8 +528,8 @@ void SixenseManager::emulateMouse(PalmData* palm, int index) { glm::vec3 direction = glm::inverse(avatar->getOrientation()) * palm->getFingerDirection(); // Get the angles, scaled between (-0.5,0.5) - float xAngle = (atan2(direction.z, direction.x) + M_PI_2); - float yAngle = 0.5f - ((atan2f(direction.z, direction.y) + (float)M_PI_2)); + float xAngle = (atan2(direction.z, direction.x) + PI_OVER_TWO); + float yAngle = 0.5f - ((atan2f(direction.z, direction.y) + (float)PI_OVER_TWO)); auto canvasSize = qApp->getCanvasSize(); // Get the pixel range over which the xAngle and yAngle are scaled float cursorRange = canvasSize.x * getCursorPixelRangeMult(); diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index dad626ae44..c7308674fe 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -15,6 +15,7 @@ #include #include +#include #include "CursorManager.h" #include "Tooltip.h" @@ -499,8 +500,8 @@ void ApplicationCompositor::renderControllerPointers(gpu::Batch& batch) { glm::vec3 direction = glm::inverse(myAvatar->getOrientation()) * palmData->getFingerDirection(); // Get the angles, scaled between (-0.5,0.5) - float xAngle = (atan2(direction.z, direction.x) + M_PI_2); - float yAngle = 0.5f - ((atan2f(direction.z, direction.y) + (float)M_PI_2)); + float xAngle = (atan2(direction.z, direction.x) + PI_OVER_TWO); + float yAngle = 0.5f - ((atan2f(direction.z, direction.y) + (float)PI_OVER_TWO)); // Get the pixel range over which the xAngle and yAngle are scaled float cursorRange = canvasSize.x * SixenseManager::getInstance().getCursorPixelRangeMult(); From 81543d918554ba26b6823b1ca8362ddbb426f3a7 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sun, 19 Jul 2015 19:06:21 -0700 Subject: [PATCH 570/582] Removing unneeded undef --- interface/src/avatar/Avatar.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 979995360e..5b6e53be53 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -706,9 +706,6 @@ Transform Avatar::calculateDisplayNameTransform(const ViewFrustum& frustum, floa // Compute pixel alignment offset float clipToPix = 0.5f * windowSizeY / p1.w; // Got from clip to pixel coordinates glm::vec4 screenPos = clipToPix * p1; // in pixels coords -// WTF? -#undef round - glm::vec4 screenOffset = (glm::round(screenPos) - screenPos) / clipToPix; // in clip coords glm::vec3 worldOffset = glm::vec3(screenOffset.x, screenOffset.y, 0.0f) / (float)pixelHeight; From 4c3cfe1e82f2d8c79ec8f86a361542dd99581837 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sun, 19 Jul 2015 20:53:50 -0700 Subject: [PATCH 571/582] Starfield jazz hands --- interface/src/Stars.cpp | 58 ++++++++++++----- libraries/render-utils/src/stars.slf | 93 ++++++++++++---------------- 2 files changed, 82 insertions(+), 69 deletions(-) diff --git a/interface/src/Stars.cpp b/interface/src/Stars.cpp index 3ef909786d..02c4ffd32f 100644 --- a/interface/src/Stars.cpp +++ b/interface/src/Stars.cpp @@ -24,6 +24,10 @@ #include #include +#include "../../libraries/render-utils/standardTransformPNTC_vert.h" +#include "../../libraries/render-utils/stars_frag.h" + +static const float TILT = 0.23f; static const unsigned int STARFIELD_NUM_STARS = 50000; static const unsigned int STARFIELD_SEED = 1; static const float STAR_COLORIZATION = 0.1f; @@ -34,14 +38,9 @@ static const float QUARTER_TAU = TAU / 4.0f; static const float MILKY_WAY_WIDTH = TAU / 30.0f; // width in radians of one half of the Milky Way static const float MILKY_WAY_INCLINATION = 0.0f; // angle of Milky Way from horizontal in degrees static const float MILKY_WAY_RATIO = 0.4f; +static const char* UNIFORM_TIME_NAME = "iGlobalTime"; -#include "../../libraries/render-utils/standardTransformPNTC_vert.h" -const char stars_frag[] = R"SCRIBE(#version 430 compatibility -void main(void) { - gl_FragColor = vec4( 1.0 ); -} -)SCRIBE"; Stars::Stars() { } @@ -112,16 +111,16 @@ void Stars::render(RenderArgs* renderArgs, float alpha) { static gpu::BufferPointer vertexBuffer; static gpu::Stream::FormatPointer streamFormat; static gpu::Element positionElement, colorElement; + static gpu::PipelinePointer _pipeline; + static int32_t _timeSlot{ -1 }; + static std::once_flag once; const int VERTICES_SLOT = 0; const int COLOR_SLOT = 2; - static std::once_flag once; - std::call_once(once, [&] { QElapsedTimer startTime; startTime.start(); - vertexBuffer.reset(new gpu::Buffer); srand(STARFIELD_SEED); @@ -139,18 +138,45 @@ void Stars::render(RenderArgs* renderArgs, float alpha) { positionElement = streamFormat->getAttributes().at(gpu::Stream::POSITION)._element; double timeDiff = (double)startTime.nsecsElapsed() / 1000000.0; // ns to ms qDebug() << "Total time to generate stars: " << timeDiff << " msec"; + + auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(standardTransformPNTC_vert))); + auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(stars_frag))); + auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); + gpu::Shader::makeProgram((*program)); + _timeSlot = program->getBuffers().findLocation(UNIFORM_TIME_NAME); + if (_timeSlot == gpu::Shader::INVALID_LOCATION) { + _timeSlot = program->getUniforms().findLocation(UNIFORM_TIME_NAME); + } + auto state = gpu::StatePointer(new gpu::State()); + // enable decal blend + state->setDepthTest(gpu::State::DepthTest(false)); + state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA); + _pipeline.reset(gpu::Pipeline::create(program, state)); }); - gpu::Batch batch; - batch.setInputFormat(streamFormat); - batch.setInputBuffer(VERTICES_SLOT, gpu::BufferView(vertexBuffer, positionElement)); - batch.setViewTransform(Transform()); - batch.setProjectionTransform(renderArgs->_viewFrustum->getProjection()); - batch.setModelTransform(Transform().setRotation(glm::inverse(renderArgs->_viewFrustum->getOrientation()))); auto geometryCache = DependencyManager::get(); auto textureCache = DependencyManager::get(); - geometryCache->useSimpleDrawPipeline(batch); + + gpu::Batch batch; + batch.setViewTransform(Transform()); + batch.setProjectionTransform(renderArgs->_viewFrustum->getProjection()); + batch.setModelTransform(Transform().setRotation(glm::inverse(renderArgs->_viewFrustum->getOrientation()) * + quat(vec3(TILT, 0, 0)))); batch.setResourceTexture(0, textureCache->getWhiteTexture()); + + // Render the world lines + batch.setPipeline(_pipeline); + static auto start = usecTimestampNow(); + float msecs = (float)(usecTimestampNow() - start) / (float)USECS_PER_MSEC; + float secs = msecs / (float)MSECS_PER_SECOND; + batch._glUniform1f(_timeSlot, secs); + geometryCache->renderUnitCube(batch); + + + // Render the stars + geometryCache->useSimpleDrawPipeline(batch); + batch.setInputFormat(streamFormat); + batch.setInputBuffer(VERTICES_SLOT, gpu::BufferView(vertexBuffer, positionElement)); batch.draw(gpu::Primitive::POINTS, STARFIELD_NUM_STARS); renderArgs->_context->render(batch); } diff --git a/libraries/render-utils/src/stars.slf b/libraries/render-utils/src/stars.slf index f0f81cb5f4..344d196230 100644 --- a/libraries/render-utils/src/stars.slf +++ b/libraries/render-utils/src/stars.slf @@ -1,5 +1,6 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> +#line __LINE__ // Generated on <$_SCRIBE_DATE$> // stars.frag // fragment shader @@ -10,67 +11,53 @@ varying vec2 varTexcoord; varying vec3 varNomral; varying vec3 varPosition; +uniform float iGlobalTime; -const int star_iterations = 14; -const float time_scale = 0.2; -const vec3 col_star = vec3( 1.0, 0.7, 0.5 ); +const float PI = 3.14159; +const float TAU = 3.14159 * 2.0; +const int latitudeCount = 5; +const float latitudeDist = PI / 2.0 / float(latitudeCount); +const int meridianCount = 4; +const float merdianDist = PI / float(meridianCount); -float hash( float n ) { return fract(sin(n)*123.456789); } -vec2 rotate( in vec2 uv, float a) -{ - float c = cos( a ); - float s = sin( a ); - return vec2( c * uv.x - s * uv.y, s * uv.x + c * uv.y ); +float clampLine(float val, float target) { + return clamp((1.0 - abs((val - target)) - 0.998) * 500.0, 0.0, 1.0); } -float noise( in vec3 p ) -{ - vec3 fl = floor( p ); - vec3 fr = fract( p ); - fr = fr * fr * ( 3.0 - 2.0 * fr ); - - float n = fl.x + fl.y * 157.0 + 113.0 * fl.z; - return mix( mix( mix( hash( n + 0.0), hash( n + 1.0 ), fr.x ), - mix( hash( n + 157.0), hash( n + 158.0 ), fr.x ), fr.y ), - mix( mix( hash( n + 113.0), hash( n + 114.0 ), fr.x ), - mix( hash( n + 270.0), hash( n + 271.0 ), fr.x ), fr.y ), fr.z ); -} - -float fbm( in vec2 p, float t ) -{ - float f; - f = 0.5000 * noise( vec3( p, t ) ); p *= 2.1; - f += 0.2500 * noise( vec3( p, t ) ); p *= 2.2; - f += 0.1250 * noise( vec3( p, t ) ); p *= 2.3; - f += 0.0625 * noise( vec3( p, t ) ); - return f; -} - -vec3 doBackgroundStars( in vec3 dir ) -{ - vec3 n = abs( dir ); - vec2 uv = ( n.x > n.y && n.x > n.z ) ? dir.yz / dir.x: - ( n.y > n.x && n.y > n.z ) ? dir.zx / dir.y: - dir.xy / dir.z; - - float f = 0.0; - - for( int i = 0 ; i < star_iterations; ++i ) - { - uv = rotate( 1.07 * uv + vec2( 0.7 ), 0.5 ); - - float t = 10. * uv.x * uv.y; - vec2 u = cos( 100. * uv ) * fbm( 10. * uv, 0.0 ); - f += smoothstep( 0.5, 0.55, u.x * u.y ) * ( 0.25 * sin( t ) + 0.75 ); +float latitude(vec2 pos, float angle) { + float result = clampLine(pos.y, angle); + if (angle != 0.0) { + result += clampLine(pos.y, -angle); } - - return f * col_star; + return result; +} + +float meridian(vec2 pos, float angle) { + return clampLine(pos.x, angle) + clampLine(pos.x + PI, angle); +} + +vec2 toPolar(in vec3 dir) { + vec2 polar = vec2(atan(dir.z, dir.x), asin(dir.y)); + return polar; +} + +void mainVR( out vec4 fragColor, in vec2 fragCoord, in vec3 fragRayOri, in vec3 fragRayDir ) +{ + vec2 polar = toPolar(fragRayDir); + polar.x += mod(iGlobalTime / 12.0, PI / 4.0) - PI / 4.0; + float c = 0.0; + for (int i = 0; i < latitudeCount - 1; ++i) { + c += latitude(polar, float(i) * latitudeDist); + } + for (int i = 0; i < meridianCount; ++i) { + c += meridian(polar, float(i) * merdianDist); + } + const vec3 col_lines = vec3(102.0 / 255.0, 136.0 / 255.0, 221.0 / 255.0); + fragColor = vec4(c * col_lines, 1.0); } void main(void) { - vec3 c = doBackgroundStars( normalize(varPosition) ); - c = pow( c, vec3( 0.4545 ) ); - gl_FragColor = vec4( c, 1.0 ); + mainVR(gl_FragColor, gl_FragCoord.xy, vec3(0.0), normalize(varPosition)); } From 5159452335487f8d2150df416af32acc71f04e4c Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sun, 19 Jul 2015 23:03:46 -0700 Subject: [PATCH 572/582] Fixing invalid vector usage and strange picking crash --- interface/src/Stars.cpp | 2 +- libraries/shared/src/RegisteredMetaTypes.cpp | 22 ++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/interface/src/Stars.cpp b/interface/src/Stars.cpp index 02c4ffd32f..87000b40a4 100644 --- a/interface/src/Stars.cpp +++ b/interface/src/Stars.cpp @@ -126,7 +126,7 @@ void Stars::render(RenderArgs* renderArgs, float alpha) { srand(STARFIELD_SEED); unsigned limit = STARFIELD_NUM_STARS; std::vector points; - points.reserve(limit); + points.resize(limit); for (size_t star = 0; star < limit; ++star) { points[star] = fromPolar(randPolar()); //auto color = computeStarColor(STAR_COLORIZATION); diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index dce31b2971..de684dced1 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -210,15 +210,25 @@ QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay) void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay) { QScriptValue originValue = object.property("origin"); if (originValue.isValid()) { - pickRay.origin.x = originValue.property("x").toVariant().toFloat(); - pickRay.origin.y = originValue.property("y").toVariant().toFloat(); - pickRay.origin.z = originValue.property("z").toVariant().toFloat(); + auto x = originValue.property("x"); + auto y = originValue.property("y"); + auto z = originValue.property("z"); + if (x.isValid() && y.isValid() && z.isValid()) { + pickRay.origin.x = x.toVariant().toFloat(); + pickRay.origin.y = y.toVariant().toFloat(); + pickRay.origin.z = z.toVariant().toFloat(); + } } QScriptValue directionValue = object.property("direction"); if (directionValue.isValid()) { - pickRay.direction.x = directionValue.property("x").toVariant().toFloat(); - pickRay.direction.y = directionValue.property("y").toVariant().toFloat(); - pickRay.direction.z = directionValue.property("z").toVariant().toFloat(); + auto x = directionValue.property("x"); + auto y = directionValue.property("y"); + auto z = directionValue.property("z"); + if (x.isValid() && y.isValid() && z.isValid()) { + pickRay.direction.x = x.toVariant().toFloat(); + pickRay.direction.y = y.toVariant().toFloat(); + pickRay.direction.z = z.toVariant().toFloat(); + } } } From d4e637c5b8cedc0cadcde4fbf0c65b942a0c3464 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 20 Jul 2015 09:36:05 -0700 Subject: [PATCH 573/582] Removing superfluous lighting and naked GL in mirror --- interface/CMakeLists.txt | 5 ++ interface/src/Application.cpp | 64 ++++++++++---------- libraries/gpu/src/gpu/Batch.cpp | 13 +--- libraries/gpu/src/gpu/Batch.h | 5 -- libraries/gpu/src/gpu/GLBackend.cpp | 2 - libraries/gpu/src/gpu/GLBackend.h | 2 - libraries/gpu/src/gpu/GLBackendInput.cpp | 21 ------- libraries/gpu/src/gpu/GLBackendTransform.cpp | 1 + libraries/gpu/src/gpu/Light.h | 31 ---------- 9 files changed, 40 insertions(+), 104 deletions(-) delete mode 100644 libraries/gpu/src/gpu/Light.h diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index beeaab8567..1dd9d35b66 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -22,6 +22,11 @@ else () set(BUILD_SEQ "dev") endif () +if (WIN32) + add_definitions(-D_USE_MATH_DEFINES) # apparently needed to get M_PI and other defines from cmath/math.h + add_definitions(-DWINDOWS_LEAN_AND_MEAN) # needed to make sure windows doesn't go to crazy with its defines +endif() + configure_file(InterfaceVersion.h.in "${PROJECT_BINARY_DIR}/includes/InterfaceVersion.h") macro(GroupSources curdir) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0ce7698afe..192db1afd4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -993,11 +993,12 @@ void Application::paintGL() { } displaySide(&renderArgs, _myCamera); - renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; - if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + + if (_myCamera.getMode() != CAMERA_MODE_MIRROR && Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; renderRearViewMirror(&renderArgs, _mirrorViewRect); + renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; } - renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; { auto geometryCache = DependencyManager::get(); @@ -3113,19 +3114,7 @@ void Application::updateShadowMap(RenderArgs* renderArgs) { #endif } -static gpu::Light defaultLight{ - vec3( 0.525f, 0.525f, 0.6f), // ambient - vec3( 0.6f, 0.525f, 0.525f), // diffuse - vec4(0.08f, 0.08f, 0.08f, 1.0f), // specular - vec4( 0, 0, 0, 0 ), // position - 96 // shininess -}; - void Application::setupWorldLight(RenderArgs* renderArgs) { - gpu::Batch batch; - defaultLight._position = vec4(getSunDirection(), 0); - batch.setLight(0, defaultLight); - renderArgs->_context->render(batch); } bool Application::shouldRenderMesh(float largestDimension, float distanceToCamera) { @@ -3624,9 +3613,8 @@ glm::vec2 Application::getScaledScreenPoint(glm::vec2 projectedPoint) { } void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& region, bool billboard) { + auto originalViewport = renderArgs->_viewport; // Grab current viewport to reset it at the end - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); float aspect = (float)region.width() / region.height(); float fov = MIRROR_FIELD_OF_VIEW; @@ -3663,35 +3651,45 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi _mirrorCamera.setProjection(glm::perspective(glm::radians(fov), aspect, DEFAULT_NEAR_CLIP, DEFAULT_FAR_CLIP)); _mirrorCamera.setRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI, 0.0f))); + // set the bounds of rear mirror view + gpu::Vec4i viewport; if (billboard) { QSize size = DependencyManager::get()->getFrameBufferSize(); - glViewport(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); - glScissor(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); - renderArgs->_viewport = glm::ivec4(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); + viewport = gpu::Vec4i(region.x(), size.height() - region.y() - region.height(), region.width(), region.height()); } else { // if not rendering the billboard, the region is in device independent coordinates; must convert to device QSize size = DependencyManager::get()->getFrameBufferSize(); float ratio = (float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale(); int x = region.x() * ratio, y = region.y() * ratio, width = region.width() * ratio, height = region.height() * ratio; - glViewport(x, size.height() - y - height, width, height); - glScissor(x, size.height() - y - height, width, height); - - renderArgs->_viewport = glm::ivec4(x, size.height() - y - height, width, height); + viewport = gpu::Vec4i(x, size.height() - y - height, width, height); } + renderArgs->_viewport = viewport; + + { + gpu::Batch batch; + batch.setViewportTransform(viewport); + batch.setStateScissorRect(viewport); + batch.clearFramebuffer( + gpu::Framebuffer::BUFFER_COLOR0 | + gpu::Framebuffer::BUFFER_COLOR1 | + gpu::Framebuffer::BUFFER_COLOR2 | + gpu::Framebuffer::BUFFER_DEPTH, + vec4(vec3(0), 1), 1.0, 0.0, true); + // Viewport is assigned to the size of the framebuffer + renderArgs->_context->render(batch); + } + bool updateViewFrustum = false; updateProjectionMatrix(_mirrorCamera, updateViewFrustum); - glEnable(GL_SCISSOR_TEST); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // render rear mirror view displaySide(renderArgs, _mirrorCamera, true, billboard); - - // reset Viewport and projection matrix - renderArgs->_viewport = glm::ivec4(viewport[0], viewport[1], viewport[2], viewport[3]); - glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); - glDisable(GL_SCISSOR_TEST); - updateProjectionMatrix(_myCamera, updateViewFrustum); + //{ + // gpu::Batch batch; + // renderArgs->_viewport = originalViewport; + // batch.setViewportTransform(originalViewport); + // renderArgs->_context->render(batch); + //} } void Application::resetSensors() { diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index f8d530bb74..01c3c4ade7 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -13,6 +13,9 @@ #include +#include + + #if defined(NSIGHT_FOUND) #include "nvToolsExt.h" @@ -301,13 +304,3 @@ void push_back(Batch::Params& params, const vec4& v) { params.push_back(v.z); params.push_back(v.a); } - -void Batch::setLight(uint8_t index, const Light& light) { - ADD_COMMAND(setLight); - _params.push_back(index); - push_back(_params, light._ambientColor); - push_back(_params, light._diffuseColor); - push_back(_params, light._position); - push_back(_params, light._specularColor); - _params.push_back(light._shininess); -} \ No newline at end of file diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index 3954127783..2f1d2e8ece 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -14,7 +14,6 @@ #include #include "Framebuffer.h" -#include "Light.h" #include "Pipeline.h" #include "Query.h" #include "Stream.h" @@ -77,8 +76,6 @@ public: void setIndexBuffer(Type type, const BufferPointer& buffer, Offset offset); void setIndexBuffer(const BufferView& buffer); // not a command, just a shortcut from a BufferView - void setLight(uint8_t index, const Light& light); - // Transform Stage // Vertex position is transformed by ModelTransform from object space to world space // Then by the inverse of the ViewTransform from world space to eye space @@ -172,8 +169,6 @@ public: COMMAND_setInputBuffer, COMMAND_setIndexBuffer, - COMMAND_setLight, - COMMAND_setModelTransform, COMMAND_setViewTransform, COMMAND_setProjectionTransform, diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index f6b9bb8706..adebee2f20 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -26,8 +26,6 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = (&::gpu::GLBackend::do_setInputBuffer), (&::gpu::GLBackend::do_setIndexBuffer), - (&::gpu::GLBackend::do_setLight), - (&::gpu::GLBackend::do_setModelTransform), (&::gpu::GLBackend::do_setViewTransform), (&::gpu::GLBackend::do_setProjectionTransform), diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index eab880f14d..60c01a815c 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -253,8 +253,6 @@ protected: void do_setInputBuffer(Batch& batch, uint32 paramOffset); void do_setIndexBuffer(Batch& batch, uint32 paramOffset); - void do_setLight(Batch& batch, uint32 paramOffset); - void initInput(); void killInput(); void syncInputStateCache(); diff --git a/libraries/gpu/src/gpu/GLBackendInput.cpp b/libraries/gpu/src/gpu/GLBackendInput.cpp index 59719bd000..229b29cd43 100755 --- a/libraries/gpu/src/gpu/GLBackendInput.cpp +++ b/libraries/gpu/src/gpu/GLBackendInput.cpp @@ -305,24 +305,3 @@ void popParam(Batch::Params& params, uint32& paramOffset, V& v) { v[i] = params[paramOffset++]._float; } } - -void GLBackend::do_setLight(Batch& batch, uint32 paramOffset) { - int index = batch._params[paramOffset++]._uint; - gpu::Light light; - popParam(batch._params, paramOffset, light._ambientColor); - popParam(batch._params, paramOffset, light._diffuseColor); - popParam(batch._params, paramOffset, light._position); - popParam(batch._params, paramOffset, light._specularColor); - light._shininess = batch._params[paramOffset++]._int; - - // Setup 3D lights (after the camera transform, so that they are positioned in world space) - glEnable(GL_COLOR_MATERIAL); - glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); - glLightfv(GL_LIGHT0 + index, GL_POSITION, &light._position.x); - glLightfv(GL_LIGHT0 + index, GL_AMBIENT, &light._ambientColor.r); - glLightfv(GL_LIGHT0 + index, GL_DIFFUSE, &light._diffuseColor.r); - glLightfv(GL_LIGHT0 + index, GL_SPECULAR, &light._specularColor.r); - glMaterialfv(GL_FRONT + index, GL_SPECULAR, &light._specularColor.r); - glMateriali(GL_FRONT + index, GL_SHININESS, light._shininess); -} - diff --git a/libraries/gpu/src/gpu/GLBackendTransform.cpp b/libraries/gpu/src/gpu/GLBackendTransform.cpp index 01229cb317..2378edb095 100755 --- a/libraries/gpu/src/gpu/GLBackendTransform.cpp +++ b/libraries/gpu/src/gpu/GLBackendTransform.cpp @@ -32,6 +32,7 @@ void GLBackend::do_setProjectionTransform(Batch& batch, uint32 paramOffset) { void GLBackend::do_setViewportTransform(Batch& batch, uint32 paramOffset) { memcpy(&_transform._viewport, batch.editData(batch._params[paramOffset]._uint), sizeof(Vec4i)); + glViewport(_transform._viewport.x, _transform._viewport.y, _transform._viewport.z, _transform._viewport.w); _transform._invalidViewport = true; } diff --git a/libraries/gpu/src/gpu/Light.h b/libraries/gpu/src/gpu/Light.h deleted file mode 100644 index 6ce8eb637f..0000000000 --- a/libraries/gpu/src/gpu/Light.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// Created by Bradley Austin Davis 2015/07/18 -// Copyright 2014 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 -// -#pragma once -#ifndef hifi_gpu_Light_h -#define hifi_gpu_Light_h - -#include - -namespace gpu { - -struct Light { - Light() {} - Light(const vec3& ambient, const vec3& diffuse, const vec4& position, const vec4& specular = vec4(), int shininess = 0) : - _ambientColor(ambient), _diffuseColor(diffuse), _position(position), _specularColor(specular), _shininess(shininess) { - - } - vec3 _ambientColor; - vec3 _diffuseColor; - vec4 _position; - vec4 _specularColor; - int _shininess{0}; -}; - -} - -#endif From de92e66635ecbb20687ac46a36cf3eb889e2c2e0 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 20 Jul 2015 09:59:22 -0700 Subject: [PATCH 574/582] Removing shadows code --- interface/src/Application.cpp | 138 +--------------------------------- 1 file changed, 1 insertion(+), 137 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 192db1afd4..9557d982a2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2990,128 +2990,6 @@ static QThread * activeRenderingThread = nullptr; void Application::updateShadowMap(RenderArgs* renderArgs) { // TODO fix shadows and make them use the GPU library -#if 0 - activeRenderingThread = QThread::currentThread(); - - PerformanceTimer perfTimer("shadowMap"); - auto shadowFramebuffer = DependencyManager::get()->getShadowFramebuffer(); - - { - gpu::Batch batch; - auto primaryFbo = DependencyManager::get()->getPrimaryFramebuffer(); - batch.setFramebuffer(shadowFramebuffer); - // clear the normal and specular buffers - batch.clearFramebuffer( - gpu::Framebuffer::BUFFER_DEPTH, - vec4(vec3(0), 1), 1.0, 0.0); - // Viewport is assigned to the size of the framebuffer - QSize size = DependencyManager::get()->getFrameBufferSize(); - renderArgs->_context->render(batch); - } - - glm::vec3 lightDirection = getSunDirection(); - glm::quat rotation = rotationBetween(IDENTITY_FRONT, lightDirection); - glm::quat inverseRotation = glm::inverse(rotation); - - const float SHADOW_MATRIX_DISTANCES[] = { 0.0f, 2.0f, 6.0f, 14.0f, 30.0f }; - const glm::vec2 MAP_COORDS[] = { glm::vec2(0.0f, 0.0f), glm::vec2(0.5f, 0.0f), - glm::vec2(0.0f, 0.5f), glm::vec2(0.5f, 0.5f) }; - - float frustumScale = 1.0f / (_viewFrustum.getFarClip() - _viewFrustum.getNearClip()); - loadViewFrustum(_myCamera, _viewFrustum); - - int matrixCount = 1; - //int targetSize = fbo->width(); - int sourceSize = shadowFramebuffer->getWidth(); - int targetSize = shadowFramebuffer->getWidth(); - float targetScale = 1.0f; - if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) { - matrixCount = CASCADED_SHADOW_MATRIX_COUNT; - targetSize = sourceSize / 2; - targetScale = 0.5f; - } - for (int i = 0; i < matrixCount; i++) { - const glm::vec2& coord = MAP_COORDS[i]; - glViewport(coord.s * sourceSize, coord.t * sourceSize, targetSize, targetSize); - - // if simple shadow then since the resolution is twice as much as with cascaded, cover 2 regions with the map, not just one - int regionIncrement = (matrixCount == 1 ? 2 : 1); - float nearScale = SHADOW_MATRIX_DISTANCES[i] * frustumScale; - float farScale = SHADOW_MATRIX_DISTANCES[i + regionIncrement] * frustumScale; - glm::vec3 points[] = { - glm::mix(_viewFrustum.getNearTopLeft(), _viewFrustum.getFarTopLeft(), nearScale), - glm::mix(_viewFrustum.getNearTopRight(), _viewFrustum.getFarTopRight(), nearScale), - glm::mix(_viewFrustum.getNearBottomLeft(), _viewFrustum.getFarBottomLeft(), nearScale), - glm::mix(_viewFrustum.getNearBottomRight(), _viewFrustum.getFarBottomRight(), nearScale), - glm::mix(_viewFrustum.getNearTopLeft(), _viewFrustum.getFarTopLeft(), farScale), - glm::mix(_viewFrustum.getNearTopRight(), _viewFrustum.getFarTopRight(), farScale), - glm::mix(_viewFrustum.getNearBottomLeft(), _viewFrustum.getFarBottomLeft(), farScale), - glm::mix(_viewFrustum.getNearBottomRight(), _viewFrustum.getFarBottomRight(), farScale) }; - glm::vec3 center; - for (size_t j = 0; j < sizeof(points) / sizeof(points[0]); j++) { - center += points[j]; - } - center /= (float)(sizeof(points) / sizeof(points[0])); - float radius = 0.0f; - for (size_t j = 0; j < sizeof(points) / sizeof(points[0]); j++) { - radius = qMax(radius, glm::distance(points[j], center)); - } - if (i < 3) { - const float RADIUS_SCALE = 0.5f; - _shadowDistances[i] = -glm::distance(_viewFrustum.getPosition(), center) - radius * RADIUS_SCALE; - } - center = inverseRotation * center; - - // to reduce texture "shimmer," move in texel increments - float texelSize = (2.0f * radius) / targetSize; - center = glm::vec3(roundf(center.x / texelSize) * texelSize, roundf(center.y / texelSize) * texelSize, - roundf(center.z / texelSize) * texelSize); - - glm::vec3 minima(center.x - radius, center.y - radius, center.z - radius); - glm::vec3 maxima(center.x + radius, center.y + radius, center.z + radius); - - // stretch out our extents in z so that we get all of the avatars - minima.z -= _viewFrustum.getFarClip() * 0.5f; - maxima.z += _viewFrustum.getFarClip() * 0.5f; - - // save the combined matrix for rendering - _shadowMatrices[i] = glm::transpose(glm::translate(glm::vec3(coord, 0.0f)) * - glm::scale(glm::vec3(targetScale, targetScale, 1.0f)) * - glm::translate(glm::vec3(0.5f, 0.5f, 0.5f)) * glm::scale(glm::vec3(0.5f, 0.5f, 0.5f)) * - glm::ortho(minima.x, maxima.x, minima.y, maxima.y, -maxima.z, -minima.z) * glm::mat4_cast(inverseRotation)); - - // update the shadow view frustum - // glm::vec3 shadowFrustumCenter = glm::vec3((minima.x + maxima.x) * 0.5f, (minima.y + maxima.y) * 0.5f, (minima.z + maxima.z) * 0.5f); - glm::vec3 shadowFrustumCenter = rotation * ((minima + maxima) * 0.5f); - _shadowViewFrustum.setPosition(shadowFrustumCenter); - _shadowViewFrustum.setOrientation(rotation); - _shadowViewFrustum.setProjection(glm::ortho(minima.x, maxima.x, minima.y, maxima.y, minima.z, maxima.z)); - _shadowViewFrustum.calculate(); - - // store view matrix without translation, which we'll use for precision-sensitive objects - updateUntranslatedViewMatrix(); - // Equivalent to what is happening with _untranslatedViewMatrix and the _viewMatrixTranslation - // the viewTransofmr object is updatded with the correct values and saved, - // this is what is used for rendering the Entities and avatars - Transform viewTransform; - viewTransform.setRotation(rotation); - setViewTransform(viewTransform); - - - glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(1.1f, 4.0f); // magic numbers courtesy http://www.eecs.berkeley.edu/~ravir/6160/papers/shadowmaps.ppt - - { - PerformanceTimer perfTimer("entities"); - _entities.render(renderArgs); - } - - glDisable(GL_POLYGON_OFFSET_FILL); - } - - glViewport(0, 0, _glWidget->getDeviceWidth(), _glWidget->getDeviceHeight()); - activeRenderingThread = nullptr; -#endif } void Application::setupWorldLight(RenderArgs* renderArgs) { @@ -3386,21 +3264,7 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se } // TODO fix shadows and make them use the GPU library -#if 0 - // setup shadow matrices (again, after the camera transform) - int shadowMatrixCount = 0; - if (Menu::getInstance()->isOptionChecked(MenuOption::SimpleShadows)) { - shadowMatrixCount = 1; - } else if (Menu::getInstance()->isOptionChecked(MenuOption::CascadedShadows)) { - shadowMatrixCount = CASCADED_SHADOW_MATRIX_COUNT; - } - for (int i = shadowMatrixCount - 1; i >= 0; i--) { - glActiveTexture(GL_TEXTURE0 + i); - glTexGenfv(GL_S, GL_EYE_PLANE, (const GLfloat*)&_shadowMatrices[i][0]); - glTexGenfv(GL_T, GL_EYE_PLANE, (const GLfloat*)&_shadowMatrices[i][1]); - glTexGenfv(GL_R, GL_EYE_PLANE, (const GLfloat*)&_shadowMatrices[i][2]); - } -#endif + // The pending changes collecting the changes here render::PendingChanges pendingChanges; From cd677ccb18049dbb3fef2195b5633b5045dfb891 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 20 Jul 2015 10:18:14 -0700 Subject: [PATCH 575/582] Removing animation from star grid --- libraries/render-utils/src/stars.slf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/render-utils/src/stars.slf b/libraries/render-utils/src/stars.slf index 344d196230..0f3070581c 100644 --- a/libraries/render-utils/src/stars.slf +++ b/libraries/render-utils/src/stars.slf @@ -45,7 +45,7 @@ vec2 toPolar(in vec3 dir) { void mainVR( out vec4 fragColor, in vec2 fragCoord, in vec3 fragRayOri, in vec3 fragRayDir ) { vec2 polar = toPolar(fragRayDir); - polar.x += mod(iGlobalTime / 12.0, PI / 4.0) - PI / 4.0; + //polar.x += mod(iGlobalTime / 12.0, PI / 4.0) - PI / 4.0; float c = 0.0; for (int i = 0; i < latitudeCount - 1; ++i) { c += latitude(polar, float(i) * latitudeDist); From dcaaeec593d6b033e62fd69e3dbcd25f2241fc51 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 20 Jul 2015 10:55:11 -0700 Subject: [PATCH 576/582] Removing AO effect (temporarily) and wireframe mode --- interface/src/Application.cpp | 25 --- interface/src/Menu.cpp | 1 - interface/src/Menu.h | 1 - .../src/AmbientOcclusionEffect.cpp | 192 ------------------ .../render-utils/src/AmbientOcclusionEffect.h | 51 ----- 5 files changed, 270 deletions(-) delete mode 100644 libraries/render-utils/src/AmbientOcclusionEffect.cpp delete mode 100644 libraries/render-utils/src/AmbientOcclusionEffect.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9557d982a2..e09958fdee 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -55,7 +55,6 @@ #include #include #include -#include #include #include #include @@ -266,7 +265,6 @@ bool setupEssentials(int& argc, char** argv) { auto audio = DependencyManager::set(); auto audioScope = DependencyManager::set(); auto deferredLightingEffect = DependencyManager::set(); - auto ambientOcclusionEffect = DependencyManager::set(); auto textureCache = DependencyManager::set(); auto animationCache = DependencyManager::set(); auto ddeFaceTracker = DependencyManager::set(); @@ -1255,12 +1253,6 @@ void Application::keyPressEvent(QKeyEvent* event) { Menu::getInstance()->triggerOption(MenuOption::Stars); break; - case Qt::Key_W: - if (isOption && !isShifted && !isMeta) { - Menu::getInstance()->triggerOption(MenuOption::Wireframe); - } - break; - case Qt::Key_S: if (isShifted && isMeta && !isOption) { Menu::getInstance()->triggerOption(MenuOption::SuppressShortTimings); @@ -2154,7 +2146,6 @@ void Application::init() { _environment.init(); DependencyManager::get()->init(this); - DependencyManager::get()->init(this); // TODO: move _myAvatar out of Application. Move relevant code to MyAvataar or AvatarManager DependencyManager::get()->init(); @@ -3278,10 +3269,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se } - if (Menu::getInstance()->isOptionChecked(MenuOption::Wireframe)) { - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - } - // Assuming nothing get's rendered through that if (!selfAvatarOnly) { if (DependencyManager::get()->shouldRenderEntities()) { @@ -3302,14 +3289,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se renderArgs->_debugFlags = renderDebugFlags; _entities.render(renderArgs); } - - // render the ambient occlusion effect if enabled - if (Menu::getInstance()->isOptionChecked(MenuOption::AmbientOcclusion)) { - PerformanceTimer perfTimer("ambientOcclusion"); - PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), - "Application::displaySide() ... AmbientOcclusion..."); - DependencyManager::get()->render(); - } } // Make sure the WorldBox is in the scene @@ -3400,10 +3379,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se } } - if (Menu::getInstance()->isOptionChecked(MenuOption::Wireframe)) { - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - } - activeRenderingThread = nullptr; } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 75ae88e296..35ae2e7e1f 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -386,7 +386,6 @@ Menu::Menu() { 0, // QML Qt::Key_Asterisk, true); - addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Wireframe, Qt::ALT | Qt::Key_W, false); addActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::LodTools, 0, // QML Qt::SHIFT | Qt::Key_L, dialogsManager.data(), SLOT(lodTools())); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 22f07699a0..e1976cdebe 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -289,7 +289,6 @@ namespace MenuOption { const QString VisibleToEveryone = "Everyone"; const QString VisibleToFriends = "Friends"; const QString VisibleToNoOne = "No one"; - const QString Wireframe = "Wireframe"; } #endif // hifi_Menu_h diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp deleted file mode 100644 index ee1af18494..0000000000 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ /dev/null @@ -1,192 +0,0 @@ -// -// AmbientOcclusionEffect.cpp -// interface/src/renderer -// -// Created by Andrzej Kapolka on 7/14/13. -// Copyright 2013 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 "AmbientOcclusionEffect.h" - -#include -#include - -#include -#include -#include -#include - -#include "AbstractViewStateInterface.h" -#include "RenderUtil.h" -#include "TextureCache.h" - -const int ROTATION_WIDTH = 4; -const int ROTATION_HEIGHT = 4; - -static QString readFile(const QString& path) { - QFile file(path); - QString result; - if (file.open(QFile::ReadOnly | QFile::Text)) { - QTextStream in(&file); - result = in.readAll(); - } - return result; -} - -void AmbientOcclusionEffect::init(AbstractViewStateInterface* viewState) { -#if 0 - _viewState = viewState; // we will use this for view state services - - { - gpu::Shader::Source vertexSource = std::string(readFile(PathUtils::resourcesPath() - + "shaders/ambient_occlusion.vert").toLocal8Bit().data()); - gpu::Shader::Source fragmentSource = std::string(readFile(PathUtils::resourcesPath() - + "shaders/ambient_occlusion.frag").toLocal8Bit().data()); - auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(vertexSource)); - auto fs = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentSource)); - _occlusionProgram = gpu::ShaderPointer(gpu::Shader::createProgram(vs, fs)); - } - foreach(auto uniform, _occlusionProgram->getUniforms()) { - qDebug() << uniform._location; - } - - // create the sample kernel: an array of hemispherically distributed offset vectors - const int SAMPLE_KERNEL_SIZE = 16; - QVector3D sampleKernel[SAMPLE_KERNEL_SIZE]; - for (int i = 0; i < SAMPLE_KERNEL_SIZE; i++) { - // square the length in order to increase density towards the center - glm::vec3 vector = glm::sphericalRand(1.0f); - float scale = randFloat(); - const float MIN_VECTOR_LENGTH = 0.01f; - const float MAX_VECTOR_LENGTH = 1.0f; - vector *= glm::mix(MIN_VECTOR_LENGTH, MAX_VECTOR_LENGTH, scale * scale); - sampleKernel[i] = QVector3D(vector.x, vector.y, vector.z); - } - - glUseProgram(gpu::GLBackend::getShaderID(_occlusionProgram)); - glUniform1i(_occlusionProgram->getUniforms().findLocation("depthTexture"), 0); - glUniform1i(_occlusionProgram->getUniforms().findLocation("rotationTexture"), 1); - glUniform1f(_occlusionProgram->getUniforms().findLocation("radius"), 0.1f); - //_occlusionProgram->setUniformValueArray("sampleKernel", sampleKernel, SAMPLE_KERNEL_SIZE); - glUseProgram(0); - - _nearLocation = _occlusionProgram->getUniforms().findLocation("near"); - _farLocation = _occlusionProgram->getUniforms().findLocation("far"); - _leftBottomLocation = _occlusionProgram->getUniforms().findLocation("leftBottom"); - _rightTopLocation = _occlusionProgram->getUniforms().findLocation("rightTop"); - _noiseScaleLocation = _occlusionProgram->getUniforms().findLocation("noiseScale"); - _texCoordOffsetLocation = _occlusionProgram->getUniforms().findLocation("texCoordOffset"); - _texCoordScaleLocation = _occlusionProgram->getUniforms().findLocation("texCoordScale"); - - // generate the random rotation texture - glGenTextures(1, &_rotationTextureID); - glBindTexture(GL_TEXTURE_2D, _rotationTextureID); - const int ELEMENTS_PER_PIXEL = 3; - unsigned char rotationData[ROTATION_WIDTH * ROTATION_HEIGHT * ELEMENTS_PER_PIXEL]; - unsigned char* rotation = rotationData; - for (int i = 0; i < ROTATION_WIDTH * ROTATION_HEIGHT; i++) { - glm::vec3 vector = glm::sphericalRand(1.0f); - *rotation++ = ((vector.x + 1.0f) / 2.0f) * 255.0f; - *rotation++ = ((vector.y + 1.0f) / 2.0f) * 255.0f; - *rotation++ = ((vector.z + 1.0f) / 2.0f) * 255.0f; - } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ROTATION_WIDTH, ROTATION_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, rotationData); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glBindTexture(GL_TEXTURE_2D, 0); - - { - gpu::Shader::Source vertexSource = std::string(readFile(PathUtils::resourcesPath() - + "shaders/ambient_occlusion.vert").toLocal8Bit().data()); - gpu::Shader::Source fragmentSource = std::string(readFile(PathUtils::resourcesPath() - + "shaders/occlusion_blur.frag").toLocal8Bit().data()); - auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(vertexSource)); - auto fs = gpu::ShaderPointer(gpu::Shader::createPixel(fragmentSource)); - _blurProgram = gpu::ShaderPointer(gpu::Shader::createProgram(vs, fs)); - } - - glUseProgram(gpu::GLBackend::getShaderID(_blurProgram)); - foreach(auto uniform, _blurProgram->getUniforms()) { - qDebug() << uniform._location; - } - glUniform1f(_blurProgram->getUniforms().findLocation("originalTexture"), 0); - glUseProgram(0); - _blurScaleLocation = _blurProgram->getUniforms().findLocation("blurScale"); -#endif -} - -void AmbientOcclusionEffect::render() { -#if 0 - glDisable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glDepthMask(GL_FALSE); - - glBindTexture(GL_TEXTURE_2D, DependencyManager::get()->getPrimaryDepthTextureID()); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, _rotationTextureID); - - // render with the occlusion shader to the secondary/tertiary buffer - auto freeFramebuffer = nullptr; // DependencyManager::get()->getFreeFramebuffer(); // FIXME - glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(freeFramebuffer)); - - float left, right, bottom, top, nearVal, farVal; - glm::vec4 nearClipPlane, farClipPlane; - _viewState->computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); - - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - const int VIEWPORT_X_INDEX = 0; - const int VIEWPORT_WIDTH_INDEX = 2; - - auto framebufferSize = DependencyManager::get()->getFrameBufferSize(); - float sMin = viewport[VIEWPORT_X_INDEX] / (float)framebufferSize.width(); - float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)framebufferSize.width(); - - glUseProgram(gpu::GLBackend::getShaderID(_occlusionProgram)); - glUniform1f(_nearLocation, nearVal); - glUniform1f(_farLocation, farVal); - glUniform2f(_leftBottomLocation, left, bottom); - glUniform2f(_rightTopLocation, right, top); - glUniform2f(_noiseScaleLocation, viewport[VIEWPORT_WIDTH_INDEX] / (float)ROTATION_WIDTH, - framebufferSize.height() / (float)ROTATION_HEIGHT); - glUniform2f(_texCoordOffsetLocation, sMin, 0.0f); - glUniform2f(_texCoordScaleLocation, sWidth, 1.0f); - - renderFullscreenQuad(); - - glUseProgram(0); - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glBindTexture(GL_TEXTURE_2D, 0); - - glActiveTexture(GL_TEXTURE0); - - // now render secondary to primary with 4x4 blur - auto primaryFramebuffer = DependencyManager::get()->getPrimaryFramebuffer(); - glBindFramebuffer(GL_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFramebuffer)); - - glEnable(GL_BLEND); - glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); - - auto freeFramebufferTexture = nullptr; // freeFramebuffer->getRenderBuffer(0); // FIXME - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(freeFramebufferTexture)); - - glUseProgram(gpu::GLBackend::getShaderID(_occlusionProgram)); - glUniform2f(_blurScaleLocation, 1.0f / framebufferSize.width(), 1.0f / framebufferSize.height()); - - renderFullscreenQuad(sMin, sMin + sWidth); - - glUseProgram(0); - - glBindTexture(GL_TEXTURE_2D, 0); - - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); - glEnable(GL_DEPTH_TEST); - glDepthMask(GL_TRUE); -#endif -} diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.h b/libraries/render-utils/src/AmbientOcclusionEffect.h deleted file mode 100644 index e8d49cd3a3..0000000000 --- a/libraries/render-utils/src/AmbientOcclusionEffect.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// AmbientOcclusionEffect.h -// interface/src/renderer -// -// Created by Andrzej Kapolka on 7/14/13. -// Copyright 2013 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_AmbientOcclusionEffect_h -#define hifi_AmbientOcclusionEffect_h - -#include -#include -#include - -class AbstractViewStateInterface; - -/// A screen space ambient occlusion effect. See John Chapman's tutorial at -/// http://john-chapman-graphics.blogspot.co.uk/2013/01/ssao-tutorial.html for reference. -class AmbientOcclusionEffect : public Dependency { - SINGLETON_DEPENDENCY - -public: - - void init(AbstractViewStateInterface* viewState); - void render(); - -private: - AmbientOcclusionEffect() {} - virtual ~AmbientOcclusionEffect() {} - - gpu::ShaderPointer _occlusionProgram; - int _nearLocation; - int _farLocation; - int _leftBottomLocation; - int _rightTopLocation; - int _noiseScaleLocation; - int _texCoordOffsetLocation; - int _texCoordScaleLocation; - - gpu::ShaderPointer _blurProgram; - int _blurScaleLocation; - - uint32_t _rotationTextureID; - AbstractViewStateInterface* _viewState; -}; - -#endif // hifi_AmbientOcclusionEffect_h From 23b058e4eb7d9aac31f587bcd1d2bfce6fa4528f Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 20 Jul 2015 11:40:12 -0700 Subject: [PATCH 577/582] Removing starfield tilt and reducing grid alpha --- interface/src/Stars.cpp | 3 ++- libraries/render-utils/src/stars.slf | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/Stars.cpp b/interface/src/Stars.cpp index 87000b40a4..e6c96d9b4b 100644 --- a/interface/src/Stars.cpp +++ b/interface/src/Stars.cpp @@ -27,7 +27,8 @@ #include "../../libraries/render-utils/standardTransformPNTC_vert.h" #include "../../libraries/render-utils/stars_frag.h" -static const float TILT = 0.23f; +//static const float TILT = 0.23f; +static const float TILT = 0.0f; static const unsigned int STARFIELD_NUM_STARS = 50000; static const unsigned int STARFIELD_SEED = 1; static const float STAR_COLORIZATION = 0.1f; diff --git a/libraries/render-utils/src/stars.slf b/libraries/render-utils/src/stars.slf index 0f3070581c..ed338deaef 100644 --- a/libraries/render-utils/src/stars.slf +++ b/libraries/render-utils/src/stars.slf @@ -54,7 +54,7 @@ void mainVR( out vec4 fragColor, in vec2 fragCoord, in vec3 fragRayOri, in vec3 c += meridian(polar, float(i) * merdianDist); } const vec3 col_lines = vec3(102.0 / 255.0, 136.0 / 255.0, 221.0 / 255.0); - fragColor = vec4(c * col_lines, 1.0); + fragColor = vec4(c * col_lines, 0.2); } void main(void) { From 462ff9772289a03ded491796dfb9d64553fc8b62 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 20 Jul 2015 13:06:31 -0700 Subject: [PATCH 578/582] remove FlowLayout.cpp that was accidentally kept --- interface/src/ui/FlowLayout.cpp | 222 -------------------------------- 1 file changed, 222 deletions(-) delete mode 100644 interface/src/ui/FlowLayout.cpp diff --git a/interface/src/ui/FlowLayout.cpp b/interface/src/ui/FlowLayout.cpp deleted file mode 100644 index c12de05629..0000000000 --- a/interface/src/ui/FlowLayout.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdouble-promotion" -#endif - -#include - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#include "FlowLayout.h" -//! [1] -FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) - : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing) -{ - setContentsMargins(margin, margin, margin, margin); -} - -FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) - : m_hSpace(hSpacing), m_vSpace(vSpacing) -{ - setContentsMargins(margin, margin, margin, margin); -} -//! [1] - -//! [2] -FlowLayout::~FlowLayout() -{ - QLayoutItem *item; - while ((item = takeAt(0))) - delete item; -} -//! [2] - -//! [3] -void FlowLayout::addItem(QLayoutItem *item) -{ - itemList.append(item); -} -//! [3] - -//! [4] -int FlowLayout::horizontalSpacing() const -{ - if (m_hSpace >= 0) { - return m_hSpace; - } else { - return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); - } -} - -int FlowLayout::verticalSpacing() const -{ - if (m_vSpace >= 0) { - return m_vSpace; - } else { - return smartSpacing(QStyle::PM_LayoutVerticalSpacing); - } -} -//! [4] - -//! [5] -int FlowLayout::count() const -{ - return itemList.size(); -} - -QLayoutItem *FlowLayout::itemAt(int index) const -{ - return itemList.value(index); -} - -QLayoutItem *FlowLayout::takeAt(int index) -{ - if (index >= 0 && index < itemList.size()) - return itemList.takeAt(index); - else - return 0; -} -//! [5] - -//! [6] -Qt::Orientations FlowLayout::expandingDirections() const -{ - return 0; -} -//! [6] - -//! [7] -bool FlowLayout::hasHeightForWidth() const -{ - return true; -} - -int FlowLayout::heightForWidth(int width) const -{ - int height = doLayout(QRect(0, 0, width, 0), true); - return height; -} -//! [7] - -//! [8] -void FlowLayout::setGeometry(const QRect &rect) -{ - QLayout::setGeometry(rect); - doLayout(rect, false); -} - -QSize FlowLayout::sizeHint() const -{ - return minimumSize(); -} - -QSize FlowLayout::minimumSize() const -{ - QSize size; - QLayoutItem *item; - foreach (item, itemList) - size = size.expandedTo(item->minimumSize()); - - size += QSize(2*margin(), 2*margin()); - return size; -} -//! [8] - -//! [9] -int FlowLayout::doLayout(const QRect &rect, bool testOnly) const -{ - int left, top, right, bottom; - getContentsMargins(&left, &top, &right, &bottom); - QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom); - int x = effectiveRect.x(); - int y = effectiveRect.y(); - int lineHeight = 0; -//! [9] - -//! [10] - QLayoutItem *item; - foreach (item, itemList) { - QWidget *wid = item->widget(); - int spaceX = horizontalSpacing(); - if (spaceX == -1) - spaceX = wid->style()->layoutSpacing( - QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); - int spaceY = verticalSpacing(); - if (spaceY == -1) - spaceY = wid->style()->layoutSpacing( - QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); -//! [10] -//! [11] - int nextX = x + item->sizeHint().width() + spaceX; - if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) { - x = effectiveRect.x(); - y = y + lineHeight + spaceY; - nextX = x + item->sizeHint().width() + spaceX; - lineHeight = 0; - } - - if (!testOnly) - item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); - - x = nextX; - lineHeight = qMax(lineHeight, item->sizeHint().height()); - } - return y + lineHeight - rect.y() + bottom; -} -//! [11] -//! [12] -int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const -{ - QObject *parent = this->parent(); - if (!parent) { - return -1; - } else if (parent->isWidgetType()) { - QWidget *pw = static_cast(parent); - return pw->style()->pixelMetric(pm, 0, pw); - } else { - return static_cast(parent)->spacing(); - } -} -//! [12] From 5f592df6101e00d27c9f916272bc575cae1ed750 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 20 Jul 2015 15:14:07 -0700 Subject: [PATCH 579/582] don't seek in Packet before open --- libraries/networking/src/NLPacket.cpp | 8 +------- libraries/networking/src/udt/Packet.cpp | 13 ++++++------- libraries/networking/src/udt/Packet.h | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index c34e589eff..7a6503dbc3 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -64,13 +64,7 @@ std::unique_ptr NLPacket::fromReceivedPacket(std::unique_ptr dat } std::unique_ptr NLPacket::createCopy(const NLPacket& other) { - auto packet = std::unique_ptr(new NLPacket(other)); - - if (other.isOpen()) { - packet->open(other.openMode()); - } - - return packet; + return std::unique_ptr(new NLPacket(other)); } NLPacket::NLPacket(PacketType::Value type, qint64 size) : diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 5be229e129..02a44c4a4f 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -44,13 +44,7 @@ std::unique_ptr Packet::fromReceivedPacket(std::unique_ptr data, q } std::unique_ptr Packet::createCopy(const Packet& other) { - auto packet = std::unique_ptr(new Packet(other)); - - if (other.isOpen()) { - packet->open(other.openMode()); - } - - return packet; + return std::unique_ptr(new Packet(other)); } qint64 Packet::totalHeadersSize() const { @@ -104,6 +98,11 @@ Packet::Packet(const Packet& other) : QIODevice() { *this = other; + + if (other.isOpen()) { + this->open(other.openMode()); + } + this->seek(other.pos()); } diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 33fa8134bc..b4c53b8165 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -81,7 +81,7 @@ public: using QIODevice::read; QByteArray read(qint64 maxSize); - + template qint64 peekPrimitive(T* data); template qint64 readPrimitive(T* data); template qint64 writePrimitive(const T& data); From bca8d8181d635dde82f9215f1c52240313f30148 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 20 Jul 2015 15:14:16 -0700 Subject: [PATCH 580/582] fix entity data packet type value --- libraries/networking/src/udt/PacketHeaders.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index a66c9ea566..9c312bc36a 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -27,7 +27,7 @@ // NOTE: if you want the name of the packet packetType to be available for debugging or logging, update nameForPacketType() as well namespace PacketType { - enum Value { + enum Value { Unknown, StunResponse, DomainList, @@ -62,18 +62,18 @@ namespace PacketType { DomainConnectRequest, DomainServerRequireDTLS, NodeJsonStats, - EntityQuery, - EntityData, - EntityAdd, - EntityErase, - EntityEdit, OctreeDataNack, StopNode, AudioEnvironment, EntityEditNack, ICEServerHeartbeat, ICEPing, - ICEPingReply + ICEPingReply, + EntityData, + EntityQuery, + EntityAdd, + EntityErase, + EntityEdit }; }; From 74193b3dac35f08ee1e6e85178d79b07a3e18d00 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 20 Jul 2015 15:20:14 -0700 Subject: [PATCH 581/582] bump packet versions after fix --- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index eb8ca12b69..0591ac30fe 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -69,7 +69,7 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { case EntityData: return VERSION_ENTITIES_NEW_PROTOCOL_LAYER; default: - return 10; + return 11; } } diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 9c312bc36a..3f3f165e87 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -138,6 +138,6 @@ const PacketVersion VERSION_ENTITIES_FACE_CAMERA = 30; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP = 31; const PacketVersion VERSION_ENTITIES_SCRIPT_TIMESTAMP_FIX = 32; const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE = 33; -const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 34; +const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35; #endif // hifi_PacketHeaders_h From 9fb8b553596e0a2111d472d10631cd34161af6ed Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 20 Jul 2015 16:10:11 -0700 Subject: [PATCH 582/582] repairs to early return for sendNackPackets --- interface/src/Application.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ce156354fb..1b22f9c26c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2693,7 +2693,7 @@ int Application::sendNackPackets() { // if there are octree packets from this node that are waiting to be processed, // don't send a NACK since the missing packets may be among those waiting packets. if (_octreeProcessor.hasPacketsToProcessFrom(nodeUUID)) { - packetsSent = 0; + return; } _octreeSceneStatsLock.lockForRead(); @@ -2701,16 +2701,16 @@ int Application::sendNackPackets() { // retreive octree scene stats of this node if (_octreeServerSceneStats.find(nodeUUID) == _octreeServerSceneStats.end()) { _octreeSceneStatsLock.unlock(); - packetsSent = 0; + return; } - + // get sequence number stats of node, prune its missing set, and make a copy of the missing set SequenceNumberStats& sequenceNumberStats = _octreeServerSceneStats[nodeUUID].getIncomingOctreeSequenceNumberStats(); sequenceNumberStats.pruneMissingSet(); const QSet missingSequenceNumbers = sequenceNumberStats.getMissingSet(); - + _octreeSceneStatsLock.unlock(); - + // construct nack packet(s) for this node auto it = missingSequenceNumbers.constBegin(); while (it != missingSequenceNumbers.constEnd()) { @@ -2718,10 +2718,10 @@ int Application::sendNackPackets() { nackPacketList.writePrimitive(missingNumber); ++it; } - + if (nackPacketList.getNumPackets()) { packetsSent += nackPacketList.getNumPackets(); - + // send the packet list nodeList->sendPacketList(nackPacketList, *node); }