From 483d072709c086f20eec186984f4a45f7ad0cc36 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Jan 2015 10:47:57 -0800 Subject: [PATCH] handle override path from address bar --- libraries/networking/src/AccountManager.cpp | 27 +++++++--- libraries/networking/src/AccountManager.h | 9 ++-- libraries/networking/src/AddressManager.cpp | 60 ++++++++++++++------- libraries/networking/src/AddressManager.h | 4 +- 4 files changed, 70 insertions(+), 30 deletions(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 0c63ecc731..067bd110c4 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -158,7 +158,8 @@ void AccountManager::setAuthURL(const QUrl& authURL) { void AccountManager::authenticatedRequest(const QString& path, QNetworkAccessManager::Operation operation, const JSONCallbackParameters& callbackParams, const QByteArray& dataByteArray, - QHttpMultiPart* dataMultiPart) { + QHttpMultiPart* dataMultiPart, + const QVariantMap& propertyMap) { QMetaObject::invokeMethod(this, "invokedRequest", Q_ARG(const QString&, path), @@ -166,13 +167,15 @@ void AccountManager::authenticatedRequest(const QString& path, QNetworkAccessMan Q_ARG(QNetworkAccessManager::Operation, operation), Q_ARG(const JSONCallbackParameters&, callbackParams), Q_ARG(const QByteArray&, dataByteArray), - Q_ARG(QHttpMultiPart*, dataMultiPart)); + Q_ARG(QHttpMultiPart*, dataMultiPart), + Q_ARG(QVariantMap, propertyMap)); } void AccountManager::unauthenticatedRequest(const QString& path, QNetworkAccessManager::Operation operation, - const JSONCallbackParameters& callbackParams, - const QByteArray& dataByteArray, - QHttpMultiPart* dataMultiPart) { + const JSONCallbackParameters& callbackParams, + const QByteArray& dataByteArray, + QHttpMultiPart* dataMultiPart, + const QVariantMap& propertyMap) { QMetaObject::invokeMethod(this, "invokedRequest", Q_ARG(const QString&, path), @@ -180,14 +183,16 @@ void AccountManager::unauthenticatedRequest(const QString& path, QNetworkAccessM Q_ARG(QNetworkAccessManager::Operation, operation), Q_ARG(const JSONCallbackParameters&, callbackParams), Q_ARG(const QByteArray&, dataByteArray), - Q_ARG(QHttpMultiPart*, dataMultiPart)); + Q_ARG(QHttpMultiPart*, dataMultiPart), + Q_ARG(QVariantMap, propertyMap)); } void AccountManager::invokedRequest(const QString& path, bool requiresAuthentication, QNetworkAccessManager::Operation operation, const JSONCallbackParameters& callbackParams, - const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart) { + const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart, + const QVariantMap& propertyMap) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); @@ -255,6 +260,14 @@ void AccountManager::invokedRequest(const QString& path, } if (networkReply) { + if (!propertyMap.isEmpty()) { + // we have properties to set on the reply so the user can check them after + foreach(const QString& propertyKey, propertyMap.keys()) { + networkReply->setProperty(qPrintable(propertyKey), propertyMap.value(propertyKey)); + } + } + + if (!callbackParams.isEmpty()) { // if we have information for a callback, insert the callbackParams into our local map _pendingCallbackMap.insert(networkReply, callbackParams); diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index 53512a8bb3..06fe366d69 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -48,13 +48,15 @@ public: QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation, const JSONCallbackParameters& callbackParams = JSONCallbackParameters(), const QByteArray& dataByteArray = QByteArray(), - QHttpMultiPart* dataMultiPart = NULL); + QHttpMultiPart* dataMultiPart = NULL, + const QVariantMap& propertyMap = QVariantMap()); void unauthenticatedRequest(const QString& path, QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation, const JSONCallbackParameters& callbackParams = JSONCallbackParameters(), const QByteArray& dataByteArray = QByteArray(), - QHttpMultiPart* dataMultiPart = NULL); + QHttpMultiPart* dataMultiPart = NULL, + const QVariantMap& propertyMap = QVariantMap()) ; const QUrl& getAuthURL() const { return _authURL; } void setAuthURL(const QUrl& authURL); @@ -109,7 +111,8 @@ private: QNetworkAccessManager::Operation operation, const JSONCallbackParameters& callbackParams, const QByteArray& dataByteArray, - QHttpMultiPart* dataMultiPart); + QHttpMultiPart* dataMultiPart, + const QVariantMap& propertyMap); QUrl _authURL; QMap _pendingCallbackMap; diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index fba3861f43..54f45304ad 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -119,14 +119,16 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl) { if (!handleUsername(lookupUrl.authority())) { // we're assuming this is either a network address or global place name // check if it is a network address first - if (!handleNetworkAddress(lookupUrl.host() + if (handleNetworkAddress(lookupUrl.host() + (lookupUrl.port() == -1 ? "" : ":" + QString::number(lookupUrl.port())))) { + // we may have a path that defines a relative viewpoint - if so we should jump to that now + handleRelativeViewpoint(lookupUrl.path()); + } else { // wasn't an address - lookup the place name - attemptPlaceNameLookup(lookupUrl.host()); + // we may have a path that defines a relative viewpoint - pass that through the lookup so we can go to it after + attemptPlaceNameLookup(lookupUrl.host(), lookupUrl.path()); + } - - // we may have a path that defines a relative viewpoint - if so we should jump to that now - handleRelativeViewpoint(lookupUrl.path()); } return true; @@ -164,12 +166,14 @@ void AddressManager::handleAPIResponse(QNetworkReply& requestReply) { QJsonObject responseObject = QJsonDocument::fromJson(requestReply.readAll()).object(); QJsonObject dataObject = responseObject["data"].toObject(); - goToAddressFromObject(dataObject.toVariantMap()); + goToAddressFromObject(dataObject.toVariantMap(), requestReply); emit lookupResultsFinished(); } -void AddressManager::goToAddressFromObject(const QVariantMap& dataObject) { +const char OVERRIDE_PATH_KEY[] = "override_path"; + +void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const QNetworkReply& reply) { const QString DATA_OBJECT_PLACE_KEY = "place"; const QString DATA_OBJECT_USER_LOCATION_KEY = "location"; @@ -223,18 +227,29 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject) { QString newRootPlaceName = rootMap[PLACE_NAME_KEY].toString(); setRootPlaceName(newRootPlaceName); - // take the path that came back - const QString PLACE_PATH_KEY = "path"; - QString returnedPath = locationMap[PLACE_PATH_KEY].toString(); + // check if we had a path to override the path returned + QString overridePath = reply.property(OVERRIDE_PATH_KEY).toString(); - bool shouldFaceViewpoint = locationMap.contains(LOCATION_API_ONLINE_KEY); - - if (!returnedPath.isEmpty()) { - // try to parse this returned path as a viewpoint, that's the only thing it could be for now - if (!handleRelativeViewpoint(returnedPath, shouldFaceViewpoint)) { - qDebug() << "Received a location path that was could not be handled as a viewpoint -" << returnedPath; + if (!overridePath.isEmpty()) { + if (!handleRelativeViewpoint(overridePath)){ + qDebug() << "User entered path could not be handled as a viewpoint - " << overridePath; + } + } else { + // take the path that came back + const QString PLACE_PATH_KEY = "path"; + QString returnedPath = locationMap[PLACE_PATH_KEY].toString(); + + bool shouldFaceViewpoint = locationMap.contains(LOCATION_API_ONLINE_KEY); + + if (!returnedPath.isEmpty()) { + // try to parse this returned path as a viewpoint, that's the only thing it could be for now + if (!handleRelativeViewpoint(returnedPath, shouldFaceViewpoint)) { + qDebug() << "Received a location path that was could not be handled as a viewpoint -" << returnedPath; + } } } + + } else { qDebug() << "Received an address manager API response with no domain key. Cannot parse."; qDebug() << locationMap; @@ -260,12 +275,21 @@ void AddressManager::handleAPIError(QNetworkReply& errorReply) { const QString GET_PLACE = "/api/v1/places/%1"; -void AddressManager::attemptPlaceNameLookup(const QString& lookupString) { +void AddressManager::attemptPlaceNameLookup(const QString& lookupString, const QString& overridePath) { // assume this is a place name and see if we can get any info on it QString placeName = QUrl::toPercentEncoding(lookupString); + + QVariantMap requestParams; + if (!overridePath.isEmpty()) { + requestParams.insert(OVERRIDE_PATH_KEY, overridePath); + } + AccountManager::getInstance().unauthenticatedRequest(GET_PLACE.arg(placeName), QNetworkAccessManager::GetOperation, - apiCallbackParameters()); + apiCallbackParameters(), + QByteArray(), + NULL, + requestParams); } bool AddressManager::handleNetworkAddress(const QString& lookupString) { diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 58e4e88330..3071d68ea2 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -47,7 +47,7 @@ public: const QString& getRootPlaceName() const { return _rootPlaceName; } void setRootPlaceName(const QString& rootPlaceName); - void attemptPlaceNameLookup(const QString& lookupString); + void attemptPlaceNameLookup(const QString& lookupString, const QString& overridePath = QString()); void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; } void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; } @@ -57,7 +57,7 @@ public: public slots: void handleLookupString(const QString& lookupString); void goToUser(const QString& username); - void goToAddressFromObject(const QVariantMap& addressMap); + void goToAddressFromObject(const QVariantMap& addressMap, const QNetworkReply& reply); void storeCurrentAddress();