Make base URLs for external resources modifiable

This commit is contained in:
Dale Glass 2020-09-10 01:03:49 +02:00
parent 0310764013
commit 84e01630ee
3 changed files with 61 additions and 0 deletions

View file

@ -5544,6 +5544,21 @@ void Application::loadSettings() {
}
getMyAvatar()->loadData();
auto bucketEnum = QMetaEnum::fromType<ExternalResource::Bucket>();
auto er = ExternalResource::getInstance();
for(int i=0;i<bucketEnum.keyCount();i++) {
const char *keyName = bucketEnum.key(i);
QString setting("ExternalResource/");
setting += keyName;
auto bucket = static_cast<ExternalResource::Bucket>(bucketEnum.keyToValue(keyName));
Setting::Handle<QString> url(setting, er->getBase(bucket));
er->setBase( bucket, url.get() );
}
_settingsLoaded = true;
}
@ -5560,6 +5575,18 @@ void Application::saveSettings() const {
Menu::getInstance()->saveSettings();
getMyAvatar()->saveData();
PluginManager::getInstance()->saveSettings();
auto bucketEnum = QMetaEnum::fromType<ExternalResource::Bucket>();
auto er = ExternalResource::getInstance();
for(int i=0;i<bucketEnum.keyCount();i++) {
const char *keyName = bucketEnum.key(i);
QString setting("ExternalResource/");
setting += keyName;
auto bucket = static_cast<ExternalResource::Bucket>(bucketEnum.keyToValue(keyName));
Setting::Handle<QString> url(setting, er->getBase(bucket));
url.set(er->getBase(bucket));
}
}
bool Application::importEntities(const QString& urlOrFilename, const bool isObservable, const qint64 callerId) {

View file

@ -44,6 +44,7 @@ QUrl ExternalResource::getQUrl(Bucket bucket, const QUrl &relative_path) {
return relative_path;
}
std::lock_guard<std::mutex> guard(_bucketMutex);
QUrl base = _bucketBases[bucket];
QUrl merged = base.resolved(relative_path);
@ -53,3 +54,27 @@ QUrl ExternalResource::getQUrl(Bucket bucket, const QUrl &relative_path) {
return merged;
}
QString ExternalResource::getBase(Bucket bucket) {
std::lock_guard<std::mutex> guard(_bucketMutex);
return _bucketBases.value(bucket).toString();
};
void ExternalResource::setBase(Bucket bucket, const QString &url) {
QUrl new_url(url);
if (!new_url.isValid() || new_url.isRelative()) {
qCCritical(external_resource) << "Attempted to set bucket " << bucket << " to invalid URL " << url;
return;
}
if (!_bucketBases.contains(bucket)) {
qCritical(external_resource) << "Invalid bucket " << bucket;
return;
}
qCDebug(external_resource) << "Setting base URL for " << bucket << " to " << new_url;
std::lock_guard<std::mutex> guard(_bucketMutex);
_bucketBases[bucket] = new_url;
}

View file

@ -16,6 +16,9 @@
#include <QUrl>
#include <QMap>
#include <mutex>
/**
* Flexible management for external resources
*
@ -125,9 +128,15 @@ class ExternalResource : public QObject {
return ExternalResource::getQUrl(bucket, QUrl(relative_path)).toString();
};
Q_INVOKABLE QString getBase(Bucket bucket);
Q_INVOKABLE void setBase(Bucket bucket, const QString &url);
private:
ExternalResource(QObject* parent = nullptr);
std::mutex _bucketMutex;
QMap<Bucket, QUrl> _bucketBases {
{ Bucket::Public, QUrl("https://public.vircadia.com")},
{ Bucket::Content, QUrl("https://content.vircadia.com")},