From aaabe6b1e1a2353a9b12a412de230ff18e6db945 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 11 Sep 2014 10:45:45 -0700 Subject: [PATCH] handle domain changes via address bar --- interface/src/Application.cpp | 12 ++++++++++++ interface/src/Application.h | 1 + interface/src/avatar/MyAvatar.cpp | 5 +---- libraries/networking/src/AddressManager.cpp | 13 +++++++++++++ libraries/networking/src/AddressManager.h | 1 + libraries/networking/src/DomainHandler.h | 3 ++- 6 files changed, 30 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c123dfa1f4..2fa9701e18 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -407,6 +407,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : connect(_window, &MainWindow::windowGeometryChanged, _runningScriptsWidget, &RunningScriptsWidget::setBoundary); + // connect to the domainChangeRequired signal on AddressManager + connect(&AddressManager::getInstance(), &AddressManager::domainChangeRequired, this, &Application::changeDomainHostname); + //When -url in command line, teleport to location urlGoTo(argc, constArgv); @@ -3391,6 +3394,15 @@ void Application::updateLocationInServer() { } } +void Application::changeDomainHostname(const QString &newDomainHostname) { + // tell the MyAvatar object to send a kill packet so that it dissapears from its old avatar mixer immediately + _myAvatar->sendKillAvatar(); + + // call the domain hostname change as a queued connection on the nodelist + QMetaObject::invokeMethod(&NodeList::getInstance()->getDomainHandler(), "setHostname", + Q_ARG(const QString&, newDomainHostname)); +} + void Application::domainChanged(const QString& domainHostname) { updateWindowTitle(); diff --git a/interface/src/Application.h b/interface/src/Application.h index f48d88d7a4..6f4bc02e94 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -313,6 +313,7 @@ signals: void importDone(); public slots: + void changeDomainHostname(const QString& newDomainHostname); void domainChanged(const QString& domainHostname); void updateWindowTitle(); void updateLocationInServer(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 14120a7e2c..b4335512ef 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1802,10 +1802,7 @@ void MyAvatar::resetSize() { qDebug("Reseted scale to %f", _targetScale); } -void MyAvatar::goToLocation(const glm::vec3& newPosition, bool hasOrientation, const glm::vec3& newOrientation) { - // send a node kill request, indicating to other clients that they should play the "disappeared" effect - sendKillAvatar(); - +void MyAvatar::goToLocation(const glm::vec3& newPosition, bool hasOrientation, const glm::vec3& newOrientation) { glm::quat quatOrientation = getOrientation(); qDebug().nospace() << "MyAvatar goToLocation - moving to " << newPosition.x << ", " diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 6413fe6580..5f6e0652c2 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -42,10 +42,23 @@ void AddressManager::handleLookupString(const QString& lookupString) { bool AddressManager::lookupHandledAsNetworkAddress(const QString& lookupString) { const QString IP_ADDRESS_REGEX_STRING = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; + const QString HOSTNAME_REGEX_STRING = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*" "([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$"; + QRegExp hostnameRegex(HOSTNAME_REGEX_STRING); + if (hostnameRegex.indexIn(lookupString) != -1) { + emit domainChangeRequired(hostnameRegex.cap(0)); + return true; + } + + QRegExp ipAddressRegex(IP_ADDRESS_REGEX_STRING); + + if (ipAddressRegex.indexIn(lookupString) != -1) { + emit domainChangeRequired(ipAddressRegex.cap(0)); + return true; + } return false; } diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 5c1a5c2e89..e43102dd42 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -23,6 +23,7 @@ public: void handleLookupString(const QString& lookupString); signals: + void domainChangeRequired(const QString& newHostname); void locationChangeRequired(const glm::vec3& newPosition, bool hasOrientationChange, const glm::vec3& newOrientation); private: bool lookupHandledAsNetworkAddress(const QString& lookupString); diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 91caddca22..c65d687f5f 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -40,7 +40,6 @@ public: void setUUID(const QUuid& uuid) { _uuid = uuid; } const QString& getHostname() const { return _hostname; } - void setHostname(const QString& hostname); const QHostAddress& getIP() const { return _sockAddr.getAddress(); } void setIPToLocalhost() { _sockAddr.setAddress(QHostAddress(QHostAddress::LocalHost)); } @@ -63,6 +62,8 @@ public: void parseDTLSRequirementPacket(const QByteArray& dtlsRequirementPacket); void softReset(); +public slots: + void setHostname(const QString& hostname); private slots: void completedHostnameLookup(const QHostInfo& hostInfo);