From 63d0205d1e9093d6f24b35b577337ea7fd6d8349 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 18 Aug 2015 23:11:33 -0700 Subject: [PATCH] Move domain settings retrieval to UDT --- domain-server/src/DomainServer.cpp | 3 ++ .../src/DomainServerSettingsManager.cpp | 18 ++++++++++ .../src/DomainServerSettingsManager.h | 6 ++++ libraries/networking/src/Assignment.h | 2 +- libraries/networking/src/DomainHandler.cpp | 35 ++++++++++++------- libraries/networking/src/DomainHandler.h | 3 ++ libraries/networking/src/NodeList.cpp | 1 + .../networking/src/udt/PacketHeaders.cpp | 1 + libraries/networking/src/udt/PacketHeaders.h | 4 ++- 9 files changed, 58 insertions(+), 15 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index f15de0c458..ddbef90ef6 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -289,6 +289,9 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); packetReceiver.registerListener(PacketType::ICEPingReply, this, "processICEPingReplyPacket"); packetReceiver.registerListener(PacketType::ICEServerPeerInformation, this, "processICEPeerInformationPacket"); + + // NodeList won't be available to the settings manager when it is created, so call registerListener here + packetReceiver.registerListener(PacketType::DomainSettingsRequest, &_settingsManager, "processSettingsRequestPacket"); // add whatever static assignments that have been parsed to the queue addStaticAssignmentsToQueue(); diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 5cd5b5ef35..c9b52a17bb 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "DomainServerSettingsManager.h" @@ -66,6 +67,23 @@ DomainServerSettingsManager::DomainServerSettingsManager() : QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection); } +void DomainServerSettingsManager::processSettingsRequestPacket(QSharedPointer packet) { + qDebug() << "Got request for domain settings"; + + Assignment::Type type; + packet->readPrimitive(&type); + + QJsonObject responseObject = responseObjectForType(QString::number(type)); + auto json = QJsonDocument(responseObject).toJson(); + + auto packetList = std::unique_ptr(new NLPacketList(PacketType::DomainSettings, QByteArray(), true, true)); + + packetList->write(json); + + auto nodeList = DependencyManager::get(); + nodeList->sendPacketList(std::move(packetList), packet->getSenderSockAddr()); +} + void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList) { _configMap.loadMasterAndUserConfig(argumentList); diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index 21bf099ef0..321f7b7214 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -18,6 +18,8 @@ #include #include +#include + const QString SETTINGS_PATHS_KEY = "paths"; const QString SETTINGS_PATH = "/settings"; @@ -38,6 +40,10 @@ public: QVariantMap& getUserSettingsMap() { return _configMap.getUserConfig(); } QVariantMap& getSettingsMap() { return _configMap.getMergedConfig(); } + +private slots: + void processSettingsRequestPacket(QSharedPointer packet); + private: QJsonObject responseObjectForType(const QString& typeValue, bool isAuthenticated = false); void recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, QVariantMap& settingsVariant); diff --git a/libraries/networking/src/Assignment.h b/libraries/networking/src/Assignment.h index 67f861f850..0fadc78770 100644 --- a/libraries/networking/src/Assignment.h +++ b/libraries/networking/src/Assignment.h @@ -25,7 +25,7 @@ class Assignment : public NodeData { Q_OBJECT public: - enum Type { + enum Type : uint8_t { AudioMixerType = 0, AvatarMixerType = 1, AgentType = 2, diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 6c6c258235..81b7ee6c55 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -17,7 +17,9 @@ #include "Assignment.h" #include "HifiSockAddr.h" #include "NodeList.h" +#include "udt/Packet.h" #include "udt/PacketHeaders.h" +#include "NLPacket.h" #include "SharedUtil.h" #include "UserActivityLogger.h" #include "NetworkLogging.h" @@ -39,7 +41,7 @@ DomainHandler::DomainHandler(QObject* parent) : _failedSettingsRequests(0) { _sockAddr.setObjectName("DomainServer"); - + // if we get a socket that make sure our NetworkPeer ping timer stops connect(this, &DomainHandler::completedSocketDiscovery, &_icePeer, &NetworkPeer::stopPingTimer); } @@ -233,21 +235,15 @@ void DomainHandler::requestDomainSettings() { emit settingsReceived(_settingsObject); } else { if (_settingsObject.isEmpty()) { - // setup the URL required to grab settings JSON - QUrl settingsJSONURL; - settingsJSONURL.setScheme("http"); - settingsJSONURL.setHost(_hostname); - settingsJSONURL.setPort(DOMAIN_SERVER_HTTP_PORT); - settingsJSONURL.setPath("/settings.json"); + qCDebug(networking) << "Requesting settings from domain server"; + Assignment::Type assignmentType = Assignment::typeForNodeType(DependencyManager::get()->getOwnerType()); - settingsJSONURL.setQuery(QString("type=%1").arg(assignmentType)); - qCDebug(networking) << "Requesting domain-server settings at" << settingsJSONURL.toString(); + auto packet = NLPacket::create(PacketType::DomainSettingsRequest, sizeof(assignmentType), true, false); + packet->writePrimitive(assignmentType); - QNetworkRequest settingsRequest(settingsJSONURL); - settingsRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); - QNetworkReply* reply = NetworkAccessManager::getInstance().get(settingsRequest); - connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished); + auto nodeList = DependencyManager::get(); + nodeList->sendPacket(std::move(packet), _sockAddr); } } } @@ -286,6 +282,19 @@ void DomainHandler::settingsRequestFinished() { settingsReply->deleteLater(); } +void DomainHandler::processSettingsPacketList(QSharedPointer packetList) { + auto data = packetList->getAllData(); + + _settingsObject = QJsonDocument::fromJson(data).object(); + + qCDebug(networking) << "Received domain settings: \n" << QString(data); + + // reset failed settings requests to 0, we got them + _failedSettingsRequests = 0; + + emit settingsReceived(_settingsObject); +} + void DomainHandler::processICEPingReplyPacket(QSharedPointer packet) { const HifiSockAddr& senderSockAddr = packet->getSenderSockAddr(); qCDebug(networking) << "Received reply from domain-server on" << senderSockAddr; diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 7bb0582914..349b3934eb 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -22,6 +22,8 @@ #include "HifiSockAddr.h" #include "NetworkPeer.h" #include "NLPacket.h" +#include "NLPacketList.h" +#include "Node.h" const unsigned short DEFAULT_DOMAIN_SERVER_PORT = 40102; const unsigned short DEFAULT_DOMAIN_SERVER_DTLS_PORT = 40103; @@ -85,6 +87,7 @@ public slots: void setHostnameAndPort(const QString& hostname, quint16 port = DEFAULT_DOMAIN_SERVER_PORT); void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id); + void processSettingsPacketList(QSharedPointer packetList); void processICEPingReplyPacket(QSharedPointer packet); void processDTLSRequirementPacket(QSharedPointer dtlsRequirementPacket); void processICEResponsePacket(QSharedPointer icePacket); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index ab69d11bc3..000180cec7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -95,6 +95,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned packetReceiver.registerListener(PacketType::ICEPing, this, "processICEPingPacket"); packetReceiver.registerListener(PacketType::DomainServerAddedNode, this, "processDomainServerAddedNode"); packetReceiver.registerListener(PacketType::DomainServerConnectionToken, this, "processDomainServerConnectionTokenPacket"); + packetReceiver.registerMessageListener(PacketType::DomainSettings, &_domainHandler, "processSettingsPacketList"); packetReceiver.registerListener(PacketType::ICEServerPeerInformation, &_domainHandler, "processICEResponsePacket"); packetReceiver.registerListener(PacketType::DomainServerRequireDTLS, &_domainHandler, "processDTLSRequirementPacket"); packetReceiver.registerListener(PacketType::ICEPingReply, &_domainHandler, "processICEPingReplyPacket"); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 1c2a38a2a6..819a65dc26 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -26,6 +26,7 @@ const QSet NON_SOURCED_PACKETS = QSet() << PacketType::DomainList << PacketType::DomainConnectionDenied << PacketType::DomainServerPathQuery << PacketType::DomainServerPathResponse << PacketType::DomainServerAddedNode + << PacketType::DomainSettingsRequest << PacketType::DomainSettings << PacketType::ICEServerPeerInformation << PacketType::ICEServerQuery << PacketType::ICEServerHeartbeat << PacketType::ICEPing << PacketType::ICEPingReply << PacketType::AssignmentClientStatus << PacketType::StopNode; diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 58e0832800..35898a21f5 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -71,7 +71,9 @@ enum class PacketType : uint8_t { EntityAdd, EntityErase, EntityEdit, - DomainServerConnectionToken + DomainServerConnectionToken, + DomainSettingsRequest, + DomainSettings }; const int NUM_BYTES_MD5_HASH = 16;