From 5e2870ac5f249da597b9f312bce5b9648103e50c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 09:30:08 -0700 Subject: [PATCH 1/9] require a distinction between master config and user config --- domain-server/src/DomainServer.cpp | 4 +- .../src/DomainServerSettingsManager.cpp | 23 +++------- .../src/DomainServerSettingsManager.h | 10 ++-- libraries/shared/src/HifiConfigVariantMap.cpp | 46 +++++++++---------- libraries/shared/src/HifiConfigVariantMap.h | 22 +++++++-- 5 files changed, 52 insertions(+), 53 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index b1ed765be6..d347cb088f 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -48,7 +48,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : _sessionAuthenticationHash(), _webAuthenticationStateSet(), _cookieSessionHash(), - _settingsManager() + _settingsManager(arguments()) { LogUtils::init(); @@ -57,8 +57,6 @@ DomainServer::DomainServer(int argc, char* argv[]) : setApplicationName("domain-server"); QSettings::setDefaultFormat(QSettings::IniFormat); - _settingsManager.loadSettingsMap(arguments()); - installNativeEventFilter(&_shutdownEventListener); connect(&_shutdownEventListener, SIGNAL(receivedCloseEvent()), SLOT(quit())); diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index d9b1d4d8d6..ae5a815e92 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -26,9 +26,9 @@ const QString SETTINGS_DESCRIPTION_RELATIVE_PATH = "/resources/describe-settings.json"; -DomainServerSettingsManager::DomainServerSettingsManager() : +DomainServerSettingsManager::DomainServerSettingsManager(const QStringList& argumentList) : _descriptionArray(), - _settingsMap() + _configMap(argumentList) { // load the description object from the settings description QFile descriptionFile(QCoreApplication::applicationDirPath() + SETTINGS_DESCRIPTION_RELATIVE_PATH); @@ -37,13 +37,6 @@ DomainServerSettingsManager::DomainServerSettingsManager() : _descriptionArray = QJsonDocument::fromJson(descriptionFile.readAll()).array(); } -void DomainServerSettingsManager::loadSettingsMap(const QStringList& argumentList) { - _settingsMap = HifiConfigVariantMap::mergeMasterConfigWithUserConfig(argumentList); - - // figure out where we are supposed to persist our settings to - _settingsFilepath = HifiConfigVariantMap::userConfigFilepath(argumentList); -} - const QString SETTINGS_PATH = "/settings.json"; bool DomainServerSettingsManager::handlePublicHTTPRequest(HTTPConnection* connection, const QUrl &url) { @@ -76,7 +69,7 @@ bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection QJsonObject postedObject = postedDocument.object(); // we recurse one level deep below each group for the appropriate setting - recurseJSONObjectAndOverwriteSettings(postedObject, _settingsMap, _descriptionArray); + recurseJSONObjectAndOverwriteSettings(postedObject, _configMap.getUserConfig(), _descriptionArray); // store whatever the current _settingsMap is to file persistToFile(); @@ -99,6 +92,7 @@ bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection rootObject[SETTINGS_RESPONSE_DESCRIPTION_KEY] = _descriptionArray; rootObject[SETTINGS_RESPONSE_VALUE_KEY] = responseObjectForType("", true); + connection->respond(HTTPConnection::StatusCode200, QJsonDocument(rootObject).toJson(), "application/json"); } @@ -145,7 +139,8 @@ QJsonObject DomainServerSettingsManager::responseObjectForType(const QString& ty // we need to check if the settings map has a value for this setting QVariant variantValue; - QVariant settingsMapGroupValue = _settingsMap.value(groupObject[DESCRIPTION_NAME_KEY].toString()); + QVariant settingsMapGroupValue = _configMap.getMergedConfig() + .value(groupObject[DESCRIPTION_NAME_KEY].toString()); if (!settingsMapGroupValue.isNull()) { variantValue = settingsMapGroupValue.toMap().value(settingName); @@ -239,10 +234,6 @@ void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ } } -QByteArray DomainServerSettingsManager::getJSONSettingsMap() const { - return QJsonDocument::fromVariant(_settingsMap).toJson(); -} - void DomainServerSettingsManager::persistToFile() { // make sure we have the dir the settings file is supposed to live in @@ -255,7 +246,7 @@ void DomainServerSettingsManager::persistToFile() { QFile settingsFile(_settingsFilepath); if (settingsFile.open(QIODevice::WriteOnly)) { - settingsFile.write(getJSONSettingsMap()); + settingsFile.write(QJsonDocument::fromVariant(_configMap.getUserConfig()).toJson()); } else { qCritical("Could not write to JSON settings file. Unable to persist settings."); } diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index 29b773a354..4b884dfd5b 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -15,19 +15,17 @@ #include #include +#include #include class DomainServerSettingsManager : public QObject { Q_OBJECT public: - DomainServerSettingsManager(); + DomainServerSettingsManager(const QStringList& argumentList); bool handlePublicHTTPRequest(HTTPConnection* connection, const QUrl& url); bool handleAuthenticatedHTTPRequest(HTTPConnection* connection, const QUrl& url); - void loadSettingsMap(const QStringList& argumentList); - - QByteArray getJSONSettingsMap() const; - QVariantMap& getSettingsMap() { return _settingsMap; } + QVariantMap& getSettingsMap() { return _configMap.getMergedConfig(); } private: QJsonObject responseObjectForType(const QString& typeValue, bool isAuthenticated = false); void recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, QVariantMap& settingsVariant, @@ -35,7 +33,7 @@ private: void persistToFile(); QJsonArray _descriptionArray; - QVariantMap _settingsMap; + HifiConfigVariantMap _configMap; QString _settingsFilepath; }; diff --git a/libraries/shared/src/HifiConfigVariantMap.cpp b/libraries/shared/src/HifiConfigVariantMap.cpp index d3626e0249..fabb185a35 100644 --- a/libraries/shared/src/HifiConfigVariantMap.cpp +++ b/libraries/shared/src/HifiConfigVariantMap.cpp @@ -87,43 +87,46 @@ QVariantMap HifiConfigVariantMap::mergeCLParametersWithJSONConfig(const QStringL return mergedMap; } -QVariantMap HifiConfigVariantMap::mergeMasterConfigWithUserConfig(const QStringList& argumentList) { +HifiConfigVariantMap::HifiConfigVariantMap(const QStringList& argumentList) : + _masterConfigPath(), + _userConfigPath(), + _masterConfig(), + _userConfig(), + _mergedConfig() +{ // check if there is a master config file const QString MASTER_CONFIG_FILE_OPTION = "--master-config"; - QVariantMap configVariantMap; - int masterConfigIndex = argumentList.indexOf(MASTER_CONFIG_FILE_OPTION); if (masterConfigIndex != -1) { QString masterConfigFilepath = argumentList[masterConfigIndex + 1]; - mergeMapWithJSONFile(configVariantMap, masterConfigFilepath); + loadMapFromJSONFile(_masterConfig, masterConfigFilepath); } - // merge the existing configVariantMap with the user config file - mergeMapWithJSONFile(configVariantMap, userConfigFilepath(argumentList)); - - return configVariantMap; -} - -QString HifiConfigVariantMap::userConfigFilepath(const QStringList& argumentList) { - // we've loaded up the master config file, now fill in anything it didn't have with the user config file + // load the user config const QString USER_CONFIG_FILE_OPTION = "--user-config"; int userConfigIndex = argumentList.indexOf(USER_CONFIG_FILE_OPTION); QString userConfigFilepath; if (userConfigIndex != -1) { - userConfigFilepath = argumentList[userConfigIndex + 1]; + _userConfigPath = argumentList[userConfigIndex + 1]; } else { - userConfigFilepath = QString("%1/%2/%3/config.json").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation), - QCoreApplication::organizationName(), - QCoreApplication::applicationName()); + _userConfigPath = QString("%1%2/%3/config.json").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation), + QCoreApplication::organizationName(), + QCoreApplication::applicationName()); } - return userConfigFilepath; + loadMapFromJSONFile(_userConfig, _userConfigPath); + + // the merged config is initially matched to the master config + _mergedConfig = _masterConfig; + + // then we merge in anything missing from the user config + addMissingValuesToExistingMap(_mergedConfig, _userConfig); } -void HifiConfigVariantMap::mergeMapWithJSONFile(QVariantMap& existingMap, const QString& filename) { +void HifiConfigVariantMap::loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename) { QFile configFile(filename); if (configFile.exists()) { @@ -131,12 +134,7 @@ void HifiConfigVariantMap::mergeMapWithJSONFile(QVariantMap& existingMap, const configFile.open(QIODevice::ReadOnly); QJsonDocument configDocument = QJsonDocument::fromJson(configFile.readAll()); - - if (existingMap.isEmpty()) { - existingMap = configDocument.toVariant().toMap(); - } else { - addMissingValuesToExistingMap(existingMap, configDocument.toVariant().toMap()); - } + existingMap = configDocument.toVariant().toMap(); } else { qDebug() << "Could not find JSON config file at" << filename; diff --git a/libraries/shared/src/HifiConfigVariantMap.h b/libraries/shared/src/HifiConfigVariantMap.h index b1b6b55aa2..12cc05d2e9 100644 --- a/libraries/shared/src/HifiConfigVariantMap.h +++ b/libraries/shared/src/HifiConfigVariantMap.h @@ -17,11 +17,25 @@ class HifiConfigVariantMap { public: static QVariantMap mergeCLParametersWithJSONConfig(const QStringList& argumentList); - static QVariantMap mergeMasterConfigWithUserConfig(const QStringList& argumentList); - static QString userConfigFilepath(const QStringList& argumentList); + + HifiConfigVariantMap(const QStringList& argumentList); + + const QVariantMap& getMasterConfig() const { return _masterConfig; } + QVariantMap& getUserConfig() { return _userConfig; } + QVariantMap& getMergedConfig() { return _mergedConfig; } + + const QString& userConfigFilepath() const { return _userConfigPath; } private: - static void mergeMapWithJSONFile(QVariantMap& existingMap, const QString& filename); - static void addMissingValuesToExistingMap(QVariantMap& existingMap, const QVariantMap& newMap); + QString _masterConfigPath; + QString _userConfigPath; + + QVariantMap _masterConfig; + QVariantMap _userConfig; + QVariantMap _mergedConfig; + + QVariantMap mergeMasterConfigWithUserConfig(const QStringList& argumentList); + void loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename); + void addMissingValuesToExistingMap(QVariantMap& existingMap, const QVariantMap& newMap); }; const QVariant* valueForKeyPath(QVariantMap& variantMap, const QString& keyPath); From ec0805acc53af942a1a78eb39b1bd72eb6f0ecbf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 09:34:04 -0700 Subject: [PATCH 2/9] add locked settings to json return for auth'ed settings --- domain-server/src/DomainServerSettingsManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index ae5a815e92..e262d4e8a4 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -87,10 +87,12 @@ bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection // setup a JSON Object with descriptions and non-omitted settings const QString SETTINGS_RESPONSE_DESCRIPTION_KEY = "descriptions"; const QString SETTINGS_RESPONSE_VALUE_KEY = "values"; + const QString SETTINGS_RESPONSE_LOCKED_VALUES_KEY = "locked"; QJsonObject rootObject; rootObject[SETTINGS_RESPONSE_DESCRIPTION_KEY] = _descriptionArray; rootObject[SETTINGS_RESPONSE_VALUE_KEY] = responseObjectForType("", true); + rootObject[SETTINGS_RESPONSE_LOCKED_VALUES_KEY] = QJsonDocument::fromVariant(_configMap.getMasterConfig()).object(); connection->respond(HTTPConnection::StatusCode200, QJsonDocument(rootObject).toJson(), "application/json"); From 58b03c7ef2e54820404090a8ed82118e5415e885 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 09:53:27 -0700 Subject: [PATCH 3/9] disable form inputs for values set by master config --- domain-server/resources/describe-settings.json | 2 +- domain-server/resources/web/js/settings.js | 12 ++++++++---- domain-server/resources/web/settings/index.shtml | 6 ++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 8fb7bddb89..19c293b610 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -116,7 +116,7 @@ "advanced": true }, { - "name": "I-print-stream-stats", + "name": "print-stream-stats", "type": "checkbox", "label": "Print Stream Stats:", "help": "audio upstream and downstream stats of each agent printed to audio-mixer stdout", diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index 8bb02e6e94..2d079e9a7c 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -3,9 +3,11 @@ var Settings = { }; var viewHelpers = { - getFormGroup: function(groupName, setting, values, isAdvanced) { + getFormGroup: function(groupName, setting, values, isAdvanced, isLocked) { setting_id = groupName + "_" + setting.name + console.log(setting.name + " in " + groupName + " is " + isLocked) + form_group = "
" if (_.has(values, groupName) && _.has(values[groupName], setting.name)) { @@ -18,9 +20,10 @@ var viewHelpers = { if (setting.type === 'checkbox') { form_group += "" - form_group += "
" + form_group += "
" form_group += ""; form_group += "
" } else { @@ -29,7 +32,7 @@ var viewHelpers = { form_group += ""; form_group += "" + "' value='" + setting_value + "'" + (isLocked ? " disabled" : "") + "/>" form_group += "" + setting.help + "" } @@ -101,6 +104,7 @@ function reloadSettings() { $('#panels').html(Settings.panelsTemplate(data)) Settings.initialValues = form2js('settings-form', "_", false, cleanupFormValues, true); + $('[data-target=tooltip]').tooltip() }); } diff --git a/domain-server/resources/web/settings/index.shtml b/domain-server/resources/web/settings/index.shtml index 54fbb02eca..2f0cdf6537 100644 --- a/domain-server/resources/web/settings/index.shtml +++ b/domain-server/resources/web/settings/index.shtml @@ -38,10 +38,12 @@
<% split_settings = _.partition(group.settings, function(value, index) { return !value.advanced }) %> <% _.each(split_settings[0], function(setting) { %> - <%= getFormGroup(group.name, setting, values, false) %> + <%= getFormGroup(group.name, setting, values, false, + (_.has(locked, group.name) && _.has(locked[group.name], setting.name))) %> <% }); %> <% _.each(split_settings[1], function(setting) { %> - <%= getFormGroup(group.name, setting, values, true) %> + <%= getFormGroup(group.name, setting, values, true, + (_.has(locked, group.name) && _.has(locked[group.name], setting.name))) %> <% }); %>
From 46258ae78f78abde987c49e59350d2ca278edb9c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 10:02:01 -0700 Subject: [PATCH 4/9] add a tooltip to say why locked settings cannot be changed --- domain-server/resources/web/css/style.css | 4 ++++ domain-server/resources/web/js/settings.js | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/domain-server/resources/web/css/style.css b/domain-server/resources/web/css/style.css index cef30b5782..a75b1a23ae 100644 --- a/domain-server/resources/web/css/style.css +++ b/domain-server/resources/web/css/style.css @@ -52,6 +52,10 @@ span.port { color: red; } +.locked { + color: blue; +} + .advanced-setting { display: none; } diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index 2d079e9a7c..3313bce06d 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -18,8 +18,13 @@ var viewHelpers = { setting_value = "" } + label_class = 'control-label' + if (isLocked) { + label_class += ' locked' + } + if (setting.type === 'checkbox') { - form_group += "" + form_group += "" form_group += "
" form_group += ""; + form_group += ""; form_group += "" @@ -104,7 +109,12 @@ function reloadSettings() { $('#panels').html(Settings.panelsTemplate(data)) Settings.initialValues = form2js('settings-form', "_", false, cleanupFormValues, true); - $('[data-target=tooltip]').tooltip() + + // add tooltip to locked settings + $('label.locked').tooltip({ + placement: 'right', + title: 'This setting is in the master config file and cannot be changed' + }) }); } From bd4a32551b723d1fe5290f108beb4856ba8c9782 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 10:09:33 -0700 Subject: [PATCH 5/9] fix for settings save without organization --- domain-server/src/DomainServer.cpp | 4 +++- .../src/DomainServerSettingsManager.cpp | 12 +++++++---- .../src/DomainServerSettingsManager.h | 5 +++-- libraries/shared/src/HifiConfigVariantMap.cpp | 20 ++++++++++--------- libraries/shared/src/HifiConfigVariantMap.h | 8 ++++---- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d347cb088f..4f048a2ec9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -48,7 +48,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : _sessionAuthenticationHash(), _webAuthenticationStateSet(), _cookieSessionHash(), - _settingsManager(arguments()) + _settingsManager() { LogUtils::init(); @@ -57,6 +57,8 @@ DomainServer::DomainServer(int argc, char* argv[]) : setApplicationName("domain-server"); QSettings::setDefaultFormat(QSettings::IniFormat); + _settingsManager.setupConfigMap(arguments()); + installNativeEventFilter(&_shutdownEventListener); connect(&_shutdownEventListener, SIGNAL(receivedCloseEvent()), SLOT(quit())); diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index e262d4e8a4..fc36a97a25 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -26,9 +26,9 @@ const QString SETTINGS_DESCRIPTION_RELATIVE_PATH = "/resources/describe-settings.json"; -DomainServerSettingsManager::DomainServerSettingsManager(const QStringList& argumentList) : +DomainServerSettingsManager::DomainServerSettingsManager() : _descriptionArray(), - _configMap(argumentList) + _configMap() { // load the description object from the settings description QFile descriptionFile(QCoreApplication::applicationDirPath() + SETTINGS_DESCRIPTION_RELATIVE_PATH); @@ -37,6 +37,10 @@ DomainServerSettingsManager::DomainServerSettingsManager(const QStringList& argu _descriptionArray = QJsonDocument::fromJson(descriptionFile.readAll()).array(); } +void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList) { + _configMap.loadMasterAndUserConfig(argumentList); +} + const QString SETTINGS_PATH = "/settings.json"; bool DomainServerSettingsManager::handlePublicHTTPRequest(HTTPConnection* connection, const QUrl &url) { @@ -239,13 +243,13 @@ void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ void DomainServerSettingsManager::persistToFile() { // make sure we have the dir the settings file is supposed to live in - QFileInfo settingsFileInfo(_settingsFilepath); + QFileInfo settingsFileInfo(_configMap.getUserConfigFilename()); if (!settingsFileInfo.dir().exists()) { settingsFileInfo.dir().mkpath("."); } - QFile settingsFile(_settingsFilepath); + QFile settingsFile(_configMap.getUserConfigFilename()); if (settingsFile.open(QIODevice::WriteOnly)) { settingsFile.write(QJsonDocument::fromVariant(_configMap.getUserConfig()).toJson()); diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index 4b884dfd5b..b60cb32dfd 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -21,10 +21,12 @@ class DomainServerSettingsManager : public QObject { Q_OBJECT public: - DomainServerSettingsManager(const QStringList& argumentList); + DomainServerSettingsManager(); bool handlePublicHTTPRequest(HTTPConnection* connection, const QUrl& url); bool handleAuthenticatedHTTPRequest(HTTPConnection* connection, const QUrl& url); + void setupConfigMap(const QStringList& argumentList); + QVariantMap& getSettingsMap() { return _configMap.getMergedConfig(); } private: QJsonObject responseObjectForType(const QString& typeValue, bool isAuthenticated = false); @@ -34,7 +36,6 @@ private: QJsonArray _descriptionArray; HifiConfigVariantMap _configMap; - QString _settingsFilepath; }; #endif // hifi_DomainServerSettingsManager_h \ No newline at end of file diff --git a/libraries/shared/src/HifiConfigVariantMap.cpp b/libraries/shared/src/HifiConfigVariantMap.cpp index fabb185a35..648f15648a 100644 --- a/libraries/shared/src/HifiConfigVariantMap.cpp +++ b/libraries/shared/src/HifiConfigVariantMap.cpp @@ -87,13 +87,16 @@ QVariantMap HifiConfigVariantMap::mergeCLParametersWithJSONConfig(const QStringL return mergedMap; } -HifiConfigVariantMap::HifiConfigVariantMap(const QStringList& argumentList) : - _masterConfigPath(), - _userConfigPath(), +HifiConfigVariantMap::HifiConfigVariantMap() : + _userConfigFilename(), _masterConfig(), _userConfig(), _mergedConfig() { + +} + +void HifiConfigVariantMap::loadMasterAndUserConfig(const QStringList& argumentList) { // check if there is a master config file const QString MASTER_CONFIG_FILE_OPTION = "--master-config"; @@ -108,16 +111,15 @@ HifiConfigVariantMap::HifiConfigVariantMap(const QStringList& argumentList) : const QString USER_CONFIG_FILE_OPTION = "--user-config"; int userConfigIndex = argumentList.indexOf(USER_CONFIG_FILE_OPTION); - QString userConfigFilepath; if (userConfigIndex != -1) { - _userConfigPath = argumentList[userConfigIndex + 1]; + _userConfigFilename = argumentList[userConfigIndex + 1]; } else { - _userConfigPath = QString("%1%2/%3/config.json").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation), - QCoreApplication::organizationName(), - QCoreApplication::applicationName()); + _userConfigFilename = QString("%1/%2/%3/config.json").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation), + QCoreApplication::organizationName(), + QCoreApplication::applicationName()); } - loadMapFromJSONFile(_userConfig, _userConfigPath); + loadMapFromJSONFile(_userConfig, _userConfigFilename); // the merged config is initially matched to the master config _mergedConfig = _masterConfig; diff --git a/libraries/shared/src/HifiConfigVariantMap.h b/libraries/shared/src/HifiConfigVariantMap.h index 12cc05d2e9..99a58d731e 100644 --- a/libraries/shared/src/HifiConfigVariantMap.h +++ b/libraries/shared/src/HifiConfigVariantMap.h @@ -18,16 +18,16 @@ class HifiConfigVariantMap { public: static QVariantMap mergeCLParametersWithJSONConfig(const QStringList& argumentList); - HifiConfigVariantMap(const QStringList& argumentList); + HifiConfigVariantMap(); + void loadMasterAndUserConfig(const QStringList& argumentList); const QVariantMap& getMasterConfig() const { return _masterConfig; } QVariantMap& getUserConfig() { return _userConfig; } QVariantMap& getMergedConfig() { return _mergedConfig; } - const QString& userConfigFilepath() const { return _userConfigPath; } + const QString& getUserConfigFilename() const { return _userConfigFilename; } private: - QString _masterConfigPath; - QString _userConfigPath; + QString _userConfigFilename; QVariantMap _masterConfig; QVariantMap _userConfig; From eb7ee361683258f4a265904fbd0aaa68378f3928 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 10:29:40 -0700 Subject: [PATCH 6/9] use two dashes for url as command line option --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0fd7ae96d1..c00b83b53d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -304,8 +304,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : connect(&addressManager, &AddressManager::possibleDomainChangeRequired, this, &Application::changeDomainHostname); - // when -url in command line, teleport to location - addressManager.handleLookupString(getCmdOption(argc, constArgv, "-url")); + // when --url in command line, teleport to location + addressManager.handleLookupString(getCmdOption(argc, constArgv, "--url")); _settings = new QSettings(this); _numChangedSettings = 0; From 3fbf14168657e52d162a0242dcada9e812375337 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 13:14:25 -0700 Subject: [PATCH 7/9] handle avatar location changes after avatar position has been reloaded --- interface/src/Application.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c00b83b53d..261411b5fb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -303,9 +303,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // connect to the domainChangeRequired signal on AddressManager connect(&addressManager, &AddressManager::possibleDomainChangeRequired, this, &Application::changeDomainHostname); - - // when --url in command line, teleport to location - addressManager.handleLookupString(getCmdOption(argc, constArgv, "--url")); _settings = new QSettings(this); _numChangedSettings = 0; @@ -1796,6 +1793,13 @@ void Application::init() { Menu::getInstance()->loadSettings(); _audio.setReceivedAudioStreamSettings(Menu::getInstance()->getReceivedAudioStreamSettings()); + + // when --url in command line, teleport to location + const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; + int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); + if (urlIndex != -1) { + AddressManager::getInstance().handleLookupString(arguments().value(urlIndex + 1)); + } qDebug("Loaded settings"); From a847c2d80d70ec74383b2afd94c57a543bd2b6f8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 13:15:28 -0700 Subject: [PATCH 8/9] move url handling to after settings load debug --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 261411b5fb..e0c03584bf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1793,6 +1793,8 @@ void Application::init() { Menu::getInstance()->loadSettings(); _audio.setReceivedAudioStreamSettings(Menu::getInstance()->getReceivedAudioStreamSettings()); + + qDebug() << "Loaded settings"; // when --url in command line, teleport to location const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; @@ -1801,8 +1803,6 @@ void Application::init() { AddressManager::getInstance().handleLookupString(arguments().value(urlIndex + 1)); } - qDebug("Loaded settings"); - // initialize our face trackers after loading the menu settings _faceshift.init(); _faceplus.init(); From c16ab0a19fa388afc2f8b31cd8ca6e653c231a1c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 15:27:45 -0700 Subject: [PATCH 9/9] remove definition for an unused method --- libraries/shared/src/HifiConfigVariantMap.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/shared/src/HifiConfigVariantMap.h b/libraries/shared/src/HifiConfigVariantMap.h index 99a58d731e..6bdeb15589 100644 --- a/libraries/shared/src/HifiConfigVariantMap.h +++ b/libraries/shared/src/HifiConfigVariantMap.h @@ -33,7 +33,6 @@ private: QVariantMap _userConfig; QVariantMap _mergedConfig; - QVariantMap mergeMasterConfigWithUserConfig(const QStringList& argumentList); void loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename); void addMissingValuesToExistingMap(QVariantMap& existingMap, const QVariantMap& newMap); };