From f89b225da2d8c11017ec405d72328813224723ce Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 09:17:25 -0700 Subject: [PATCH 01/21] handle local socket changes by monitoring every so often --- assignment-client/src/octree/OctreeServer.cpp | 2 +- interface/src/FileLogger.cpp | 2 +- libraries/networking/src/HifiSockAddr.cpp | 41 +++++++++---------- libraries/networking/src/HifiSockAddr.h | 2 +- libraries/networking/src/LimitedNodeList.cpp | 29 ++++++++++++- libraries/networking/src/LimitedNodeList.h | 5 +++ libraries/networking/src/NodeList.cpp | 4 +- 7 files changed, 56 insertions(+), 29 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 5833d8a764..42af8ff1b9 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -940,7 +940,7 @@ void OctreeServer::run() { qDebug("--statusHost=%s", statusHost); _statusHost = statusHost; } else { - _statusHost = QHostAddress(getHostOrderLocalAddress()).toString(); + _statusHost = getLocalAddress().toString(); } qDebug("statusHost=%s", qPrintable(_statusHost)); diff --git a/interface/src/FileLogger.cpp b/interface/src/FileLogger.cpp index cb3d43925d..4808842036 100644 --- a/interface/src/FileLogger.cpp +++ b/interface/src/FileLogger.cpp @@ -28,7 +28,7 @@ FileLogger::FileLogger(QObject* parent) : setExtraDebugging(false); _fileName = FileUtils::standardPath(LOGS_DIRECTORY); - QHostAddress clientAddress = QHostAddress(getHostOrderLocalAddress()); + QHostAddress clientAddress = getLocalAddress(); QDateTime now = QDateTime::currentDateTime(); _fileName.append(QString(FILENAME_FORMAT).arg(clientAddress.toString(), now.toString(DATETIME_FORMAT))); } diff --git a/libraries/networking/src/HifiSockAddr.cpp b/libraries/networking/src/HifiSockAddr.cpp index d30f7944d7..97e9721356 100644 --- a/libraries/networking/src/HifiSockAddr.cpp +++ b/libraries/networking/src/HifiSockAddr.cpp @@ -90,32 +90,29 @@ QDataStream& operator>>(QDataStream& dataStream, HifiSockAddr& sockAddr) { return dataStream; } -quint32 getHostOrderLocalAddress() { +QHostAddress getLocalAddress() { - static int localAddress = 0; + QHostAddress localAddress; - if (localAddress == 0) { - foreach(const QNetworkInterface &networkInterface, QNetworkInterface::allInterfaces()) { - if (networkInterface.flags() & QNetworkInterface::IsUp - && networkInterface.flags() & QNetworkInterface::IsRunning - && networkInterface.flags() & ~QNetworkInterface::IsLoopBack) { - // we've decided that this is the active NIC - // enumerate it's addresses to grab the IPv4 address - foreach(const QNetworkAddressEntry &entry, networkInterface.addressEntries()) { - // make sure it's an IPv4 address that isn't the loopback - if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && !entry.ip().isLoopback()) { - qDebug("Node's local address is %s", entry.ip().toString().toLocal8Bit().constData()); - - // set our localAddress and break out - localAddress = entry.ip().toIPv4Address(); - break; - } + foreach(const QNetworkInterface &networkInterface, QNetworkInterface::allInterfaces()) { + if (networkInterface.flags() & QNetworkInterface::IsUp + && networkInterface.flags() & QNetworkInterface::IsRunning + && networkInterface.flags() & ~QNetworkInterface::IsLoopBack) { + // we've decided that this is the active NIC + // enumerate it's addresses to grab the IPv4 address + foreach(const QNetworkAddressEntry &entry, networkInterface.addressEntries()) { + // make sure it's an IPv4 address that isn't the loopback + if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol && !entry.ip().isLoopback()) { + + // set our localAddress and break out + localAddress = entry.ip(); + break; } } - - if (localAddress != 0) { - break; - } + } + + if (!localAddress.isNull()) { + break; } } diff --git a/libraries/networking/src/HifiSockAddr.h b/libraries/networking/src/HifiSockAddr.h index 8a591a60b8..42f815390a 100644 --- a/libraries/networking/src/HifiSockAddr.h +++ b/libraries/networking/src/HifiSockAddr.h @@ -58,7 +58,7 @@ private: uint qHash(const HifiSockAddr& key, uint seed); -quint32 getHostOrderLocalAddress(); +QHostAddress getLocalAddress(); Q_DECLARE_METATYPE(HifiSockAddr) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 507788009a..a428f1f495 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -70,6 +70,7 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short _nodeHashMutex(QMutex::Recursive), _nodeSocket(this), _dtlsSocket(NULL), + _localSockAddr(), _publicSockAddr(), _numCollectedPackets(0), _numCollectedBytes(0), @@ -89,6 +90,15 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short const int LARGER_BUFFER_SIZE = 1048576; changeSocketBufferSizes(LARGER_BUFFER_SIZE); + // check for local socket updates every so often + const int LOCAL_SOCKET_UPDATE_INTERVAL_MSECS = 5 * 1000; + QTimer* localSocketUpdate = new QTimer(this); + connect(localSocketUpdate, &QTimer::timeout, this, &LimitedNodeList::updateLocalSockAddr); + localSocketUpdate->start(LOCAL_SOCKET_UPDATE_INTERVAL_MSECS); + + // check the local socket right now + updateLocalSockAddr(); + _packetStatTimer.start(); } @@ -652,6 +662,23 @@ bool LimitedNodeList::processSTUNResponse(const QByteArray& packet) { return false; } +void LimitedNodeList::updateLocalSockAddr() { + HifiSockAddr newSockAddr(getLocalAddress(), _nodeSocket.localPort()); + if (newSockAddr != _localSockAddr) { + + if (_localSockAddr.isNull()) { + qDebug() << "Local socket is" << newSockAddr; + } else { + qDebug() << "Local socket has changed from" << _localSockAddr << "to" << newSockAddr; + } + + + _localSockAddr = newSockAddr; + + emit localSockAddrChanged(_localSockAddr); + } +} + void LimitedNodeList::sendHeartbeatToIceServer(const HifiSockAddr& iceServerSockAddr, QUuid headerID, const QUuid& connectionRequestID) { @@ -662,7 +689,7 @@ void LimitedNodeList::sendHeartbeatToIceServer(const HifiSockAddr& iceServerSock QByteArray iceRequestByteArray = byteArrayWithPopulatedHeader(PacketTypeIceServerHeartbeat, headerID); QDataStream iceDataStream(&iceRequestByteArray, QIODevice::Append); - iceDataStream << _publicSockAddr << HifiSockAddr(QHostAddress(getHostOrderLocalAddress()), _nodeSocket.localPort()); + iceDataStream << _publicSockAddr << _localSockAddr; if (!connectionRequestID.isNull()) { iceDataStream << connectionRequestID; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index a7ffc7ec28..1b30375fad 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -127,11 +127,15 @@ public slots: void removeSilentNodes(); + void updateLocalSockAddr(); + void killNodeWithUUID(const QUuid& nodeUUID); signals: void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID); void nodeAdded(SharedNodePointer); void nodeKilled(SharedNodePointer); + + void localSockAddrChanged(const HifiSockAddr& localSockAddr); void publicSockAddrChanged(const HifiSockAddr& publicSockAddr); protected: static std::auto_ptr _sharedInstance; @@ -153,6 +157,7 @@ protected: QMutex _nodeHashMutex; QUdpSocket _nodeSocket; QUdpSocket* _dtlsSocket; + HifiSockAddr _localSockAddr; HifiSockAddr _publicSockAddr; int _numCollectedPackets; int _numCollectedBytes; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 905fc06eeb..cac4071fb2 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -302,9 +302,7 @@ void NodeList::sendDomainServerCheckIn() { QDataStream packetStream(&domainServerPacket, QIODevice::Append); // pack our data to send to the domain-server - packetStream << _ownerType << _publicSockAddr - << HifiSockAddr(QHostAddress(getHostOrderLocalAddress()), _nodeSocket.localPort()) - << (quint8) _nodeTypesOfInterest.size(); + packetStream << _ownerType << _publicSockAddr << _localSockAddr << (quint8) _nodeTypesOfInterest.size(); // copy over the bytes for node types of interest, if required foreach (NodeType_t nodeTypeOfInterest, _nodeTypesOfInterest) { From b61e659382001fa474b9c1efd88b1a4c66fc147e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 09:18:50 -0700 Subject: [PATCH 02/21] send an ICE heartbeat anytime the domain-server local socket changes --- domain-server/src/DomainServer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 61310cad75..cceb55ab62 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -357,7 +357,8 @@ void DomainServer::setupAutomaticNetworking() { connect(iceHeartbeatTimer, &QTimer::timeout, this, &DomainServer::performICEUpdates); iceHeartbeatTimer->start(ICE_HEARBEAT_INTERVAL_MSECS); - // call our sendHeartbeaToIceServer immediately anytime a public address changes + // call our sendHeartbeaToIceServer immediately anytime a local or public socket changes + connect(nodeList, &LimitedNodeList::localSockAddrChanged, this &DomainServer::sendHearbeatToIceServer); connect(nodeList, &LimitedNodeList::publicSockAddrChanged, this, &DomainServer::sendHearbeatToIceServer); // tell the data server which type of automatic networking we are using From 0459254e3f705f1449b1e90a4c142411e879c2bc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 09:24:48 -0700 Subject: [PATCH 03/21] fix connection to slot for local addr update, refresh AcctManager after restart --- domain-server/src/DomainServer.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index cceb55ab62..232348e05a 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -57,6 +57,11 @@ DomainServer::DomainServer(int argc, char* argv[]) : setApplicationName("domain-server"); QSettings::setDefaultFormat(QSettings::IniFormat); + + // make sure we have a fresh AccountManager instance + // (need this since domain-server can restart itself and maintain static variables) + AccountManager::getInstance(true); + _settingsManager.setupConfigMap(arguments()); installNativeEventFilter(&_shutdownEventListener); @@ -82,10 +87,6 @@ DomainServer::DomainServer(int argc, char* argv[]) : void DomainServer::restart() { qDebug() << "domain-server is restarting."; - // make sure all static instances are reset - LimitedNodeList::getInstance()->reset(); - AccountManager::getInstance(true); - exit(DomainServer::EXIT_CODE_REBOOT); } @@ -358,7 +359,7 @@ void DomainServer::setupAutomaticNetworking() { iceHeartbeatTimer->start(ICE_HEARBEAT_INTERVAL_MSECS); // call our sendHeartbeaToIceServer immediately anytime a local or public socket changes - connect(nodeList, &LimitedNodeList::localSockAddrChanged, this &DomainServer::sendHearbeatToIceServer); + connect(nodeList, &LimitedNodeList::localSockAddrChanged, this, &DomainServer::sendHearbeatToIceServer); connect(nodeList, &LimitedNodeList::publicSockAddrChanged, this, &DomainServer::sendHearbeatToIceServer); // tell the data server which type of automatic networking we are using From 89cc7c7b0d4593c13715b15b8a5e22e6c1f4d7a8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 09:35:44 -0700 Subject: [PATCH 04/21] add an optional forced reset of NetworkAccessManager --- domain-server/src/DomainServer.cpp | 2 ++ libraries/networking/src/NetworkAccessManager.cpp | 5 +++-- libraries/networking/src/NetworkAccessManager.h | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 232348e05a..5a8f8fb40e 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -57,6 +57,8 @@ DomainServer::DomainServer(int argc, char* argv[]) : setApplicationName("domain-server"); QSettings::setDefaultFormat(QSettings::IniFormat); + // force a refresh of the NetworkAccessManager instance for this thread + NetworkAccessManager::getInstance(true); // make sure we have a fresh AccountManager instance // (need this since domain-server can restart itself and maintain static variables) diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index e92760d303..6e2580f51e 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -15,8 +15,8 @@ QThreadStorage networkAccessManagers; -NetworkAccessManager& NetworkAccessManager::getInstance() { - if (!networkAccessManagers.hasLocalData()) { +NetworkAccessManager& NetworkAccessManager::getInstance(bool forceReset) { + if (!networkAccessManagers.hasLocalData() || forceReset) { networkAccessManagers.setLocalData(new NetworkAccessManager()); } @@ -24,4 +24,5 @@ NetworkAccessManager& NetworkAccessManager::getInstance() { } NetworkAccessManager::NetworkAccessManager() { + } diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index 9594170518..6636a0eae6 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -18,7 +18,7 @@ class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: - static NetworkAccessManager& getInstance(); + static NetworkAccessManager& getInstance(bool forceReset = false); private: NetworkAccessManager(); From a441c5fb166ed3902dd17080b073204a9db59d83 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 09:42:47 -0700 Subject: [PATCH 05/21] don't use an unecessary subclass of QNetworkAccessManager --- libraries/networking/src/NetworkAccessManager.cpp | 10 +++------- libraries/networking/src/NetworkAccessManager.h | 7 ++----- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index 6e2580f51e..161170a87d 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -13,16 +13,12 @@ #include "NetworkAccessManager.h" -QThreadStorage networkAccessManagers; +QThreadStorage networkAccessManagers; -NetworkAccessManager& NetworkAccessManager::getInstance(bool forceReset) { +QNetworkAccessManager& NetworkAccessManager::getInstance(bool forceReset) { if (!networkAccessManagers.hasLocalData() || forceReset) { - networkAccessManagers.setLocalData(new NetworkAccessManager()); + networkAccessManagers.setLocalData(new QNetworkAccessManager()); } return *networkAccessManagers.localData(); } - -NetworkAccessManager::NetworkAccessManager() { - -} diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index 6636a0eae6..3a236f7041 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -15,13 +15,10 @@ #include /// Wrapper around QNetworkAccessManager to restrict at one instance by thread -class NetworkAccessManager : public QNetworkAccessManager { +class NetworkAccessManager : public QObject { Q_OBJECT public: - static NetworkAccessManager& getInstance(bool forceReset = false); - -private: - NetworkAccessManager(); + static QNetworkAccessManager& getInstance(bool forceReset = false); }; #endif // hifi_NetworkAccessManager_h \ No newline at end of file From 78f8aba504b9f9eca90509a75a604c4897c32c0f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 09:44:47 -0700 Subject: [PATCH 06/21] fix for NetworkAccessManager getInstance return --- libraries/networking/src/AccountManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 7d924d02de..bb471442ea 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -187,7 +187,7 @@ void AccountManager::invokedRequest(const QString& path, const JSONCallbackParameters& callbackParams, const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart) { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest; @@ -359,7 +359,7 @@ void AccountManager::setAccessTokenForCurrentAuthURL(const QString& accessToken) void AccountManager::requestAccessToken(const QString& login, const QString& password) { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request; @@ -431,7 +431,7 @@ void AccountManager::requestAccessTokenError(QNetworkReply::NetworkError error) } void AccountManager::requestProfile() { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QUrl profileURL = _authURL; profileURL.setPath("/api/v1/users/profile"); From 484c0d30cb92d9794d9bac6837fe2d33b52a8282 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 09:54:52 -0700 Subject: [PATCH 07/21] don't require refresh of NetworkAccessManager, should handle restarts --- domain-server/src/DomainServer.cpp | 3 --- libraries/networking/src/NetworkAccessManager.cpp | 6 +++--- libraries/networking/src/NetworkAccessManager.h | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 5a8f8fb40e..7352729fa4 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -57,9 +57,6 @@ DomainServer::DomainServer(int argc, char* argv[]) : setApplicationName("domain-server"); QSettings::setDefaultFormat(QSettings::IniFormat); - // force a refresh of the NetworkAccessManager instance for this thread - NetworkAccessManager::getInstance(true); - // make sure we have a fresh AccountManager instance // (need this since domain-server can restart itself and maintain static variables) AccountManager::getInstance(true); diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index 161170a87d..841b7491c7 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -15,9 +15,9 @@ QThreadStorage networkAccessManagers; -QNetworkAccessManager& NetworkAccessManager::getInstance(bool forceReset) { - if (!networkAccessManagers.hasLocalData() || forceReset) { - networkAccessManagers.setLocalData(new QNetworkAccessManager()); +QNetworkAccessManager& NetworkAccessManager::getInstance() { + if (!networkAccessManagers.hasLocalData()) { + networkAccessManagers.setLocalData(new QNetworkAccessManager()); } return *networkAccessManagers.localData(); diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index 3a236f7041..d911d935dc 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -18,7 +18,7 @@ class NetworkAccessManager : public QObject { Q_OBJECT public: - static QNetworkAccessManager& getInstance(bool forceReset = false); + static QNetworkAccessManager& getInstance(); }; #endif // hifi_NetworkAccessManager_h \ No newline at end of file From 253fe53571d67df7fd00b208c7c02528a47dd14c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 10:40:56 -0700 Subject: [PATCH 08/21] cleanup a couple of debug lines --- domain-server/src/DomainServer.cpp | 1 + libraries/networking/src/DomainHandler.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 7352729fa4..b95756f5f0 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -957,6 +957,7 @@ void DomainServer::transactionJSONCallback(const QJsonObject& data) { } void DomainServer::requestCurrentPublicSocketViaSTUN() { + qDebug() << "Sending STUN request to retrieve public socket information."; LimitedNodeList::getInstance()->sendSTUNRequest(); } diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 5714e6923d..760c9f4c04 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -90,7 +90,7 @@ void DomainHandler::setSockAddr(const HifiSockAddr& sockAddr, const QString& hos void DomainHandler::setUUID(const QUuid& uuid) { if (uuid != _uuid) { _uuid = uuid; - qDebug() << "Domain uuid changed to" << uuidStringWithoutCurlyBraces(_uuid); + qDebug() << "Domain ID changed to" << uuidStringWithoutCurlyBraces(_uuid); } } From 319cf34b837e9fc88202ed1be5387e7faa9bdcb1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 12:23:49 -0700 Subject: [PATCH 09/21] use an ephemeral port when using auto-networking for domain-server --- domain-server/src/DomainServer.cpp | 18 +++++++++++------- libraries/networking/src/LimitedNodeList.cpp | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index b95756f5f0..ce2a3b0052 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -189,6 +189,11 @@ bool DomainServer::optionallySetupOAuth() { const QString DOMAIN_CONFIG_ID_KEY = "id"; +const QString METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH = "metaverse.automatic_networking"; +const QString FULL_AUTOMATIC_NETWORKING_VALUE = "full"; +const QString IP_ONLY_AUTOMATIC_NETWORKING_VALUE = "ip"; +const QString DISABLED_AUTOMATIC_NETWORKING_VALUE = "disabled"; + void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { const QString CUSTOM_PORT_OPTION = "port"; @@ -196,7 +201,12 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { QVariantMap& settingsMap = _settingsManager.getSettingsMap(); - if (settingsMap.contains(CUSTOM_PORT_OPTION)) { + QVariant autoNetworkingValue = _settingsManager.valueOrDefaultValueForKeyPath(METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH); + + if (!autoNetworkingValue.isNull() && autoNetworkingValue.toString() == FULL_AUTOMATIC_NETWORKING_VALUE) { + // when using full networking use an ephemeral port + domainServerPort = 0; + } else if (settingsMap.contains(CUSTOM_PORT_OPTION)) { domainServerPort = (unsigned short) settingsMap.value(CUSTOM_PORT_OPTION).toUInt(); } @@ -310,12 +320,7 @@ bool DomainServer::optionallySetupAssignmentPayment() { return true; } -const QString FULL_AUTOMATIC_NETWORKING_VALUE = "full"; -const QString IP_ONLY_AUTOMATIC_NETWORKING_VALUE = "ip"; -const QString DISABLED_AUTOMATIC_NETWORKING_VALUE = "disabled"; - void DomainServer::setupAutomaticNetworking() { - const QString METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH = "metaverse.automatic_networking"; if (!didSetupAccountManagerWithAccessToken()) { qDebug() << "Cannot setup domain-server automatic networking without an access token."; @@ -957,7 +962,6 @@ void DomainServer::transactionJSONCallback(const QJsonObject& data) { } void DomainServer::requestCurrentPublicSocketViaSTUN() { - qDebug() << "Sending STUN request to retrieve public socket information."; LimitedNodeList::getInstance()->sendSTUNRequest(); } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a428f1f495..d7c8f4bd12 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -580,7 +580,7 @@ void LimitedNodeList::sendSTUNRequest() { memcpy(stunRequestPacket + packetIndex, randomUUID.toRfc4122().data(), NUM_TRANSACTION_ID_BYTES); // lookup the IP for the STUN server - static HifiSockAddr stunSockAddr(STUN_SERVER_HOSTNAME, STUN_SERVER_PORT); + HifiSockAddr stunSockAddr(STUN_SERVER_HOSTNAME, STUN_SERVER_PORT); _nodeSocket.writeDatagram((char*) stunRequestPacket, sizeof(stunRequestPacket), stunSockAddr.getAddress(), stunSockAddr.getPort()); From 3cd71a33c921c8d409ad7dfcd4fb1e2511460d09 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 12:28:44 -0700 Subject: [PATCH 10/21] disable ephemeral port for DS until ACs can discover --- domain-server/src/DomainServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index ce2a3b0052..6b2faffe01 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -204,8 +204,8 @@ void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { QVariant autoNetworkingValue = _settingsManager.valueOrDefaultValueForKeyPath(METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH); if (!autoNetworkingValue.isNull() && autoNetworkingValue.toString() == FULL_AUTOMATIC_NETWORKING_VALUE) { - // when using full networking use an ephemeral port - domainServerPort = 0; + // when using full networking use an ephemeral port - disabled until nodes can find us this way + // domainServerPort = 0; } else if (settingsMap.contains(CUSTOM_PORT_OPTION)) { domainServerPort = (unsigned short) settingsMap.value(CUSTOM_PORT_OPTION).toUInt(); } From 12deec928c002c5ec01af00ff65b7de5390fb5b9 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 6 Oct 2014 14:15:22 -0700 Subject: [PATCH 11/21] add tick marks to planar ellipse/circle overlays --- examples/libraries/entitySelectionTool.js | 23 +++- interface/src/ui/overlays/Circle3DOverlay.cpp | 118 +++++++++++++++++- interface/src/ui/overlays/Circle3DOverlay.h | 21 ++++ 3 files changed, 157 insertions(+), 5 deletions(-) diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index e07fb752e5..d9cf2c54fd 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -169,7 +169,14 @@ SelectionDisplay = (function () { alpha: 0.2, solid: true, visible: false, - rotation: yawOverlayRotation + rotation: yawOverlayRotation, + hasTickMarks: true, + majorTickMarksAngle: 12.5, + minorTickMarksAngle: 0, + majorTickMarksLength: -0.25, + minorTickMarksLength: 0, + majorTickMarksColor: { red: 0, green: 0, blue: 0 }, + minorTickMarksColor: { red: 0, green: 0, blue: 0 }, }); var rotateOverlayOuter = Overlays.addOverlay("circle3d", { @@ -179,7 +186,15 @@ SelectionDisplay = (function () { alpha: 0.2, solid: true, visible: false, - rotation: yawOverlayRotation + rotation: yawOverlayRotation, + + hasTickMarks: true, + majorTickMarksAngle: 45.0, + minorTickMarksAngle: 5, + majorTickMarksLength: 0.25, + minorTickMarksLength: 0.1, + majorTickMarksColor: { red: 0, green: 0, blue: 0 }, + minorTickMarksColor: { red: 0, green: 0, blue: 0 }, }); var rotateOverlayCurrent = Overlays.addOverlay("circle3d", { @@ -571,7 +586,7 @@ SelectionDisplay = (function () { innerRadius: 0.9, startAt: 0, endAt: 360, - alpha: outerAlpha + alpha: outerAlpha, }); Overlays.editOverlay(rotateOverlayCurrent, @@ -584,7 +599,7 @@ SelectionDisplay = (function () { size: outerRadius, startAt: 0, endAt: 0, - innerRadius: 0.9 + innerRadius: 0.9, }); // TODO: we have not implemented the rotating handle/controls yet... so for now, these handles are hidden diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index cecec29130..6ff256d48e 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -21,8 +21,15 @@ Circle3DOverlay::Circle3DOverlay() : _startAt(0.0f), _endAt(360.0f), _outerRadius(1.0f), - _innerRadius(0.0f) + _innerRadius(0.0f), + _hasTickMarks(false), + _majorTickMarksAngle(0.0f), + _minorTickMarksAngle(0.0f), + _majorTickMarksLength(0.0f), + _minorTickMarksLength(0.0f) { + _majorTickMarksColor.red = _majorTickMarksColor.green = _majorTickMarksColor.blue = (unsigned char)0; + _minorTickMarksColor.red = _minorTickMarksColor.green = _minorTickMarksColor.blue = (unsigned char)0; } Circle3DOverlay::~Circle3DOverlay() { @@ -142,6 +149,66 @@ void Circle3DOverlay::render() { glVertex2f(lastOuterPoint.x, lastOuterPoint.y); glEnd(); } + + // draw our tick marks + // for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise + // we just draw a line... + if (getHasTickMarks()) { + glBegin(GL_LINES); + + // draw our major tick marks + if (getMajorTickMarksAngle() > 0.0f && getMajorTickMarksLength() != 0.0f) { + + xColor color = getMajorTickMarksColor(); + glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + + float angle = startAt; + float angleInRadians = glm::radians(angle); + float tickMarkLength = getMajorTickMarksLength(); + float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius; + float endRadius = startRadius + tickMarkLength; + + while (angle <= endAt) { + angleInRadians = glm::radians(angle); + + glm::vec2 thisPointA(cos(angleInRadians) * startRadius, sin(angleInRadians) * startRadius); + glm::vec2 thisPointB(cos(angleInRadians) * endRadius, sin(angleInRadians) * endRadius); + + glVertex2f(thisPointA.x, thisPointA.y); + glVertex2f(thisPointB.x, thisPointB.y); + + angle += getMajorTickMarksAngle(); + } + } + + // draw our minor tick marks + if (getMinorTickMarksAngle() > 0.0f && getMinorTickMarksLength() != 0.0f) { + + xColor color = getMinorTickMarksColor(); + glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + + float angle = startAt; + float angleInRadians = glm::radians(angle); + float tickMarkLength = getMinorTickMarksLength(); + float startRadius = (tickMarkLength > 0.0f) ? innerRadius : outerRadius; + float endRadius = startRadius + tickMarkLength; + + while (angle <= endAt) { + angleInRadians = glm::radians(angle); + + glm::vec2 thisPointA(cos(angleInRadians) * startRadius, sin(angleInRadians) * startRadius); + glm::vec2 thisPointB(cos(angleInRadians) * endRadius, sin(angleInRadians) * endRadius); + + glVertex2f(thisPointA.x, thisPointA.y); + glVertex2f(thisPointB.x, thisPointB.y); + + angle += getMinorTickMarksAngle(); + } + } + + glEnd(); + } + glPopMatrix(); glPopMatrix(); @@ -173,6 +240,55 @@ void Circle3DOverlay::setProperties(const QScriptValue &properties) { if (innerRadius.isValid()) { setInnerRadius(innerRadius.toVariant().toFloat()); } + + QScriptValue hasTickMarks = properties.property("hasTickMarks"); + if (hasTickMarks.isValid()) { + setHasTickMarks(hasTickMarks.toVariant().toBool()); + } + + QScriptValue majorTickMarksAngle = properties.property("majorTickMarksAngle"); + if (majorTickMarksAngle.isValid()) { + setMajorTickMarksAngle(majorTickMarksAngle.toVariant().toFloat()); + } + + QScriptValue minorTickMarksAngle = properties.property("minorTickMarksAngle"); + if (minorTickMarksAngle.isValid()) { + setMinorTickMarksAngle(minorTickMarksAngle.toVariant().toFloat()); + } + + QScriptValue majorTickMarksLength = properties.property("majorTickMarksLength"); + if (majorTickMarksLength.isValid()) { + setMajorTickMarksLength(majorTickMarksLength.toVariant().toFloat()); + } + + QScriptValue minorTickMarksLength = properties.property("minorTickMarksLength"); + if (minorTickMarksLength.isValid()) { + setMinorTickMarksLength(minorTickMarksLength.toVariant().toFloat()); + } + + QScriptValue majorTickMarksColor = properties.property("majorTickMarksColor"); + if (majorTickMarksColor.isValid()) { + QScriptValue red = majorTickMarksColor.property("red"); + QScriptValue green = majorTickMarksColor.property("green"); + QScriptValue blue = majorTickMarksColor.property("blue"); + if (red.isValid() && green.isValid() && blue.isValid()) { + _majorTickMarksColor.red = red.toVariant().toInt(); + _majorTickMarksColor.green = green.toVariant().toInt(); + _majorTickMarksColor.blue = blue.toVariant().toInt(); + } + } + + QScriptValue minorTickMarksColor = properties.property("minorTickMarksColor"); + if (minorTickMarksColor.isValid()) { + QScriptValue red = minorTickMarksColor.property("red"); + QScriptValue green = minorTickMarksColor.property("green"); + QScriptValue blue = minorTickMarksColor.property("blue"); + if (red.isValid() && green.isValid() && blue.isValid()) { + _minorTickMarksColor.red = red.toVariant().toInt(); + _minorTickMarksColor.green = green.toVariant().toInt(); + _minorTickMarksColor.blue = blue.toVariant().toInt(); + } + } } diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index cea9db0384..791d951105 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -26,17 +26,38 @@ public: float getEndAt() const { return _endAt; } float getOuterRadius() const { return _outerRadius; } float getInnerRadius() const { return _innerRadius; } + bool getHasTickMarks() const { return _hasTickMarks; } + float getMajorTickMarksAngle() const { return _majorTickMarksAngle; } + float getMinorTickMarksAngle() const { return _minorTickMarksAngle; } + float getMajorTickMarksLength() const { return _majorTickMarksLength; } + float getMinorTickMarksLength() const { return _minorTickMarksLength; } + xColor getMajorTickMarksColor() const { return _majorTickMarksColor; } + xColor getMinorTickMarksColor() const { return _minorTickMarksColor; } void setStartAt(float value) { _startAt = value; } void setEndAt(float value) { _endAt = value; } void setOuterRadius(float value) { _outerRadius = value; } void setInnerRadius(float value) { _innerRadius = value; } + void setHasTickMarks(bool value) { _hasTickMarks = value; } + void setMajorTickMarksAngle(float value) { _majorTickMarksAngle = value; } + void setMinorTickMarksAngle(float value) { _minorTickMarksAngle = value; } + void setMajorTickMarksLength(float value) { _majorTickMarksLength = value; } + void setMinorTickMarksLength(float value) { _minorTickMarksLength = value; } + void setMajorTickMarksColor(const xColor& value) { _majorTickMarksColor = value; } + void setMinorTickMarksColor(const xColor& value) { _minorTickMarksColor = value; } protected: float _startAt; float _endAt; float _outerRadius; float _innerRadius; + bool _hasTickMarks; + float _majorTickMarksAngle; + float _minorTickMarksAngle; + float _majorTickMarksLength; + float _minorTickMarksLength; + xColor _majorTickMarksColor; + xColor _minorTickMarksColor; }; From 14cd04435905630b41d51d66b02d9b000ec9bfcf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 14:41:16 -0700 Subject: [PATCH 12/21] handle custom local UDP port for domain-server from webpage --- domain-server/resources/describe-settings.json | 8 ++++++++ domain-server/resources/web/js/settings.js | 5 +++++ domain-server/src/DomainServerSettingsManager.cpp | 3 +++ 3 files changed, 16 insertions(+) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 2fbe33a4e1..cadbc4d2c8 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -33,6 +33,14 @@ "label": "None: use the network information I have entered for this domain at data.highfidelity.io" } ] + }, + { + "name": "port", + "label": "Local UDP Port", + "help": "This is the local port your domain-server binds to for UDP connections.
Depending on your router, this may need to be changed to run multiple full automatic networking domain-servers in the same network.", + "default": "40102", + "type": "int", + "advanced": true } ] }, diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index 48b3b15e8f..5c3dfdd6dd 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -46,6 +46,11 @@ var viewHelpers = { form_group += "" } else { + + if (input_type == 'integer') { + input_type = "text" + } + form_group += "" diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 28b1151f2d..7c92f1cc51 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -254,11 +254,14 @@ void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ QString settingType = groupObject[SETTING_DESCRIPTION_TYPE_KEY].toString(); const QString INPUT_DOUBLE_TYPE = "double"; + const QString INPUT_INTEGER_TYPE = "int"; // make sure the resulting json value has the right type if (settingType == INPUT_DOUBLE_TYPE) { settingsVariant[key] = rootValue.toString().toDouble(); + } else if (settingType == INPUT_INTEGER_TYPE) { + settingsVariant[key] = rootValue.toString().toInt(); } else { settingsVariant[key] = rootValue.toString(); } From 78920234bbf51495b211d43c6e052033de785d42 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 14:49:15 -0700 Subject: [PATCH 13/21] handle changed domain-server port on start --- domain-server/resources/describe-settings.json | 2 +- domain-server/src/DomainServer.cpp | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index cadbc4d2c8..568931e074 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -35,7 +35,7 @@ ] }, { - "name": "port", + "name": "local_port", "label": "Local UDP Port", "help": "This is the local port your domain-server binds to for UDP connections.
Depending on your router, this may need to be changed to run multiple full automatic networking domain-servers in the same network.", "default": "40102", diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 6b2faffe01..fa7a0fe012 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -196,20 +196,13 @@ const QString DISABLED_AUTOMATIC_NETWORKING_VALUE = "disabled"; void DomainServer::setupNodeListAndAssignments(const QUuid& sessionUUID) { - const QString CUSTOM_PORT_OPTION = "port"; - unsigned short domainServerPort = DEFAULT_DOMAIN_SERVER_PORT; + const QString CUSTOM_LOCAL_PORT_OPTION = "metaverse.local_port"; + + QVariant localPortValue = _settingsManager.valueOrDefaultValueForKeyPath(CUSTOM_LOCAL_PORT_OPTION); + unsigned short domainServerPort = (unsigned short) localPortValue.toUInt(); QVariantMap& settingsMap = _settingsManager.getSettingsMap(); - QVariant autoNetworkingValue = _settingsManager.valueOrDefaultValueForKeyPath(METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH); - - if (!autoNetworkingValue.isNull() && autoNetworkingValue.toString() == FULL_AUTOMATIC_NETWORKING_VALUE) { - // when using full networking use an ephemeral port - disabled until nodes can find us this way - // domainServerPort = 0; - } else if (settingsMap.contains(CUSTOM_PORT_OPTION)) { - domainServerPort = (unsigned short) settingsMap.value(CUSTOM_PORT_OPTION).toUInt(); - } - unsigned short domainServerDTLSPort = 0; if (_isUsingDTLS) { From f19c5c98503f38b24e57372177ea8a135c2a52a3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 14:57:38 -0700 Subject: [PATCH 14/21] repair NetworkAccessManager returns, handle custom AS port in assignment-client --- assignment-client/src/Agent.cpp | 2 +- assignment-client/src/AssignmentClient.cpp | 21 ++++++++++++++++---- interface/src/Application.cpp | 2 +- interface/src/ScriptsModel.cpp | 2 +- libraries/audio/src/Sound.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 4 ++-- libraries/avatars/src/Recording.cpp | 2 +- libraries/networking/src/NodeList.cpp | 8 +------- libraries/script-engine/src/ScriptEngine.cpp | 4 ++-- 9 files changed, 27 insertions(+), 20 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index ea49b90852..140742ce88 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -206,7 +206,7 @@ void Agent::run() { scriptURL = QUrl(_payload); } - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply *reply = networkAccessManager.get(QNetworkRequest(scriptURL)); QNetworkDiskCache* cache = new QNetworkDiskCache(); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 24b6127d63..b30cd355d1 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -59,6 +59,7 @@ AssignmentClient::AssignmentClient(int &argc, char **argv) : const QString ASSIGNMENT_POOL_OPTION = "pool"; const QString ASSIGNMENT_WALLET_DESTINATION_ID_OPTION = "wallet"; const QString CUSTOM_ASSIGNMENT_SERVER_HOSTNAME_OPTION = "a"; + const QString CUSTOM_ASSIGNMENT_SERVER_PORT_OPTION = "p"; Assignment::Type requestAssignmentType = Assignment::AllTypes; @@ -87,17 +88,29 @@ AssignmentClient::AssignmentClient(int &argc, char **argv) : // create a NodeList as an unassigned client NodeList* nodeList = NodeList::createInstance(NodeType::Unassigned); + + unsigned short assignmentServerPort = DEFAULT_DOMAIN_SERVER_PORT; + + // check for an overriden assignment server port + if (argumentVariantMap.contains(CUSTOM_ASSIGNMENT_SERVER_PORT_OPTION)) { + assignmentServerPort = + argumentVariantMap.value(CUSTOM_ASSIGNMENT_SERVER_PORT_OPTION).toString().toUInt(); + } + + HifiSockAddr assignmentServerSocket(DEFAULT_ASSIGNMENT_SERVER_HOSTNAME, assignmentServerPort); // check for an overriden assignment server hostname if (argumentVariantMap.contains(CUSTOM_ASSIGNMENT_SERVER_HOSTNAME_OPTION)) { _assignmentServerHostname = argumentVariantMap.value(CUSTOM_ASSIGNMENT_SERVER_HOSTNAME_OPTION).toString(); - // set the custom assignment socket on our NodeList - HifiSockAddr customAssignmentSocket = HifiSockAddr(_assignmentServerHostname, DEFAULT_DOMAIN_SERVER_PORT); - - nodeList->setAssignmentServerSocket(customAssignmentSocket); + // change the hostname for our assignment server + assignmentServerSocket = HifiSockAddr(_assignmentServerHostname, assignmentServerSocket.getPort()); } + + nodeList->setAssignmentServerSocket(assignmentServerSocket); + qDebug() << "Assignment server socket is" << assignmentServerSocket; + // call a timer function every ASSIGNMENT_REQUEST_INTERVAL_MSECS to ask for assignment, if required qDebug() << "Waiting for assignment -" << _requestAssignment; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 215848b355..a31b148d1b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -350,7 +350,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkDiskCache* cache = new QNetworkDiskCache(); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache"); networkAccessManager.setCache(cache); diff --git a/interface/src/ScriptsModel.cpp b/interface/src/ScriptsModel.cpp index 8bea122338..b95b6ae735 100644 --- a/interface/src/ScriptsModel.cpp +++ b/interface/src/ScriptsModel.cpp @@ -117,7 +117,7 @@ void ScriptsModel::requestRemoteFiles(QString marker) { } url.setQuery(query); - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 6fa002a664..2266385425 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -78,7 +78,7 @@ Sound::Sound(const QUrl& sampleURL, bool isStereo, QObject* parent) : // assume we have a QApplication or QCoreApplication instance and use the // QNetworkAccess manager to grab the raw audio file at the given URL - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); qDebug() << "Requesting audio file" << sampleURL.toDisplayString(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index ef7083e3bf..62cde44909 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1048,7 +1048,7 @@ void AvatarData::setBillboardFromURL(const QString &billboardURL) { QNetworkRequest billboardRequest; billboardRequest.setUrl(QUrl(billboardURL)); - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* networkReply = networkAccessManager.get(billboardRequest); connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply())); } @@ -1113,7 +1113,7 @@ void AvatarData::updateJointMappings() { _jointNames.clear(); if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* networkReply = networkAccessManager.get(QNetworkRequest(_skeletonModelURL)); connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply())); } diff --git a/libraries/avatars/src/Recording.cpp b/libraries/avatars/src/Recording.cpp index 7465eb1aac..0d089a2bd2 100644 --- a/libraries/avatars/src/Recording.cpp +++ b/libraries/avatars/src/Recording.cpp @@ -385,7 +385,7 @@ RecordingPointer readRecordingFromFile(RecordingPointer recording, const QString if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { // Download file if necessary qDebug() << "Downloading recording at" << url; - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index cac4071fb2..25531861ca 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -418,13 +418,7 @@ void NodeList::sendAssignment(Assignment& assignment) { packetStream << assignment; - static HifiSockAddr DEFAULT_ASSIGNMENT_SOCKET(DEFAULT_ASSIGNMENT_SERVER_HOSTNAME, DEFAULT_DOMAIN_SERVER_PORT); - - const HifiSockAddr* assignmentServerSocket = _assignmentServerSocket.isNull() - ? &DEFAULT_ASSIGNMENT_SOCKET - : &_assignmentServerSocket; - - _nodeSocket.writeDatagram(packet, assignmentServerSocket->getAddress(), assignmentServerSocket->getPort()); + _nodeSocket.writeDatagram(packet, _assignmentServerSocket.getAddress(), _assignmentServerSocket.getPort()); } void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 47e0ced6bf..26466ddc47 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -157,7 +157,7 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, emit errorMessage("ERROR Loading file:" + fileName); } } else { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading script at" << url; QEventLoop loop; @@ -682,7 +682,7 @@ void ScriptEngine::include(const QString& includeFile) { QString includeContents; if (url.scheme() == "http" || url.scheme() == "ftp") { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << includeFile; QEventLoop loop; From a358b4e2af55f5e66eeea594479d69a23326d43e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 14:57:54 -0700 Subject: [PATCH 15/21] repair another reference to NetworkAccessManager --- interface/src/ui/ModelsBrowser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index 0f89c44d23..7a76bc2d7d 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -221,7 +221,7 @@ void ModelHandler::update() { } for (int i = 0; i < _model.rowCount(); ++i) { QUrl url(_model.item(i,0)->data(Qt::UserRole).toString()); - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); QNetworkReply* reply = networkAccessManager.head(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); @@ -272,7 +272,7 @@ void ModelHandler::queryNewFiles(QString marker) { // Download url.setQuery(query); - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); From b4cfce8ffa36a2b2cfe2089e79ecd9ee2933ab97 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Oct 2014 14:58:23 -0700 Subject: [PATCH 16/21] final NetworkAccessManager return repairs --- interface/src/ui/ScriptEditorWidget.cpp | 2 +- interface/src/ui/overlays/ImageOverlay.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 1473e4a6a0..b55c753061 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -150,7 +150,7 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } } else { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << scriptPath; QEventLoop loop; diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 8322b9bea4..2b4e1e2f56 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -37,7 +37,7 @@ ImageOverlay::~ImageOverlay() { // TODO: handle setting image multiple times, how do we manage releasing the bound texture? void ImageOverlay::setImageURL(const QUrl& url) { _isLoaded = false; - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); connect(reply, &QNetworkReply::finished, this, &ImageOverlay::replyFinished); } From 373d2f0532e5f4c4bd0fb6aa715500d9dc81121a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 7 Oct 2014 14:50:29 -0700 Subject: [PATCH 17/21] Work-around for right hand roll on Windows is no longer needed --- examples/leapHands.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/examples/leapHands.js b/examples/leapHands.js index 1095a9f4dc..3352ea243b 100644 --- a/examples/leapHands.js +++ b/examples/leapHands.js @@ -31,7 +31,6 @@ var leapHands = (function () { CALIBRATED = 2, CALIBRATION_TIME = 1000, // milliseconds PI = 3.141593, - isWindows, avatarScale, avatarFaceModelURL, avatarSkeletonModelURL, @@ -132,9 +131,6 @@ var leapHands = (function () { if (hands[0].controller.isActive() && hands[1].controller.isActive()) { leapHandHeight = (hands[0].controller.getAbsTranslation().y + hands[1].controller.getAbsTranslation().y) / 2.0; - - // TODO: Temporary detection of Windows to work around Leap Controller problem. - isWindows = (hands[1].controller.getAbsRotation().z > (0.25 * PI)); } else { calibrationStatus = UNCALIBRATED; return; @@ -398,12 +394,6 @@ var leapHands = (function () { handPitch = 2.0 * -wristAbsRotation.x; handYaw = 2.0 * wristAbsRotation.y; - // TODO: Leap Motion controller's right-hand roll calculation only works if physical hand is upside down. - // Approximate fix is to add a fudge factor. - if (h === 1 && isWindows) { - handRoll = handRoll + 0.6 * PI; - } - // Hand position and orientation ... if (h === 0) { handRotation = Quat.multiply(Quat.angleAxis(-90.0, { x: 0, y: 1, z: 0 }), From ec6b6999a0a234bd2b8850e27fa553a1d5a17daf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Oct 2014 15:29:57 -0700 Subject: [PATCH 18/21] fix for location hash in address bar --- interface/src/ui/AddressBarDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index 26505af0be..399f46f26d 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -26,7 +26,7 @@ AddressBarDialog::AddressBarDialog() : void AddressBarDialog::setupUI() { const QString DIALOG_STYLESHEET = "font-family: Helvetica, Arial, sans-serif;"; - const QString ADDRESSBAR_PLACEHOLDER = "Go to: domain, @user, #location"; + const QString ADDRESSBAR_PLACEHOLDER = "Go to: domain, location, @user, /path"; const QString ADDRESSBAR_STYLESHEET = "padding: 5px 10px; font-size: 20px;"; const int ADDRESSBAR_MIN_WIDTH = 200; From 6e81bde7bd7ac120afd2fba2fe3ff78126dd05a9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Oct 2014 15:30:44 -0700 Subject: [PATCH 19/21] make position path clearer for address bar --- interface/src/ui/AddressBarDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index 399f46f26d..d81eaa36b4 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -26,7 +26,7 @@ AddressBarDialog::AddressBarDialog() : void AddressBarDialog::setupUI() { const QString DIALOG_STYLESHEET = "font-family: Helvetica, Arial, sans-serif;"; - const QString ADDRESSBAR_PLACEHOLDER = "Go to: domain, location, @user, /path"; + const QString ADDRESSBAR_PLACEHOLDER = "Go to: domain, location, @user, /x,y,z"; const QString ADDRESSBAR_STYLESHEET = "padding: 5px 10px; font-size: 20px;"; const int ADDRESSBAR_MIN_WIDTH = 200; From a3cce3ae2286e8f39bda7f05597da2caeecfb169 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 8 Oct 2014 10:11:18 -0700 Subject: [PATCH 20/21] Fix Leap hand roll --- examples/leapHands.js | 48 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/leapHands.js b/examples/leapHands.js index 3352ea243b..222c0e4cf1 100644 --- a/examples/leapHands.js +++ b/examples/leapHands.js @@ -30,7 +30,6 @@ var leapHands = (function () { CALIBRATING = 1, CALIBRATED = 2, CALIBRATION_TIME = 1000, // milliseconds - PI = 3.141593, avatarScale, avatarFaceModelURL, avatarSkeletonModelURL, @@ -314,11 +313,7 @@ var leapHands = (function () { j, side, handOffset, - handRoll, - handPitch, - handYaw, handRotation, - wristAbsRotation, locRotation, cameraOrientation, inverseAvatarOrientation; @@ -357,20 +352,22 @@ var leapHands = (function () { handOffset.x = -handOffset.x; // Hand rotation in camera coordinates ... - // TODO: 2.0* scale factors should not be necessary; Leap Motion controller code needs investigating. - handRoll = 2.0 * -hands[h].controller.getAbsRotation().z; - wristAbsRotation = wrists[h].controller.getAbsRotation(); - handPitch = 2.0 * wristAbsRotation.x - PI / 2.0; - handYaw = 2.0 * -wristAbsRotation.y; - // TODO: Roll values only work if hand is upside down; Leap Motion controller code needs investigating. - handRoll = PI + handRoll; + handRotation = wrists[h].controller.getAbsRotation(); + handRotation = { + x: handRotation.z, + y: handRotation.y, + z: handRotation.x, + w: handRotation.w + }; if (h === 0) { - handRotation = Quat.multiply(Quat.angleAxis(-90.0, { x: 0, y: 1, z: 0 }), - Quat.fromVec3Radians({ x: handRoll, y: handYaw, z: -handPitch })); + handRotation.x = -handRotation.x; + handRotation = Quat.multiply(Quat.angleAxis(90.0, { x: 1, y: 0, z: 0 }), handRotation); + handRotation = Quat.multiply(Quat.angleAxis(90.0, { x: 0, y: 0, z: 1 }), handRotation); } else { - handRotation = Quat.multiply(Quat.angleAxis(90.0, { x: 0, y: 1, z: 0 }), - Quat.fromVec3Radians({ x: -handRoll, y: handYaw, z: handPitch })); + handRotation.z = -handRotation.z; + handRotation = Quat.multiply(Quat.angleAxis(90.0, { x: 1, y: 0, z: 0 }), handRotation); + handRotation = Quat.multiply(Quat.angleAxis(-90.0, { x: 0, y: 0, z: 1 }), handRotation); } // Hand rotation in avatar coordinates ... @@ -388,19 +385,22 @@ var leapHands = (function () { z: hands[h].zeroPosition.z - handOffset.z }; - // TODO: 2.0* scale factors should not be necessary; Leap Motion controller code needs investigating. - handRoll = 2.0 * -hands[h].controller.getAbsRotation().z; - wristAbsRotation = wrists[h].controller.getAbsRotation(); - handPitch = 2.0 * -wristAbsRotation.x; - handYaw = 2.0 * wristAbsRotation.y; + handRotation = wrists[h].controller.getAbsRotation(); + handRotation = { + x: handRotation.z, + y: handRotation.y, + z: handRotation.x, + w: handRotation.w + }; - // Hand position and orientation ... if (h === 0) { + handRotation.x = -handRotation.x; handRotation = Quat.multiply(Quat.angleAxis(-90.0, { x: 0, y: 1, z: 0 }), - Quat.fromVec3Radians({ x: handRoll, y: handYaw, z: -handPitch })); + handRotation); } else { + handRotation.z = -handRotation.z; handRotation = Quat.multiply(Quat.angleAxis(90.0, { x: 0, y: 1, z: 0 }), - Quat.fromVec3Radians({ x: -handRoll, y: handYaw, z: handPitch })); + handRotation); } } From d064919cb00cbbd7d292b9277d6ae37a67d6d1a9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Oct 2014 10:41:16 -0700 Subject: [PATCH 21/21] fix a missed reference to NetworkAccessManager --- 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 19d1758c4a..51789aec3a 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -682,7 +682,7 @@ void ScriptEngine::include(const QString& includeFile) { QString includeContents; if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { - NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << includeFile; QEventLoop loop;