15 #ifndef hifi_AddressManager_h
16 #define hifi_AddressManager_h
18 #include <QtCore/QObject>
19 #include <QtCore/QStack>
21 #include <glm/glm.hpp>
22 #include <glm/gtc/quaternion.hpp>
24 #include <DependencyManager.h>
26 #include "AccountManager.h"
28 extern const QString REDIRECT_HIFI_ADDRESS;
29 extern const QString DEFAULT_OVERTE_ADDRESS;
30 extern const QString DEFAULT_HOME_ADDRESS;
32 const QString SANDBOX_HIFI_ADDRESS =
"hifi://localhost";
33 const QString INDEX_PATH =
"/";
35 const QString GET_PLACE =
"/api/v1/places/%1";
134 class AddressManager :
public QObject,
public Dependency {
137 Q_PROPERTY(
bool isConnected READ isConnected)
138 Q_PROPERTY(QUrl href READ currentShareableAddress)
139 Q_PROPERTY(QString protocol READ getProtocol)
140 Q_PROPERTY(QString hostname READ getHost)
141 Q_PROPERTY(QString pathname READ currentPath)
142 Q_PROPERTY(QString placename READ getPlaceName)
143 Q_PROPERTY(QString domainID READ getDomainID)
145 using PositionGetter = std::function<glm::vec3()>;
146 using OrientationGetter = std::function<glm::quat()>;
219 Q_ENUM(LookupTrigger)
222 QString getProtocol()
const;
224 QUrl currentAddress(
bool domainOnly =
false)
const;
225 QUrl currentFacingAddress()
const;
226 QUrl currentShareableAddress(
bool domainOnly =
false)
const;
227 QUrl currentPublicAddress(
bool domainOnly =
false)
const;
228 QUrl currentFacingShareableAddress()
const;
229 QUrl currentFacingPublicAddress()
const;
230 QString currentPath(
bool withOrientation =
true)
const;
231 QString currentFacingPath()
const;
233 QUrl lastAddress()
const;
235 const QUuid& getRootPlaceID()
const {
return _rootPlaceID; }
236 QString getPlaceName()
const;
237 QString getDomainID()
const;
239 QString getHost()
const {
return _domainURL.host(); }
241 void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; }
242 void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; }
244 void loadSettings(
const QString& lookupString = QString());
246 const QStack<QUrl>& getBackStack()
const {
return _backStack; }
247 const QStack<QUrl>& getForwardStack()
const {
return _forwardStack; }
249 QUrl getDomainURL() {
return _domainURL; }
262 void handleLookupString(
const QString& lookupString,
bool fromSuggestions =
false);
276 bool goToViewpointForPath(
const QString& viewpointString,
const QString& pathString)
277 {
return handleViewpoint(viewpointString,
false, DomainPathResponse,
false, pathString); }
298 void goToLocalSandbox(QString path =
"", LookupTrigger trigger = LookupTrigger::StartupFromSettings) {
299 handleUrl(SANDBOX_HIFI_ADDRESS + path, trigger);
308 void goToEntry(LookupTrigger trigger = LookupTrigger::StartupFromSettings);
317 void goToUser(
const QString& username,
bool shouldMatchOrientation =
true);
323 void goToLastAddress();
330 bool canGoBack()
const;
339 void refreshPreviousLookup();
346 void storeCurrentAddress();
369 void lookupShareableNameForDomainID(
const QUuid& domainID);
378 void lookupResultsFinished();
386 void lookupResultIsOffline();
394 void lookupResultIsNotFound();
404 void possibleDomainChangeRequired(QUrl domainURL, QUuid domainID);
414 void possibleDomainChangeRequiredViaICEForID(
const QString& iceServerHostname,
const QUuid& domainID);
438 void locationChangeRequired(
const glm::vec3& newPosition,
439 bool hasOrientationChange,
const glm::quat& newOrientation,
440 bool shouldFaceLocation);
455 void pathChangeRequired(
const QString& newPath);
469 void hostChanged(
const QString& newHost);
485 void goBackPossible(
bool isPossible);
501 void goForwardPossible(
bool isPossible);
504 void handleAPIResponse(QNetworkReply* requestReply);
505 void handleAPIError(QNetworkReply* errorReply);
507 void handleShareableNameAPIResponse(QNetworkReply* requestReply);
510 void goToAddressFromObject(
const QVariantMap& addressMap,
const QNetworkReply* reply);
513 bool setHost(
const QString& host, LookupTrigger trigger, quint16 port = 0);
514 bool setDomainInfo(
const QUrl& domainURL, LookupTrigger trigger);
516 const JSONCallbackParameters& apiCallbackParameters();
518 bool handleUrl(
const QUrl& lookupUrl, LookupTrigger trigger = UserInput,
const QString& lookupUrlInString =
"");
520 bool handleNetworkAddress(
const QString& lookupString, LookupTrigger trigger,
bool& hostChanged);
521 void handlePath(
const QString& path, LookupTrigger trigger,
bool wasPathOnly =
false);
522 bool handleViewpoint(
const QString& viewpointString,
bool shouldFace, LookupTrigger trigger,
523 bool definitelyPathOnly =
false,
const QString& pathString = QString());
524 bool handleUsername(
const QString& lookupString);
525 bool handleDomainID(
const QString& host);
527 void attemptPlaceNameLookup(
const QString& lookupString,
const QString& overridePath, LookupTrigger trigger);
528 void attemptDomainIDLookup(
const QString& lookupString,
const QString& overridePath, LookupTrigger trigger);
530 void addCurrentAddressToHistory(LookupTrigger trigger);
532 void resetConfirmConnectWithoutAvatarEntities();
535 QUrl _lastVisitedURL;
538 PositionGetter _positionGetter;
539 OrientationGetter _orientationGetter;
541 QString _shareablePlaceName;
543 QStack<QUrl> _backStack;
544 QStack<QUrl> _forwardStack;
545 quint64 _lastBackPush = 0;
547 QString _newHostLookupPath;
549 QUrl _previousAPILookup;
552 Q_DECLARE_METATYPE(AddressManager::LookupTrigger)