make domain-manager and pals be still when interface is in serverless mode

This commit is contained in:
Seth Alves 2018-02-15 15:19:50 -08:00
parent 0f4b68c038
commit 17e2db96c6
6 changed files with 100 additions and 30 deletions

View file

@ -339,6 +339,8 @@ 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";
@ -349,8 +351,6 @@ static const QString OBJ_EXTENSION = ".obj";
static const QString AVA_JSON_EXTENSION = ".ava.json";
static const QString WEB_VIEW_TAG = "noDownload=true";
static const QString ZIP_EXTENSION = ".zip";
static const QString SERVERLESS_DOMAIN_EXTENSION = ".domain.json";
static const QString SERVERLESS_DOMAIN_GZ_EXTENSION = ".domain.json.gz";
static const float MIRROR_FULLSCREEN_DISTANCE = 0.389f;
@ -382,13 +382,13 @@ const QHash<QString, Application::AcceptURLMethod> 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 },
{ JSON_GZ_EXTENSION, &Application::askToReplaceDomainContent },
{ ZIP_EXTENSION, &Application::importFromZIP },
{ SERVERLESS_DOMAIN_EXTENSION, &Application::visitServerlessDomain },
{ SERVERLESS_DOMAIN_GZ_EXTENSION, &Application::visitServerlessDomain },
{ JPG_EXTENSION, &Application::importImage },
{ PNG_EXTENSION, &Application::importImage }
};
@ -1086,6 +1086,8 @@ 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(this, &Application::activeDisplayPluginChanged, this, &Application::updateThreadPoolCount);
connect(this, &Application::activeDisplayPluginChanged, this, [](){
qApp->setProperty(hifi::properties::HMD, qApp->isHMDMode());
@ -2944,9 +2946,25 @@ bool Application::importFromZIP(const QString& filePath) {
return true;
}
void Application::setServersEnabled(bool serversEnabled) {
qDebug() << "QQQQ serversEnabled =" << serversEnabled;
if (_serversEnabled != serversEnabled) {
_serversEnabled = serversEnabled;
auto nodeList = DependencyManager::get<NodeList>();
nodeList->getDomainHandler().setAPIRefreshTimerEnabled(serversEnabled);
if (!_serversEnabled) {
nodeList->reset();
clearDomainOctreeDetails();
}
}
}
bool Application::visitServerlessDomain(const QString& urlString) {
qDebug() << "QQQQ visit serverless domain" << urlString;
setServerlessMode(true);
DependencyManager::get<AddressManager>()->handleLookupString(urlString);
return true;
}
bool Application::importImage(const QString& urlString) {
@ -5597,10 +5615,15 @@ void Application::updateWindowTitle() const {
QString connectionStatus = nodeList->getDomainHandler().isConnected() ? "" : " (NOT CONNECTED)";
QString username = accountManager->getAccountInfo().getUsername();
QString currentPlaceName = DependencyManager::get<AddressManager>()->getHost();
if (currentPlaceName.isEmpty()) {
currentPlaceName = nodeList->getDomainHandler().getHostname();
QString currentPlaceName;
if (isServerlessMode()) {
currentPlaceName = "serverless"; // XXX filename?
} else {
currentPlaceName = DependencyManager::get<AddressManager>()->getHost();
if (currentPlaceName.isEmpty()) {
currentPlaceName = nodeList->getDomainHandler().getHostname();
}
}
QString title = QString() + (!username.isEmpty() ? username + " @ " : QString())

View file

@ -286,8 +286,7 @@ public:
bool getSaveAvatarOverrideUrl() { return _saveAvatarOverrideUrl; }
void saveNextPhysicsStats(QString filename);
bool isServerlessMode() { return _serverlessMode; }
void setServerlessMode(bool serverlessMode) { _serverlessMode = serverlessMode; }
bool isServerlessMode() const { return !_serversEnabled; }
signals:
void svoImportRequested(const QString& url);
@ -393,6 +392,8 @@ public slots:
const QString getPreferredCursor() const { return _preferredCursor.get(); }
void setPreferredCursor(const QString& cursor);
void setServersEnabled(bool enableServers);
private slots:
void onDesktopRootItemCreated(QQuickItem* qmlContext);
void onDesktopRootContextCreated(QQmlContext* qmlContext);
@ -717,6 +718,6 @@ private:
std::atomic<bool> _pendingIdleEvent { true };
std::atomic<bool> _pendingRenderEvent { true };
bool _serverlessMode { false };
bool _serversEnabled { true };
};
#endif // hifi_Application_h

View file

@ -207,8 +207,13 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) {
static QString URL_TYPE_DOMAIN_ID = "domain_id";
static QString URL_TYPE_PLACE = "place";
static QString URL_TYPE_NETWORK_ADDRESS = "network_address";
qDebug() << "QQQQ handleUrl: " << lookupUrl.toString();
if (lookupUrl.scheme() == HIFI_URL_SCHEME) {
emit setServersEnabled(true);
qCDebug(networking) << "Trying to go to URL" << lookupUrl.toString();
DependencyManager::get<NodeList>()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::LookupAddress);
@ -233,8 +238,9 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) {
// we're assuming this is either a network address or global place name
// check if it is a network address first
bool hostChanged;
if (handleNetworkAddress(lookupUrl.host()
+ (lookupUrl.port() == -1 ? "" : ":" + QString::number(lookupUrl.port())), trigger, hostChanged)) {
if (handleNetworkAddress(lookupUrl.host() +
(lookupUrl.port() == -1 ? "" : ":" + QString::number(lookupUrl.port())),
trigger, hostChanged)) {
UserActivityLogger::getInstance().wentTo(trigger, URL_TYPE_NETWORK_ADDRESS, lookupUrl.toString());
@ -274,40 +280,64 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) {
attemptPlaceNameLookup(lookupUrl.host(), lookupUrl.path(), trigger);
}
}
return true;
} else if (lookupUrl.toString().startsWith('/')) {
qCDebug(networking) << "Going to relative path" << lookupUrl.path();
qCDebug(networking) << "Going to relative path" << lookupUrl.path();
// a path lookup clears the previous lookup since we don't expect to re-attempt it
_previousLookup.clear();
// if this is a relative path then handle it as a relative viewpoint
handlePath(lookupUrl.path(), trigger, true);
emit lookupResultsFinished();
return true;
} else if (lookupUrl.scheme() == "http" || lookupUrl.scheme() == "https") {
qDebug() << "QQQQ do http before serverless domain" << lookupUrl.toString();
emit setServersEnabled(false);
emit lookupResultsFinished();
return true;
} else if (lookupUrl.scheme() == "file") {
qDebug() << "QQQQ load serverless domain " << lookupUrl.toString();
emit setServersEnabled(false);
emit lookupResultsFinished();
return true;
}
return false;
}
bool isPossiblePlaceName(QString possiblePlaceName) {
bool result { false };
int len = possiblePlaceName.length();
if (possiblePlaceName != "localhost" && len >= 4 && len <= 64) {
const QRegExp PLACE_NAME_REGEX = QRegExp("^[0-9A-Za-z](([0-9A-Za-z]|-(?!-))*[^\\W_]$|$)");
result = PLACE_NAME_REGEX.indexIn(possiblePlaceName) == 0;
}
qDebug() << "isPossiblePlaceName: " << possiblePlaceName << " " << result;
return result;
}
void AddressManager::handleLookupString(const QString& lookupString, bool fromSuggestions) {
if (!lookupString.isEmpty()) {
// make this a valid hifi URL and handle it off to handleUrl
QString sanitizedString = lookupString.trimmed();
QUrl lookupURL;
if (!lookupString.startsWith('/')) {
if (lookupString.toLower().startsWith(HIFI_URL_SCHEME + ":/") || isPossiblePlaceName(sanitizedString)) {
// sometimes we need to handle lookupStrings like hifi:/somewhere
const QRegExp HIFI_SCHEME_REGEX = QRegExp(HIFI_URL_SCHEME + ":\\/{1,2}", Qt::CaseInsensitive);
sanitizedString = sanitizedString.remove(HIFI_SCHEME_REGEX);
lookupURL = QUrl(HIFI_URL_SCHEME + "://" + sanitizedString);
} else {
lookupURL = QUrl(lookupString);
sanitizedString = HIFI_URL_SCHEME + "://" + sanitizedString;
}
lookupURL = QUrl(sanitizedString);
qDebug() << "QQQQ handleLookupString: " << lookupString << " " << lookupURL.toString();
handleUrl(lookupURL, fromSuggestions ? Suggestions : UserInput);
}
}
@ -426,7 +456,7 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const
if (setHost(domainIDString, trigger)) {
trigger = LookupTrigger::Internal;
}
// this isn't a place, so clear the place name
_placeName.clear();
}
@ -664,8 +694,8 @@ bool AddressManager::handleViewpoint(const QString& viewpointString, bool should
qCDebug(networking) << "Orientation parsed from lookup string is invalid. Will not use for location change.";
}
}
emit locationChangeRequired(newPosition, orientationChanged,
emit locationChangeRequired(newPosition, orientationChanged,
trigger == LookupTrigger::VisitUserFromPAL ? cancelOutRollAndPitch(newOrientation): newOrientation,
shouldFace
);
@ -697,7 +727,7 @@ bool AddressManager::handleUsername(const QString& lookupString) {
bool AddressManager::setHost(const QString& host, LookupTrigger trigger, quint16 port) {
if (host != _host || port != _port) {
addCurrentAddressToHistory(trigger);
_port = port;

View file

@ -369,7 +369,7 @@ signals:
* location.pathChangeRequired.connect(onPathChangeRequired);
*/
void pathChangeRequired(const QString& newPath);
/**jsdoc
* Triggered when you navigate to a new domain.
* @function location.hostChanged
@ -416,6 +416,9 @@ signals:
*/
void goForwardPossible(bool isPossible);
void setServersEnabled(bool serversEnabled);
protected:
AddressManager();
private slots:

View file

@ -38,7 +38,7 @@ DomainHandler::DomainHandler(QObject* parent) :
// if we get a socket that make sure our NetworkPeer ping timer stops
connect(this, &DomainHandler::completedSocketDiscovery, &_icePeer, &NetworkPeer::stopPingTimer);
// setup a timeout for failure on settings requests
static const int DOMAIN_SETTINGS_TIMEOUT_MS = 5000;
_settingsTimer.setInterval(DOMAIN_SETTINGS_TIMEOUT_MS); // 5s, Qt::CoarseTimer acceptable
@ -48,13 +48,23 @@ DomainHandler::DomainHandler(QObject* parent) :
const int API_REFRESH_TIMEOUT_MSEC = 2500;
_apiRefreshTimer.setInterval(API_REFRESH_TIMEOUT_MSEC); // 2.5s, Qt::CoarseTimer acceptable
auto addressManager = DependencyManager::get<AddressManager>();
connect(&_apiRefreshTimer, &QTimer::timeout, addressManager.data(), &AddressManager::refreshPreviousLookup);
connect(&_apiRefreshTimer, &QTimer::timeout, [this] {
if (_apiRefreshTimerEnabled) {
auto addressManager = DependencyManager::get<AddressManager>();
if (addressManager) {
addressManager->refreshPreviousLookup();
}
}
});
// stop the refresh timer if we connect to a domain
connect(this, &DomainHandler::connectedToDomain, &_apiRefreshTimer, &QTimer::stop);
}
void DomainHandler::setAPIRefreshTimerEnabled(bool enabled) {
_apiRefreshTimerEnabled = enabled;
}
void DomainHandler::disconnect() {
// if we're currently connected to a domain, send a disconnect packet on our way out
if (_isConnected) {

View file

@ -138,6 +138,8 @@ public:
TooManyUsers
};
void setAPIRefreshTimerEnabled(bool enabled);
public slots:
void setSocketAndID(const QString& hostname, quint16 port = DEFAULT_DOMAIN_SERVER_PORT, const QUuid& id = QUuid());
void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id);
@ -198,6 +200,7 @@ private:
int _checkInPacketsSinceLastReply { 0 };
QTimer _apiRefreshTimer;
bool _apiRefreshTimerEnabled { true };
};
#endif // hifi_DomainHandler_h