diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0018cf88c5..e47b01c5df 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -339,8 +339,6 @@ static const QString SNAPSHOT_EXTENSION = ".jpg"; static const QString JPG_EXTENSION = ".jpg"; static const QString PNG_EXTENSION = ".png"; static const QString SVO_EXTENSION = ".svo"; -static const QString SERVERLESS_DOMAIN_EXTENSION = ".domain.json"; -static const QString SERVERLESS_DOMAIN_GZ_EXTENSION = ".domain.json.gz"; static const QString SVO_JSON_EXTENSION = ".svo.json"; static const QString JSON_GZ_EXTENSION = ".json.gz"; static const QString JSON_EXTENSION = ".json"; @@ -382,8 +380,6 @@ const QHash Application::_acceptedExtensi { SVO_EXTENSION, &Application::importSVOFromURL }, { SVO_JSON_EXTENSION, &Application::importSVOFromURL }, { AVA_JSON_EXTENSION, &Application::askToWearAvatarAttachmentUrl }, - { SERVERLESS_DOMAIN_EXTENSION, &Application::visitServerlessDomain }, - { SERVERLESS_DOMAIN_GZ_EXTENSION, &Application::visitServerlessDomain }, { JSON_EXTENSION, &Application::importJSONFromURL }, { JS_EXTENSION, &Application::askToLoadScript }, { FST_EXTENSION, &Application::askToSetAvatarUrl }, @@ -1112,10 +1108,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo const DomainHandler& domainHandler = nodeList->getDomainHandler(); - connect(&domainHandler, SIGNAL(hostnameChanged(const QString&)), SLOT(domainChanged(const QString&))); - connect(&domainHandler, SIGNAL(serverlessDomainChanged(QUrl)), SLOT(loadServerlessDomain(QUrl))); + connect(&domainHandler, SIGNAL(domainURLChanged(QUrl)), SLOT(domainURLChanged(QUrl))); connect(&domainHandler, SIGNAL(resetting()), SLOT(resettingDomain())); - connect(&domainHandler, SIGNAL(connectedToDomain(const QString&, const QUrl&)), SLOT(updateWindowTitle())); + connect(&domainHandler, SIGNAL(connectedToDomain(QUrl)), SLOT(updateWindowTitle())); connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(updateWindowTitle())); connect(&domainHandler, &DomainHandler::disconnectedFromDomain, this, &Application::clearDomainAvatars); connect(&domainHandler, &DomainHandler::disconnectedFromDomain, this, [this]() { @@ -1173,7 +1168,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(addressManager.data(), &AddressManager::hostChanged, this, &Application::updateWindowTitle); connect(this, &QCoreApplication::aboutToQuit, addressManager.data(), &AddressManager::storeCurrentAddress); - connect(addressManager.data(), &AddressManager::setServersEnabled, this, &Application::setServersEnabled); + connect(addressManager.data(), &AddressManager::setServerlessDomain, this, &Application::setServerlessDomain); connect(this, &Application::activeDisplayPluginChanged, this, &Application::updateThreadPoolCount); connect(this, &Application::activeDisplayPluginChanged, this, [](){ @@ -2075,7 +2070,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo connect(&_addAssetToWorldErrorTimer, &QTimer::timeout, this, &Application::addAssetToWorldErrorTimeout); connect(this, &QCoreApplication::aboutToQuit, this, &Application::addAssetToWorldMessageClose); - connect(&domainHandler, &DomainHandler::hostnameChanged, this, &Application::addAssetToWorldMessageClose); + connect(&domainHandler, &DomainHandler::domainURLChanged, this, &Application::addAssetToWorldMessageClose); updateSystemTabletMode(); @@ -3104,18 +3099,13 @@ bool Application::importFromZIP(const QString& filePath) { return true; } -void Application::setServersEnabled(bool serversEnabled) { - if (_serversEnabled != serversEnabled) { - _serversEnabled = serversEnabled; - getEntities()->getTree()->setIsServerlessMode(!_serversEnabled); +void Application::setServerlessDomain(bool serverlessDomain) { + if (_serverlessDomain != serverlessDomain) { + _serverlessDomain = serverlessDomain; + getEntities()->getTree()->setIsServerlessMode(_serverlessDomain); } } -bool Application::visitServerlessDomain(const QString& urlString) { - DependencyManager::get()->handleLookupString(urlString); - return true; -} - void Application::loadServerlessDomain(QUrl domainURL) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "loadServerlessDomain", Q_ARG(QUrl, domainURL)); @@ -5798,7 +5788,7 @@ void Application::updateWindowTitle() const { QString currentPlaceName; if (isServerlessMode()) { - currentPlaceName = "serverless: " + DependencyManager::get()->getServerlessDomainURL().toString(); + currentPlaceName = "serverless: " + DependencyManager::get()->getDomainURL().toString(); } else { currentPlaceName = DependencyManager::get()->getHost(); if (currentPlaceName.isEmpty()) { @@ -5816,7 +5806,7 @@ void Application::updateWindowTitle() const { _window->setWindowTitle(title); // updateTitleWindow gets called whenever there's a change regarding the domain, so rather - // than placing this within domainChanged, it's placed here to cover the other potential cases. + // than placing this within domainURLChanged, it's placed here to cover the other potential cases. DependencyManager::get< MessagesClient >()->sendLocalMessage("Toolbar-DomainChanged", ""); } @@ -5855,11 +5845,14 @@ void Application::clearDomainAvatars() { DependencyManager::get()->clearOtherAvatars(); } -void Application::domainChanged(const QString& domainHostname) { +void Application::domainURLChanged(QUrl domainURL) { clearDomainOctreeDetails(); updateWindowTitle(); // disable physics until we have enough information about our new location to not cause craziness. resetPhysicsReadyInformation(); + if (domainURL.scheme() != HIFI_URL_SCHEME) { + loadServerlessDomain(domainURL); + } } diff --git a/interface/src/Application.h b/interface/src/Application.h index bc8bac90a6..cbbd43f95d 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -285,7 +285,7 @@ public: bool getSaveAvatarOverrideUrl() { return _saveAvatarOverrideUrl; } void saveNextPhysicsStats(QString filename); - bool isServerlessMode() const { return !_serversEnabled; } + bool isServerlessMode() const { return _serverlessDomain; } void replaceDomainContent(const QString& url); @@ -394,7 +394,7 @@ public slots: const QString getPreferredCursor() const { return _preferredCursor.get(); } void setPreferredCursor(const QString& cursor); - void setServersEnabled(bool enableServers); + void setServerlessDomain(bool serverlessDomain); void loadServerlessDomain(QUrl domainURL); private slots: @@ -429,7 +429,7 @@ private slots: void setSessionUUID(const QUuid& sessionUUID) const; - void domainChanged(const QString& domainHostname); + void domainURLChanged(QUrl domainURL); void updateWindowTitle() const; void nodeAdded(SharedNodePointer node) const; void nodeActivated(SharedNodePointer node); @@ -480,7 +480,6 @@ private: bool importJSONFromURL(const QString& urlString); bool importSVOFromURL(const QString& urlString); bool importFromZIP(const QString& filePath); - bool visitServerlessDomain(const QString& urlString); bool importImage(const QString& urlString); bool nearbyEntitiesAreReadyForPhysics(); @@ -721,6 +720,6 @@ private: std::atomic _pendingIdleEvent { true }; std::atomic _pendingRenderEvent { true }; - bool _serversEnabled { true }; + bool _serverlessDomain { true }; }; #endif // hifi_Application_h diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 3575558866..5b345db7b6 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -126,7 +126,7 @@ void WindowScriptingInterface::promptAsync(const QString& message, const QString } void WindowScriptingInterface::disconnectedFromDomain() { - emit domainChanged("", QUrl()); + emit domainChanged(QUrl()); } QString fixupPathForMac(const QString& directory) { diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 43fe60862f..eb575bc17b 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -524,7 +524,7 @@ signals: * Triggered when you change the domain you're visiting. Warning: Is not emitted if you go to domain that * isn't running. * @function Window.domainChanged - * @param {string} domain - The domain's IP address. + * @param {string} domainURL - The domain's URL. * @returns {Signal} * @example Report when you change domains. * function onDomainChanged(domain) { @@ -533,7 +533,7 @@ signals: * * Window.domainChanged.connect(onDomainChanged); */ - void domainChanged(const QString& domain, const QUrl& serverlessDomainURL); + void domainChanged(QUrl domainURL); /**jsdoc * Triggered when you try to navigate to a *.json, *.svo, or *.svo.json URL in a Web browser within Interface. diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index bdbc5478a2..275c6023fe 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -2175,7 +2175,7 @@ QVector EntityTree::sendEntities(EntityEditPacketSender* packetSen localTree->recurseTreeWithOperator(&moveOperator); } - if (_serversEnabled) { + if (!_serverlessDomain) { // send add-entity packets to the server i = map.begin(); while (i != map.end()) { diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index f526e1c232..5f69714432 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -283,8 +283,8 @@ public: void setMyAvatar(std::shared_ptr myAvatar) { _myAvatar = myAvatar; } - void setIsServerlessMode(bool value) { _serversEnabled = !value; } - bool isServerlessMode() const { return !_serversEnabled; } + void setIsServerlessMode(bool value) { _serverlessDomain = value; } + bool isServerlessMode() const { return _serverlessDomain; } static void setAddMaterialToEntityOperator(std::function addMaterialToEntityOperator) { _addMaterialToEntityOperator = addMaterialToEntityOperator; } static void setRemoveMaterialFromEntityOperator(std::function removeMaterialFromEntityOperator) { _removeMaterialFromEntityOperator = removeMaterialFromEntityOperator; } @@ -416,7 +416,7 @@ private: static std::function _addMaterialToOverlayOperator; static std::function _removeMaterialFromOverlayOperator; - bool _serversEnabled { true }; + bool _serverlessDomain { false }; }; #endif // hifi_EntityTree_h diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 7ac8ea1dda..d176853a7c 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -41,12 +41,6 @@ const QString SETTINGS_CURRENT_ADDRESS_KEY = "address"; Setting::Handle currentAddressHandle(QStringList() << ADDRESS_MANAGER_SETTINGS_GROUP << "address", DEFAULT_HIFI_ADDRESS); -AddressManager::AddressManager() : - _port(0) -{ - -} - QString AddressManager::protocolVersion() { return protocolVersionsSignatureBase64(); } @@ -56,18 +50,7 @@ bool AddressManager::isConnected() { } QUrl AddressManager::currentAddress(bool domainOnly) const { - QUrl hifiURL; - - if (!_serverlessDomainURL.isEmpty()) { - hifiURL = _serverlessDomainURL; - } else { - hifiURL.setScheme(HIFI_URL_SCHEME); - hifiURL.setHost(_host); - - if (_port != 0 && _port != DEFAULT_DOMAIN_SERVER_PORT) { - hifiURL.setPort(_port); - } - } + QUrl hifiURL = _domainURL; if (!domainOnly && hifiURL.scheme() == HIFI_URL_SCHEME) { hifiURL.setPath(currentPath()); @@ -219,7 +202,7 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) { if (lookupUrl.scheme() == HIFI_URL_SCHEME) { - emit setServersEnabled(true); + emit setServerlessDomain(false); qCDebug(networking) << "Trying to go to URL" << lookupUrl.toString(); @@ -303,8 +286,8 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) { } else if (lookupUrl.scheme() == "http" || lookupUrl.scheme() == "https" || lookupUrl.scheme() == "file") { _previousLookup.clear(); QUrl domainUrl = PathUtils::expandToLocalDataAbsolutePath(lookupUrl); - emit setServersEnabled(false); - setDomainInfo(domainUrl, QString(), 0, trigger); + emit setServerlessDomain(true); + setDomainInfo(domainUrl, trigger); DependencyManager::get()->getDomainHandler().setIsConnected(true); emit lookupResultsFinished(); return true; @@ -417,7 +400,11 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const qCDebug(networking) << "Possible domain change required to connect to" << domainHostname << "on" << domainPort; - emit possibleDomainChangeRequired(QUrl(), domainHostname, domainPort, domainID); + QUrl domainURL; + domainURL.setScheme(HIFI_URL_SCHEME); + domainURL.setHost(domainHostname); + domainURL.setPort(domainPort); + emit possibleDomainChangeRequired(domainURL, domainID); } else { QString iceServerAddress = domainObject[DOMAIN_ICE_SERVER_ADDRESS_KEY].toString(); @@ -454,15 +441,10 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const if (setHost(placeName, trigger)) { trigger = LookupTrigger::Internal; } - - _placeName = placeName; } else { if (setHost(domainIDString, trigger)) { trigger = LookupTrigger::Internal; } - - // this isn't a place, so clear the place name - _placeName.clear(); } // check if we had a path to override the path returned @@ -589,7 +571,11 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString, LookupTri } emit lookupResultsFinished(); - hostChanged = setDomainInfo(QUrl(), domainIPString, domainPort, trigger); + QUrl domainURL; + domainURL.setScheme(HIFI_URL_SCHEME); + domainURL.setHost(domainIPString); + domainURL.setPort(domainPort); + hostChanged = setDomainInfo(domainURL, trigger); return true; } @@ -606,7 +592,11 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString, LookupTri } emit lookupResultsFinished(); - hostChanged = setDomainInfo(QUrl(), domainHostname, domainPort, trigger); + QUrl domainURL; + domainURL.setScheme(HIFI_URL_SCHEME); + domainURL.setHost(domainHostname); + domainURL.setPort(domainPort); + hostChanged = setDomainInfo(domainURL, trigger); return true; } @@ -730,17 +720,19 @@ bool AddressManager::handleUsername(const QString& lookupString) { } bool AddressManager::setHost(const QString& host, LookupTrigger trigger, quint16 port) { - if (host != _host || port != _port) { + if (host != _domainURL.host() || port != _domainURL.port()) { addCurrentAddressToHistory(trigger); - _port = port; + bool emitHostChanged = host != _domainURL.host(); + _domainURL.setScheme(HIFI_URL_SCHEME); + _domainURL.setHost(host); + _domainURL.setPort(port); + // any host change should clear the shareable place name _shareablePlaceName.clear(); - _serverlessDomainURL = QUrl(); - if (host != _host) { - _host = host; - emit hostChanged(_host); + if (emitHostChanged) { + emit hostChanged(host); } return true; @@ -749,26 +741,43 @@ bool AddressManager::setHost(const QString& host, LookupTrigger trigger, quint16 return false; } -bool AddressManager::setDomainInfo(const QUrl& serverlessDomainURL, - const QString& hostname, quint16 port, LookupTrigger trigger) { - bool hostChanged = setHost(hostname, trigger, port); +QString AddressManager::getHost() const { + if (isPossiblePlaceName(_domainURL.host())) { + return QString(); + } + + return _domainURL.host(); +} + +bool AddressManager::setDomainInfo(const QUrl& domainURL, LookupTrigger trigger) { + const QString hostname = domainURL.host(); + quint16 port = domainURL.port(); + bool emitHostChanged { false }; + + if (domainURL.host() != _domainURL.host() || domainURL.port() != _domainURL.port()) { + addCurrentAddressToHistory(trigger); + emitHostChanged = true; + } + + _domainURL = domainURL; // clear any current place information _rootPlaceID = QUuid(); - _placeName.clear(); - _serverlessDomainURL = serverlessDomainURL; - if (!serverlessDomainURL.isEmpty()) { - qCDebug(networking) << "Possible domain change required to serverless domain: " << serverlessDomainURL.toString(); - } else { + if (_domainURL.scheme() == HIFI_URL_SCHEME) { qCDebug(networking) << "Possible domain change required to connect to domain at" << hostname << "on" << port; + } else { + qCDebug(networking) << "Possible domain change required to serverless domain: " << domainURL.toString(); } DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::HandleAddress); - emit possibleDomainChangeRequired(serverlessDomainURL, hostname, port, QUuid()); + if (emitHostChanged) { + emit hostChanged(domainURL.host()); + } + emit possibleDomainChangeRequired(_domainURL, QUuid()); - return hostChanged; + return emitHostChanged; } void AddressManager::goToUser(const QString& username, bool shouldMatchOrientation) { @@ -857,7 +866,7 @@ void AddressManager::lookupShareableNameForDomainID(const QUuid& domainID) { // then use that for Steam join/invite or copiable address // it only makes sense to lookup a shareable default name if we don't have a place name - if (_placeName.isEmpty()) { + if (getPlaceName().isEmpty()) { JSONCallbackParameters callbackParams; // no error callback handling @@ -909,3 +918,12 @@ void AddressManager::addCurrentAddressToHistory(LookupTrigger trigger) { } } +QString AddressManager::getPlaceName() const { + if (!_shareablePlaceName.isEmpty()) { + return _shareablePlaceName; + } + if (isPossiblePlaceName(_domainURL.host())) { + return _domainURL.host(); + } + return QString(); +} diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 059d3cafed..d9dbd9fd00 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -22,8 +22,6 @@ #include "AccountManager.h" -const QString HIFI_URL_SCHEME = "hifi"; - extern const QString DEFAULT_HIFI_ADDRESS; const QString SANDBOX_HIFI_ADDRESS = "hifi://localhost"; @@ -166,10 +164,10 @@ public: QString currentFacingPath() const; const QUuid& getRootPlaceID() const { return _rootPlaceID; } - const QString& getPlaceName() const { return _shareablePlaceName.isEmpty() ? _placeName : _shareablePlaceName; } + QString getPlaceName() const; QString getDomainID() const; - const QString& getHost() const { return _host; } + QString getHost() const; void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; } void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; } @@ -179,7 +177,7 @@ public: const QStack& getBackStack() const { return _backStack; } const QStack& getForwardStack() const { return _forwardStack; } - QUrl getServerlessDomainURL() { return _serverlessDomainURL; } + QUrl getDomainURL() { return _domainURL; } public slots: /**jsdoc @@ -313,15 +311,12 @@ signals: /**jsdoc * Triggered when a request is made to go to an IP address. * @function location.possibleDomainChangeRequired - * @param {string} serverlessDomainURL - URL for a file-based domain - * @param {string} hostName - The name of the domain to go do. - * @param {number} port - The integer number of the network port to connect to. + * @param {Url} domainURL - URL for domain * @param {Uuid} domainID - The UUID of the domain to go to. * @returns {Signal} */ // No example because this function isn't typically used in scripts. - void possibleDomainChangeRequired(const QUrl& serverlessDomainURL, - const QString& newHostname, quint16 newPort, const QUuid& domainID); + void possibleDomainChangeRequired(QUrl domainURL, QUuid domainID); /**jsdoc * Triggered when a request is made to go to a named domain or user. @@ -420,11 +415,9 @@ signals: */ void goForwardPossible(bool isPossible); - void setServersEnabled(bool serversEnabled); + void setServerlessDomain(bool serverlessDomain); void loadServerlessDomain(QUrl domainURL); -protected: - AddressManager(); private slots: void handleAPIResponse(QNetworkReply& requestReply); void handleAPIError(QNetworkReply& errorReply); @@ -436,7 +429,7 @@ private: // Set host and port, and return `true` if it was changed. bool setHost(const QString& host, LookupTrigger trigger, quint16 port = 0); - bool setDomainInfo(const QUrl& serverlessDomainURL, const QString& hostname, quint16 port, LookupTrigger trigger); + bool setDomainInfo(const QUrl& domainURL, LookupTrigger trigger); const JSONCallbackParameters& apiCallbackParameters(); @@ -454,10 +447,8 @@ private: void addCurrentAddressToHistory(LookupTrigger trigger); - QString _host; - quint16 _port; - QString _placeName; - QUrl _serverlessDomainURL; // for file-based domains + QUrl _domainURL; + QUuid _rootPlaceID; PositionGetter _positionGetter; OrientationGetter _orientationGetter; diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 6eca3d5ad0..917b5ee470 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -115,9 +115,8 @@ void DomainHandler::hardReset() { qCDebug(networking) << "Hard reset in NodeList DomainHandler."; _pendingDomainID = QUuid(); _iceServerSockAddr = HifiSockAddr(); - _hostname = QString(); _sockAddr.clear(); - _serverlessDomainURL = QUrl(); + _domainURL = QUrl(); _domainConnectionRefusals.clear(); @@ -140,8 +139,7 @@ void DomainHandler::setSockAddr(const HifiSockAddr& sockAddr, const QString& hos } // some callers may pass a hostname, this is not to be used for lookup but for DTLS certificate verification - _hostname = hostname; - _serverlessDomainURL = QUrl(); + _domainURL = QUrl(); } void DomainHandler::setUUID(const QUuid& uuid) { @@ -151,42 +149,37 @@ void DomainHandler::setUUID(const QUuid& uuid) { } } -void DomainHandler::setSocketAndID(const QUrl& serverlessDomainURL, - const QString& hostname, quint16 port, const QUuid& domainID) { - +void DomainHandler::setURLAndID(QUrl domainURL, QUuid domainID) { _pendingDomainID = domainID; - if (serverlessDomainURL != _serverlessDomainURL || hostname != _hostname || _sockAddr.getPort() != port) { + if (_domainURL != domainURL || _sockAddr.getPort() != domainURL.port()) { // re-set the domain info so that auth information is reloaded hardReset(); - if (serverlessDomainURL != _serverlessDomainURL) { - _serverlessDomainURL = serverlessDomainURL; - if (_serverlessDomainURL != QUrl()) { - setIsConnected(true); - } - emit serverlessDomainChanged(_serverlessDomainURL); - } + QString hostname = domainURL.host(); + quint16 port = domainURL.port(); - if (hostname != _hostname) { - // set the new hostname - _hostname = hostname; + _domainURL = domainURL; - qCDebug(networking) << "Updated domain hostname to" << _hostname; + if (domainURL.scheme() != HIFI_URL_SCHEME) { + setIsConnected(true); + } else if (hostname != _domainURL.host()) { + qCDebug(networking) << "Updated domain hostname to" << hostname; - if (!_hostname.isEmpty()) { + if (!hostname.isEmpty()) { // re-set the sock addr to null and fire off a lookup of the IP address for this domain-server's hostname - qCDebug(networking, "Looking up DS hostname %s.", _hostname.toLocal8Bit().constData()); - QHostInfo::lookupHost(_hostname, this, SLOT(completedHostnameLookup(const QHostInfo&))); + qCDebug(networking, "Looking up DS hostname %s.", hostname.toLocal8Bit().constData()); + QHostInfo::lookupHost(hostname, this, SLOT(completedHostnameLookup(const QHostInfo&))); DependencyManager::get()->flagTimeForConnectionStep( LimitedNodeList::ConnectionStep::SetDomainHostname); - UserActivityLogger::getInstance().changedDomain(_hostname); + UserActivityLogger::getInstance().changedDomain(hostname); } - emit hostnameChanged(_hostname); } + emit domainURLChanged(_domainURL); + if (_sockAddr.getPort() != port) { qCDebug(networking) << "Updated domain port to" << port; } @@ -198,9 +191,10 @@ void DomainHandler::setSocketAndID(const QUrl& serverlessDomainURL, void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id) { - if (_serverlessDomainURL != QUrl()) { - _serverlessDomainURL = QUrl(); - emit serverlessDomainChanged(QUrl()); + if (isServerless()) { + // if we were connected to a serverless domain, clear the octree, etc + _domainURL = QUrl(); + emit domainURLChanged(_domainURL); } if (_iceServerSockAddr.getAddress().toString() != iceServerHostname || id != _pendingDomainID) { @@ -235,16 +229,16 @@ void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, void DomainHandler::activateICELocalSocket() { DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SetDomainSocket); _sockAddr = _icePeer.getLocalSocket(); - _hostname = _sockAddr.getAddress().toString(); - _serverlessDomainURL = QUrl(); + _domainURL.setScheme(HIFI_URL_SCHEME); + _domainURL.setHost(_sockAddr.getAddress().toString()); emit completedSocketDiscovery(); } void DomainHandler::activateICEPublicSocket() { DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SetDomainSocket); _sockAddr = _icePeer.getPublicSocket(); - _hostname = _sockAddr.getAddress().toString(); - _serverlessDomainURL = QUrl(); + _domainURL.setScheme(HIFI_URL_SCHEME); + _domainURL.setHost(_sockAddr.getAddress().toString()); emit completedSocketDiscovery(); } @@ -255,7 +249,7 @@ void DomainHandler::completedHostnameLookup(const QHostInfo& hostInfo) { DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SetDomainSocket); - qCDebug(networking, "DS at %s is at %s", _hostname.toLocal8Bit().constData(), + qCDebug(networking, "DS at %s is at %s", _domainURL.host().toLocal8Bit().constData(), _sockAddr.getAddress().toString().toLocal8Bit().constData()); emit completedSocketDiscovery(); @@ -282,9 +276,9 @@ void DomainHandler::setIsConnected(bool isConnected) { _isConnected = isConnected; if (_isConnected) { - emit connectedToDomain(_hostname, _serverlessDomainURL); + emit connectedToDomain(_domainURL); - if (!_hostname.isEmpty()) { + if (_domainURL.scheme() == HIFI_URL_SCHEME && !_domainURL.host().isEmpty()) { // we've connected to new domain - time to ask it for global settings requestDomainSettings(); } diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 0559fb32a6..b1700c3db4 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -25,6 +25,7 @@ #include "NLPacketList.h" #include "Node.h" #include "ReceivedMessage.h" +#include "NetworkingConstants.h" const unsigned short DEFAULT_DOMAIN_SERVER_PORT = 40102; const unsigned short DEFAULT_DOMAIN_SERVER_DTLS_PORT = 40103; @@ -37,14 +38,14 @@ class DomainHandler : public QObject { Q_OBJECT public: DomainHandler(QObject* parent = 0); - + void disconnect(); void clearSettings(); const QUuid& getUUID() const { return _uuid; } void setUUID(const QUuid& uuid); - const QString& getHostname() const { return _hostname; } + QString getHostname() const { return _domainURL.host(); } const QHostAddress& getIP() const { return _sockAddr.getAddress(); } void setIPToLocalhost() { _sockAddr.setAddress(QHostAddress(QHostAddress::LocalHost)); } @@ -57,7 +58,7 @@ public: const QUuid& getConnectionToken() const { return _connectionToken; } void setConnectionToken(const QUuid& connectionToken) { _connectionToken = connectionToken; } - + const QUuid& getAssignmentUUID() const { return _assignmentUUID; } void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; } @@ -73,12 +74,12 @@ public: bool isConnected() const { return _isConnected; } void setIsConnected(bool isConnected); - bool isServerless() const { return _serverlessDomainURL != QUrl(); } + bool isServerless() const { return _domainURL.scheme() != HIFI_URL_SCHEME; } bool hasSettings() const { return !_settingsObject.isEmpty(); } void requestDomainSettings(); const QJsonObject& getSettingsObject() const { return _settingsObject; } - + void setPendingPath(const QString& pendingPath) { _pendingPath = pendingPath; } const QString& getPendingPath() { return _pendingPath; } void clearPendingPath() { _pendingPath.clear(); } @@ -140,8 +141,7 @@ public: }; public slots: - void setSocketAndID(const QUrl& serverlessDomainURL, - const QString& hostname, quint16 port = DEFAULT_DOMAIN_SERVER_PORT, const QUuid& id = QUuid()); + void setURLAndID(QUrl domainURL, QUuid id); void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id); void processSettingsPacketList(QSharedPointer packetList); @@ -155,15 +155,14 @@ private slots: void completedIceServerHostnameLookup(); signals: - void hostnameChanged(const QString& hostname); - void serverlessDomainChanged(QUrl serverlessDomainURL); + void domainURLChanged(QUrl domainURL); // NOTE: the emission of completedSocketDiscovery does not mean a connection to DS is established // It means that, either from DNS lookup or ICE, we think we have a socket we can talk to DS on void completedSocketDiscovery(); void resetting(); - void connectedToDomain(const QString& hostname, const QUrl& serverlessDomainURL); + void connectedToDomain(QUrl domainURL); void disconnectedFromDomain(); void iceSocketAndIDReceived(); @@ -182,8 +181,7 @@ private: void hardReset(); QUuid _uuid; - QUrl _serverlessDomainURL; - QString _hostname; + QUrl _domainURL; HifiSockAddr _sockAddr; QUuid _assignmentUUID; QUuid _connectionToken; diff --git a/libraries/networking/src/NetworkingConstants.cpp b/libraries/networking/src/NetworkingConstants.cpp new file mode 100644 index 0000000000..6b8e03493b --- /dev/null +++ b/libraries/networking/src/NetworkingConstants.cpp @@ -0,0 +1,35 @@ +// +// NetworkingConstants.cpp +// libraries/networking/src +// +// Created by Seth Alves on 2018-2-28. +// Copyright 2018 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 "NetworkingConstants.h" + +namespace NetworkingConstants { + QUrl METAVERSE_SERVER_URL_STABLE() { + return QUrl("https://metaverse.highfidelity.com"); + } + + QUrl METAVERSE_SERVER_URL_STAGING() { + return QUrl("https://staging.highfidelity.com"); + } + + // You can change the return of this function if you want to use a custom metaverse URL at compile time + // or you can pass a custom URL via the env variable + QUrl METAVERSE_SERVER_URL() { + static const QString HIFI_METAVERSE_URL_ENV = "HIFI_METAVERSE_URL"; + static const QUrl serverURL = QProcessEnvironment::systemEnvironment().contains(HIFI_METAVERSE_URL_ENV) + ? QUrl(QProcessEnvironment::systemEnvironment().value(HIFI_METAVERSE_URL_ENV)) + : METAVERSE_SERVER_URL_STABLE(); + return serverURL; + }; +} diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h index a4726f9b1a..c30e41e09b 100644 --- a/libraries/networking/src/NetworkingConstants.h +++ b/libraries/networking/src/NetworkingConstants.h @@ -25,18 +25,11 @@ namespace NetworkingConstants { // if you manually generate a personal access token for the domains scope // at https://staging.highfidelity.com/user/tokens/new?for_domain_server=true - const QUrl METAVERSE_SERVER_URL_STABLE("https://metaverse.highfidelity.com"); - const QUrl METAVERSE_SERVER_URL_STAGING("https://staging.highfidelity.com"); - - // You can change the return of this function if you want to use a custom metaverse URL at compile time - // or you can pass a custom URL via the env variable - static const QUrl METAVERSE_SERVER_URL() { - static const QString HIFI_METAVERSE_URL_ENV = "HIFI_METAVERSE_URL"; - static const QUrl serverURL = QProcessEnvironment::systemEnvironment().contains(HIFI_METAVERSE_URL_ENV) - ? QUrl(QProcessEnvironment::systemEnvironment().value(HIFI_METAVERSE_URL_ENV)) - : METAVERSE_SERVER_URL_STABLE; - return serverURL; - }; + QUrl METAVERSE_SERVER_URL_STABLE(); + QUrl METAVERSE_SERVER_URL_STAGING(); + QUrl METAVERSE_SERVER_URL(); } +const QString HIFI_URL_SCHEME = "hifi"; + #endif // hifi_NetworkingConstants_h diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9ad0cb5e79..f9dcbb7d53 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -55,7 +55,7 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) // handle domain change signals from AddressManager connect(addressManager.data(), &AddressManager::possibleDomainChangeRequired, - &_domainHandler, &DomainHandler::setSocketAndID); + &_domainHandler, &DomainHandler::setURLAndID); connect(addressManager.data(), &AddressManager::possibleDomainChangeRequiredViaICEForID, &_domainHandler, &DomainHandler::setIceServerHostnameAndID); @@ -91,7 +91,7 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) connect(accountManager.data(), &AccountManager::newKeypair, this, &NodeList::sendDomainServerCheckIn); // clear out NodeList when login is finished - connect(accountManager.data(), SIGNAL(loginComplete()) , this, SLOT(reset())); + connect(accountManager.data(), SIGNAL(loginComplete(const QUrl&)) , this, SLOT(reset())); // clear our NodeList when logout is requested connect(accountManager.data(), SIGNAL(logoutComplete()) , this, SLOT(reset())); @@ -106,7 +106,7 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) // setup our timer to send keepalive pings (it's started and stopped on domain connect/disconnect) _keepAlivePingTimer.setInterval(KEEPALIVE_PING_INTERVAL_MS); // 1s, Qt::CoarseTimer acceptable connect(&_keepAlivePingTimer, &QTimer::timeout, this, &NodeList::sendKeepAlivePings); - connect(&_domainHandler, SIGNAL(connectedToDomain(QString)), &_keepAlivePingTimer, SLOT(start())); + connect(&_domainHandler, SIGNAL(connectedToDomain(QUrl)), &_keepAlivePingTimer, SLOT(start())); connect(&_domainHandler, &DomainHandler::disconnectedFromDomain, &_keepAlivePingTimer, &QTimer::stop); // set our sockAddrBelongsToDomainOrNode method as the connection creation filter for the udt::Socket diff --git a/tools/ac-client/src/ACClientApp.cpp b/tools/ac-client/src/ACClientApp.cpp index 9eadc1dec2..4711dc4102 100644 --- a/tools/ac-client/src/ACClientApp.cpp +++ b/tools/ac-client/src/ACClientApp.cpp @@ -119,7 +119,7 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : nodeList->startThread(); const DomainHandler& domainHandler = nodeList->getDomainHandler(); - connect(&domainHandler, SIGNAL(hostnameChanged(const QString&)), SLOT(domainChanged(const QString&))); + connect(&domainHandler, SIGNAL(domainURLChanged(QUrl)), SLOT(domainChanged(QUrl))); connect(&domainHandler, &DomainHandler::domainConnectionRefused, this, &ACClientApp::domainConnectionRefused); connect(nodeList.data(), &NodeList::nodeAdded, this, &ACClientApp::nodeAdded); @@ -169,7 +169,7 @@ void ACClientApp::domainConnectionRefused(const QString& reasonMessage, int reas qDebug() << "domainConnectionRefused"; } -void ACClientApp::domainChanged(const QString& domainHostname) { +void ACClientApp::domainChanged(QUrl domainURL) { if (_verbose) { qDebug() << "domainChanged"; } diff --git a/tools/ac-client/src/ACClientApp.h b/tools/ac-client/src/ACClientApp.h index d43e78eaeb..7a31b5ef5e 100644 --- a/tools/ac-client/src/ACClientApp.h +++ b/tools/ac-client/src/ACClientApp.h @@ -29,7 +29,7 @@ public: private slots: void domainConnectionRefused(const QString& reasonMessage, int reasonCodeInt, const QString& extraInfo); - void domainChanged(const QString& domainHostname); + void domainChanged(QUrl domainURL); void nodeAdded(SharedNodePointer node); void nodeActivated(SharedNodePointer node); void nodeKilled(SharedNodePointer node); diff --git a/tools/atp-client/src/ATPClientApp.cpp b/tools/atp-client/src/ATPClientApp.cpp index dbc2ad53f6..526065b2f7 100644 --- a/tools/atp-client/src/ATPClientApp.cpp +++ b/tools/atp-client/src/ATPClientApp.cpp @@ -158,7 +158,7 @@ ATPClientApp::ATPClientApp(int argc, char* argv[]) : nodeList->startThread(); const DomainHandler& domainHandler = nodeList->getDomainHandler(); - connect(&domainHandler, SIGNAL(hostnameChanged(const QString&)), SLOT(domainChanged(const QString&))); + connect(&domainHandler, SIGNAL(domainURLChanged(QUrl)), SLOT(domainChanged(QUrl))); connect(&domainHandler, &DomainHandler::domainConnectionRefused, this, &ATPClientApp::domainConnectionRefused); connect(nodeList.data(), &NodeList::nodeAdded, this, &ATPClientApp::nodeAdded); @@ -227,7 +227,7 @@ void ATPClientApp::domainConnectionRefused(const QString& reasonMessage, int rea } } -void ATPClientApp::domainChanged(const QString& domainHostname) { +void ATPClientApp::domainChanged(QUrl domainURL) { if (_verbose) { qDebug() << "domainChanged"; } diff --git a/tools/atp-client/src/ATPClientApp.h b/tools/atp-client/src/ATPClientApp.h index 7ab4ec4a7a..63ee218e4b 100644 --- a/tools/atp-client/src/ATPClientApp.h +++ b/tools/atp-client/src/ATPClientApp.h @@ -31,7 +31,7 @@ public: private slots: void domainConnectionRefused(const QString& reasonMessage, int reasonCodeInt, const QString& extraInfo); - void domainChanged(const QString& domainHostname); + void domainChanged(QUrl domainURL); void nodeAdded(SharedNodePointer node); void nodeActivated(SharedNodePointer node); void nodeKilled(SharedNodePointer node);