From e5fc2e552550dc03fa933d8a291c5fd06490326d Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 8 Oct 2015 14:03:59 -0700 Subject: [PATCH] Low level support for URL overrides when loading content --- .../src/EntityTreeRenderer.cpp | 4 +- libraries/networking/src/ResourceManager.cpp | 38 +++++++++++++++++-- libraries/networking/src/ResourceManager.h | 2 + .../procedural/src/procedural/Procedural.cpp | 1 + 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 7dea243145..fb9ab6563b 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -704,7 +704,9 @@ void EntityTreeRenderer::checkAndCallPreload(const EntityItemID& entityID, const if (_tree && !_shuttingDown) { EntityItemPointer entity = getTree()->findEntityByEntityItemID(entityID); if (entity && !entity->getScript().isEmpty()) { - _entitiesScriptEngine->loadEntityScript(entityID, entity->getScript(), reload); + QString scriptUrl = entity->getScript(); + scriptUrl = ResourceManager::normalizeURL(scriptUrl); + _entitiesScriptEngine->loadEntityScript(entityID, scriptUrl, reload); } } } diff --git a/libraries/networking/src/ResourceManager.cpp b/libraries/networking/src/ResourceManager.cpp index 774664f2c8..6b97018ed9 100644 --- a/libraries/networking/src/ResourceManager.cpp +++ b/libraries/networking/src/ResourceManager.cpp @@ -17,7 +17,37 @@ #include -QUrl ResourceManager::normalizeURL(const QUrl& url) { + +using PrefixMap = std::map; +static PrefixMap PREFIX_MAP; +static QMutex PREFIX_MAP_LOCK; + +void ResourceManager::setUrlPrefixOverride(const QString& prefix, const QString& replacement) { + QMutexLocker locker(&PREFIX_MAP_LOCK); + PREFIX_MAP[prefix] = replacement; +} + +QString ResourceManager::normalizeURL(const QString& urlString) { + QString result = urlString; + QMutexLocker locker(&PREFIX_MAP_LOCK); + bool modified{ false }; + foreach(const auto& entry, PREFIX_MAP) { + const auto& prefix = entry.first; + const auto& replacement = entry.second; + if (result.startsWith(prefix)) { + qDebug() << prefix; + result.replace(0, prefix.size(), replacement); + modified = true; + } + } + if (modified) { + qDebug() << result; + } + return result; +} + +QUrl ResourceManager::normalizeURL(const QUrl& originalUrl) { + QUrl url = QUrl(normalizeURL(originalUrl.toString())); auto scheme = url.scheme(); if (!(scheme == URL_SCHEME_FILE || scheme == URL_SCHEME_HTTP || scheme == URL_SCHEME_HTTPS || scheme == URL_SCHEME_FTP || @@ -37,11 +67,11 @@ ResourceRequest* ResourceManager::createResourceRequest(QObject* parent, const Q auto normalizedURL = normalizeURL(url); auto scheme = normalizedURL.scheme(); if (scheme == URL_SCHEME_FILE) { - return new FileResourceRequest(parent, url); + return new FileResourceRequest(parent, normalizedURL); } else if (scheme == URL_SCHEME_HTTP || scheme == URL_SCHEME_HTTPS || scheme == URL_SCHEME_FTP) { - return new HTTPResourceRequest(parent, url); + return new HTTPResourceRequest(parent, normalizedURL); } else if (scheme == URL_SCHEME_ATP) { - return new AssetResourceRequest(parent, url); + return new AssetResourceRequest(parent, normalizedURL); } qDebug() << "Unknown scheme (" << scheme << ") for URL: " << url.url(); diff --git a/libraries/networking/src/ResourceManager.h b/libraries/networking/src/ResourceManager.h index 40b67b1cd1..58f4679c97 100644 --- a/libraries/networking/src/ResourceManager.h +++ b/libraries/networking/src/ResourceManager.h @@ -24,6 +24,8 @@ const QString URL_SCHEME_ATP = "atp"; class ResourceManager { public: + static void setUrlPrefixOverride(const QString& prefix, const QString& replacement); + static QString normalizeURL(const QString& urlString); static QUrl normalizeURL(const QUrl& url); static ResourceRequest* createResourceRequest(QObject* parent, const QUrl& url); }; diff --git a/libraries/procedural/src/procedural/Procedural.cpp b/libraries/procedural/src/procedural/Procedural.cpp index f5448bda5c..a0020d21f3 100644 --- a/libraries/procedural/src/procedural/Procedural.cpp +++ b/libraries/procedural/src/procedural/Procedural.cpp @@ -88,6 +88,7 @@ void Procedural::parse(const QJsonObject& proceduralData) { // Get the path to the shader { QString shaderUrl = proceduralData[URL_KEY].toString(); + shaderUrl = ResourceManager::normalizeURL(shaderUrl); _shaderUrl = QUrl(shaderUrl); if (!_shaderUrl.isValid()) { qWarning() << "Invalid shader URL: " << shaderUrl;