From f27105100a8e9c2c3482e93b275226836b18bbe5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 3 Oct 2014 10:29:02 -0700 Subject: [PATCH] have AddressManager know its current domain and current path --- interface/src/Application.cpp | 8 ++- interface/src/Application.h | 2 + .../scripting/LocationScriptingInterface.cpp | 4 +- libraries/networking/src/AddressManager.cpp | 55 +++++++++++++++---- libraries/networking/src/AddressManager.h | 16 +++++- 5 files changed, 66 insertions(+), 19 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 51b78b6901..802648d247 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -299,6 +299,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : AddressManager& addressManager = AddressManager::getInstance(); + // use our MyAvatar position and quat for address manager path + addressManager.setPositionGetter(getPositionForPath); + addressManager.setOrientationGetter(getOrientationForPath); + // handle domain change signals from AddressManager connect(&addressManager, &AddressManager::possibleDomainChangeRequiredToHostname, this, &Application::changeDomainHostname); @@ -3458,9 +3462,7 @@ void Application::updateLocationInServer() { QJsonObject locationObject; - QString pathString = AddressManager::pathForPositionAndOrientation(_myAvatar->getPosition(), - true, - _myAvatar->getOrientation()); + QString pathString = AddressManager::getInstance().currentPath(); const QString LOCATION_KEY_IN_ROOT = "location"; const QString PATH_KEY_IN_LOCATION = "path"; diff --git a/interface/src/Application.h b/interface/src/Application.h index e50039a20e..ca26cffab8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -140,6 +140,8 @@ class Application : public QApplication { public: static Application* getInstance() { return static_cast(QCoreApplication::instance()); } static QString& resourcesPath(); + static const glm::vec3& getPositionForPath() { return getInstance()->_myAvatar->getPosition(); } + static glm::quat getOrientationForPath() { return getInstance()->_myAvatar->getOrientation(); } Application(int& argc, char** argv, QElapsedTimer &startup_time); ~Application(); diff --git a/interface/src/scripting/LocationScriptingInterface.cpp b/interface/src/scripting/LocationScriptingInterface.cpp index bf529fb593..047b76dab6 100644 --- a/interface/src/scripting/LocationScriptingInterface.cpp +++ b/interface/src/scripting/LocationScriptingInterface.cpp @@ -29,9 +29,7 @@ QString LocationScriptingInterface::getHref() { } QString LocationScriptingInterface::getPathname() { - MyAvatar* applicationAvatar = Application::getInstance()->getAvatar(); - return AddressManager::pathForPositionAndOrientation(applicationAvatar->getPosition(), - true, applicationAvatar->getOrientation()); + return AddressManager::getInstance().currentPath(); } QString LocationScriptingInterface::getHostname() { diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index a78e1e76a4..b1efbd3c6f 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -22,17 +22,36 @@ AddressManager& AddressManager::getInstance() { return sharedInstance; } -QString AddressManager::pathForPositionAndOrientation(const glm::vec3& position, bool hasOrientation, - const glm::quat& orientation) { +AddressManager::AddressManager() : + _currentDomain(), + _positionGetter(NULL), + _orientationGetter(NULL) +{ - QString pathString = "/" + createByteArray(position); +} + +const QString AddressManager::currentPath(bool withOrientation) const { - if (hasOrientation) { - QString orientationString = createByteArray(orientation); - pathString += "/" + orientationString; + if (_positionGetter) { + QString pathString = "/" + createByteArray(_positionGetter()); + + if (withOrientation) { + if (_orientationGetter) { + QString orientationString = createByteArray(_orientationGetter()); + pathString += "/" + orientationString; + } else { + qDebug() << "Cannot add orientation to path without a getter for position." + << "Call AdressManager::setOrientationGetter to pass a function that will return a glm::quat"; + } + + } + + return pathString; + } else { + qDebug() << "Cannot create address path without a getter for position." + << "Call AdressManager::setPositionGetter to pass a function that will return a const glm::vec3&"; + return QString(); } - - return pathString; } const JSONCallbackParameters& AddressManager::apiCallbackParameters() { @@ -134,6 +153,11 @@ void AddressManager::handleAPIResponse(const QJsonObject &jsonObject) { emit possibleDomainChangeRequiredViaICEForID(iceServerAddress, domainID); } + // set our current domain to the name that came back + const QString DOMAIN_NAME_KEY = "name"; + + _currentDomain = domainObject[DOMAIN_NAME_KEY].toString(); + // take the path that came back const QString LOCATION_KEY = "location"; const QString LOCATION_PATH_KEY = "path"; @@ -144,7 +168,7 @@ void AddressManager::handleAPIResponse(const QJsonObject &jsonObject) { } else if (domainObject.contains(LOCATION_KEY)) { returnedPath = domainObject[LOCATION_KEY].toObject()[LOCATION_PATH_KEY].toString(); } - + bool shouldFaceViewpoint = dataObject.contains(ADDRESS_API_ONLINE_KEY); if (!returnedPath.isEmpty()) { @@ -194,16 +218,25 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString) { QRegExp hostnameRegex(HOSTNAME_REGEX_STRING, Qt::CaseInsensitive); if (hostnameRegex.indexIn(lookupString) != -1) { - emit possibleDomainChangeRequiredToHostname(hostnameRegex.cap(0)); + QString domainHostname = hostnameRegex.cap(0); + + emit possibleDomainChangeRequiredToHostname(domainHostname); emit lookupResultsFinished(); + + _currentDomain = domainHostname; + return true; } QRegExp ipAddressRegex(IP_ADDRESS_REGEX_STRING); if (ipAddressRegex.indexIn(lookupString) != -1) { - emit possibleDomainChangeRequiredToHostname(ipAddressRegex.cap(0)); + QString domainIPString = ipAddressRegex.cap(0); + + emit possibleDomainChangeRequiredToHostname(domainIPString); emit lookupResultsFinished(); + + _currentDomain = domainIPString; return true; } diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 128c395cb4..09fd6be55e 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -21,15 +21,21 @@ static const QString HIFI_URL_SCHEME = "hifi"; +typedef const glm::vec3& (*PositionGetter)(); +typedef glm::quat (*OrientationGetter)(); + class AddressManager : public QObject { Q_OBJECT public: static AddressManager& getInstance(); - static QString pathForPositionAndOrientation(const glm::vec3& position, bool hasOrientation = false, - const glm::quat& orientation = glm::quat()); + const QString currentPath(bool withOrientation = true) const; void attemptPlaceNameLookup(const QString& lookupString); + + void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; } + void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; } + public slots: void handleLookupString(const QString& lookupString); @@ -46,6 +52,8 @@ signals: bool hasOrientationChange, const glm::quat& newOrientation, bool shouldFaceLocation); private: + AddressManager(); + const JSONCallbackParameters& apiCallbackParameters(); bool handleUrl(const QUrl& lookupUrl); @@ -53,6 +61,10 @@ private: bool handleNetworkAddress(const QString& lookupString); bool handleRelativeViewpoint(const QString& pathSubsection, bool shouldFace = false); bool handleUsername(const QString& lookupString); + + QString _currentDomain; + PositionGetter _positionGetter; + OrientationGetter _orientationGetter; }; #endif // hifi_AddressManager_h \ No newline at end of file