diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 8fe618b70d..c5024055c0 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -12,7 +12,6 @@ #include #include -#include #include #include #include @@ -49,8 +48,6 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri { LogUtils::init(); - QSettings::setDefaultFormat(QSettings::IniFormat); - DependencyManager::set(); auto scriptableAvatar = DependencyManager::set(); diff --git a/assignment-client/src/AssignmentClientApp.cpp b/assignment-client/src/AssignmentClientApp.cpp index 68e7b9b997..90d759dffa 100644 --- a/assignment-client/src/AssignmentClientApp.cpp +++ b/assignment-client/src/AssignmentClientApp.cpp @@ -12,7 +12,6 @@ #include #include -#include #include #include #include @@ -40,11 +39,6 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : ShutdownEventListener::getInstance(); # endif - setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION); - setOrganizationDomain("highfidelity.io"); - setApplicationName("assignment-client"); - setApplicationVersion(BuildInfo::VERSION); - // parse command-line QCommandLineParser parser; parser.setApplicationDescription("High Fidelity Assignment Client"); diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index cf8d9ebe31..4f64bf8f7f 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -13,10 +13,16 @@ #include #include "AssignmentClientApp.h" +#include int main(int argc, char* argv[]) { disableQtBearerPoll(); // Fixes wifi ping spikes + QCoreApplication::setApplicationName(BuildInfo::ASSIGNMENT_CLIENT_NAME); + QCoreApplication::setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION); + QCoreApplication::setOrganizationDomain(BuildInfo::ORGANIZATION_DOMAIN); + QCoreApplication::setApplicationVersion(BuildInfo::VERSION); + qInstallMessageHandler(LogHandler::verboseMessageHandler); qInfo() << "Starting."; diff --git a/cmake/templates/BuildInfo.h.in b/cmake/templates/BuildInfo.h.in index 3d388a907f..b0af1c0524 100644 --- a/cmake/templates/BuildInfo.h.in +++ b/cmake/templates/BuildInfo.h.in @@ -1,6 +1,6 @@ // // BuildInfo.h.in -// cmake/macros +// cmake/templates // // Created by Stephen Birarda on 1/14/16. // Copyright 2015 High Fidelity, Inc. @@ -11,10 +11,19 @@ #define USE_STABLE_GLOBAL_SERVICES @USE_STABLE_GLOBAL_SERVICES@ +#include + namespace BuildInfo { + // WARNING: This file has been auto-generated. + // Check cmake/templates/BuildInfo.h.in if you want to modify it. + + const QString INTERFACE_NAME = "Interface"; + const QString ASSIGNMENT_CLIENT_NAME = "assignment-client"; + const QString DOMAIN_SERVER_NAME = "domain-server"; + const QString AC_CLIENT_SERVER_NAME = "ac-client"; const QString MODIFIED_ORGANIZATION = "@BUILD_ORGANIZATION@"; + const QString ORGANIZATION_DOMAIN = "highfidelity.io"; const QString VERSION = "@BUILD_VERSION@"; const QString BUILD_BRANCH = "@BUILD_BRANCH@"; const QString BUILD_GLOBAL_SERVICES = "@BUILD_GLOBAL_SERVICES@"; } - diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 6668ed54dc..711a5b6fc2 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -76,14 +76,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : LogUtils::init(); Setting::init(); - setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION); - setOrganizationDomain("highfidelity.io"); - setApplicationName("domain-server"); - setApplicationVersion(BuildInfo::VERSION); - QSettings::setDefaultFormat(QSettings::IniFormat); - qDebug() << "Setting up domain-server"; - qDebug() << "[VERSION] Build sequence:" << qPrintable(applicationVersion()); qDebug() << "[VERSION] MODIFIED_ORGANIZATION:" << BuildInfo::MODIFIED_ORGANIZATION; qDebug() << "[VERSION] VERSION:" << BuildInfo::VERSION; diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 21214ed5f6..18a46e0658 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "DomainServerSettingsManager.h" + #include #include @@ -16,23 +18,21 @@ #include #include #include -#include #include #include #include -#include #include +#include #include #include #include #include #include +#include #include "DomainServerNodeData.h" -#include "DomainServerSettingsManager.h" - const QString SETTINGS_DESCRIPTION_RELATIVE_PATH = "/resources/describe-settings.json"; const QString DESCRIPTION_SETTINGS_KEY = "settings"; @@ -43,6 +43,8 @@ const QString DESCRIPTION_COLUMNS_KEY = "columns"; const QString SETTINGS_VIEWPOINT_KEY = "viewpoint"; +static Setting::Handle JSON_SETTING_VERSION("json-settings/version", 0.0); + DomainServerSettingsManager::DomainServerSettingsManager() : _descriptionArray(), _configMap() @@ -103,9 +105,7 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList // What settings version were we before and what are we using now? // Do we need to do any re-mapping? - QSettings appSettings; - const QString JSON_SETTINGS_VERSION_KEY = "json-settings/version"; - double oldVersion = appSettings.value(JSON_SETTINGS_VERSION_KEY, 0.0).toDouble(); + double oldVersion = JSON_SETTING_VERSION.get(); if (oldVersion != _descriptionVersion) { const QString ALLOWED_USERS_SETTINGS_KEYPATH = "security.allowed_users"; @@ -301,7 +301,7 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList unpackPermissions(); // write the current description version to our settings - appSettings.setValue(JSON_SETTINGS_VERSION_KEY, _descriptionVersion); + JSON_SETTING_VERSION.set(_descriptionVersion); } QVariantMap& DomainServerSettingsManager::getDescriptorsMap() { diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index fcc3e9d91d..06ad7decd1 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -21,6 +22,8 @@ #include #include "NodePermissions.h" +#include + const QString SETTINGS_PATHS_KEY = "paths"; const QString SETTINGS_PATH = "/settings"; diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index fdf7a598aa..725a04ec46 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -17,12 +17,18 @@ #include #include +#include #include "DomainServer.h" int main(int argc, char* argv[]) { disableQtBearerPoll(); // Fixes wifi ping spikes + QCoreApplication::setApplicationName(BuildInfo::DOMAIN_SERVER_NAME); + QCoreApplication::setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION); + QCoreApplication::setOrganizationDomain(BuildInfo::ORGANIZATION_DOMAIN); + QCoreApplication::setApplicationVersion(BuildInfo::VERSION); + #ifndef WIN32 setvbuf(stdout, NULL, _IOLBF, 0); #endif diff --git a/interface/resources/info/ApplicationInfo.ini b/interface/resources/info/ApplicationInfo.ini deleted file mode 100644 index 1a7142cb76..0000000000 --- a/interface/resources/info/ApplicationInfo.ini +++ /dev/null @@ -1,4 +0,0 @@ -[INFO] -name=Interface -organizationName=High Fidelity -organizationDomain=highfidelity.io \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 513c1dcf26..6a50bf8368 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -416,10 +416,7 @@ bool setupEssentials(int& argc, char** argv) { const char* portStr = getCmdOption(argc, constArgv, "--listenPort"); const int listenPort = portStr ? atoi(portStr) : INVALID_PORT; - // Set build version - QCoreApplication::setApplicationVersion(BuildInfo::VERSION); - - Setting::preInit(); + Setting::init(); if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) { steamClient->init(); @@ -445,8 +442,6 @@ bool setupEssentials(int& argc, char** argv) { DependencyManager::registerInheritance(); DependencyManager::registerInheritance(); - Setting::init(); - // Set dependencies DependencyManager::set(std::bind(&Application::getUserAgent, qApp)); DependencyManager::set(); diff --git a/interface/src/CrashHandler.cpp b/interface/src/CrashHandler.cpp index 0c9698ffc3..b254cd58de 100644 --- a/interface/src/CrashHandler.cpp +++ b/interface/src/CrashHandler.cpp @@ -18,19 +18,18 @@ #include #include #include -#include #include #include #include #include "Application.h" #include "Menu.h" +#include #include bool CrashHandler::checkForResetSettings(bool suppressPrompt) { - QSettings::setDefaultFormat(QSettings::IniFormat); - QSettings settings; + Settings settings; settings.beginGroup("Developer"); QVariant displayCrashOptions = settings.value(MenuOption::DisplayCrashOptions); QVariant askToResetSettingsOption = settings.value(MenuOption::AskToResetSettings); @@ -110,8 +109,7 @@ void CrashHandler::handleCrash(CrashHandler::Action action) { return; } - QSettings::setDefaultFormat(QSettings::IniFormat); - QSettings settings; + Settings settings; const QString ADDRESS_MANAGER_GROUP = "AddressManager"; const QString ADDRESS_KEY = "address"; const QString AVATAR_GROUP = "Avatar"; diff --git a/interface/src/Util.h b/interface/src/Util.h index e3938502d2..60e38ae0ec 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -14,7 +14,6 @@ #include #include -#include #include diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index c56d255201..5a31fdbbed 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -57,7 +57,6 @@ using namespace std; -const glm::vec3 DEFAULT_UP_DIRECTION(0.0f, 1.0f, 0.0f); const float DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES = 30.0f; const float MAX_WALKING_SPEED = 2.6f; // human walking speed diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 547bed94ab..c83f7a989c 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -15,10 +15,10 @@ #include #include #include -#include #include #include +#include #include #include @@ -31,7 +31,6 @@ #include #ifdef HAS_BUGSPLAT -#include #include #include #endif @@ -50,7 +49,13 @@ int main(int argc, const char* argv[]) { #endif disableQtBearerPoll(); // Fixes wifi ping spikes - + + // Set application infos + QCoreApplication::setApplicationName(BuildInfo::INTERFACE_NAME); + QCoreApplication::setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION); + QCoreApplication::setOrganizationDomain(BuildInfo::ORGANIZATION_DOMAIN); + QCoreApplication::setApplicationVersion(BuildInfo::VERSION); + QString applicationName = "High Fidelity Interface - " + qgetenv("USERNAME"); bool instanceMightBeRunning = true; @@ -182,7 +187,6 @@ int main(int argc, const char* argv[]) { int exitCode; { - QSettings::setDefaultFormat(QSettings::IniFormat); Application app(argc, const_cast(argv), startupTime, runServer, serverContentPathOptionValue); // If we failed the OpenGLVersion check, log it. diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 45790524d1..49363c96e2 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -973,10 +973,6 @@ void Rig::updateFromEyeParameters(const EyeParameters& params) { params.worldHeadOrientation, params.eyeLookAt, params.eyeSaccade); } -static const glm::vec3 X_AXIS(1.0f, 0.0f, 0.0f); -static const glm::vec3 Y_AXIS(0.0f, 1.0f, 0.0f); -static const glm::vec3 Z_AXIS(0.0f, 0.0f, 1.0f); - void Rig::computeHeadNeckAnimVars(const AnimPose& hmdPose, glm::vec3& headPositionOut, glm::quat& headOrientationOut, glm::vec3& neckPositionOut, glm::quat& neckOrientationOut) const { diff --git a/libraries/auto-updater/src/AutoUpdater.h b/libraries/auto-updater/src/AutoUpdater.h index 70867e5a44..1e62ce0283 100644 --- a/libraries/auto-updater/src/AutoUpdater.h +++ b/libraries/auto-updater/src/AutoUpdater.h @@ -12,8 +12,6 @@ #ifndef hifi_AutoUpdater_h #define hifi_AutoUpdater_h - -#include #include #include #include diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 240c722872..8583b59c89 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -105,7 +105,7 @@ QUrl AddressManager::currentFacingShareableAddress() const { void AddressManager::loadSettings(const QString& lookupString) { if (lookupString.isEmpty()) { - handleUrl(currentAddressHandle.get().toString(), LookupTrigger::StartupFromSettings); + handleUrl(currentAddressHandle.get(), LookupTrigger::StartupFromSettings); } else { handleUrl(lookupString, LookupTrigger::StartupFromSettings); } diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index cb6291a8dc..b3092be55a 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -283,43 +283,6 @@ void ScriptEngines::loadScripts() { // loads all saved scripts Settings settings; - - - // START of backward compatibility code - // This following if statement is only meant to update the settings file still using the old setting key. - // If you read that comment and it has been more than a couple months since it was merged, - // then by all means, feel free to remove it. - if (!settings.childGroups().contains(SETTINGS_KEY)) { - qWarning() << "Detected old script settings config, loading from previous location"; - const QString oldKey = "Settings"; - - // Load old scripts array from settings - int size = settings.beginReadArray(oldKey); - for (int i = 0; i < size; ++i) { - settings.setArrayIndex(i); - QString string = settings.value("script").toString(); - if (!string.isEmpty()) { - loadScript(string); - } - } - settings.endArray(); - - // Cleanup old scripts array from settings - settings.beginWriteArray(oldKey); - for (int i = 0; i < size; ++i) { - settings.setArrayIndex(i); - settings.remove(""); - } - settings.endArray(); - settings.beginGroup(oldKey); - settings.remove("size"); - settings.endGroup(); - - return; - } - // END of backward compatibility code - - int size = settings.beginReadArray(SETTINGS_KEY); for (int i = 0; i < size; ++i) { settings.setArrayIndex(i); diff --git a/libraries/shared/src/SettingHandle.cpp b/libraries/shared/src/SettingHandle.cpp index 13f9ea48ce..626d7e7ef5 100644 --- a/libraries/shared/src/SettingHandle.cpp +++ b/libraries/shared/src/SettingHandle.cpp @@ -19,16 +19,12 @@ const QString Settings::firstRun { "firstRun" }; -Settings::Settings() : - _manager(DependencyManager::get()), - _locker(&(_manager->getLock())) +Settings::Settings() : _manager(DependencyManager::get()) { } -Settings::~Settings() { - if (_prefixes.size() != 0) { - qFatal("Unstable Settings Prefixes: You must call endGroup for every beginGroup and endArray for every begin*Array call"); - } +QString Settings::fileName() const { + return _manager->fileName(); } void Settings::remove(const QString& key) { @@ -53,18 +49,15 @@ bool Settings::contains(const QString& key) const { return _manager->contains(key); } -int Settings::beginReadArray(const QString & prefix) { - _prefixes.push(prefix); +int Settings::beginReadArray(const QString& prefix) { return _manager->beginReadArray(prefix); } void Settings::beginWriteArray(const QString& prefix, int size) { - _prefixes.push(prefix); _manager->beginWriteArray(prefix, size); } void Settings::endArray() { - _prefixes.pop(); _manager->endArray(); } @@ -73,19 +66,15 @@ void Settings::setArrayIndex(int i) { } void Settings::beginGroup(const QString& prefix) { - _prefixes.push(prefix); _manager->beginGroup(prefix); } void Settings::endGroup() { - _prefixes.pop(); _manager->endGroup(); } void Settings::setValue(const QString& name, const QVariant& value) { - if (_manager->value(name) != value) { - _manager->setValue(name, value); - } + _manager->setValue(name, value); } QVariant Settings::value(const QString& name, const QVariant& defaultValue) const { diff --git a/libraries/shared/src/SettingHandle.h b/libraries/shared/src/SettingHandle.h index 5133a9cb2a..54694dfd0a 100644 --- a/libraries/shared/src/SettingHandle.h +++ b/libraries/shared/src/SettingHandle.h @@ -14,7 +14,6 @@ #include -#include #include #include #include @@ -32,7 +31,8 @@ class Settings { public: static const QString firstRun; Settings(); - ~Settings(); + + QString fileName() const; void remove(const QString& key); QStringList childGroups() const; @@ -61,8 +61,6 @@ public: private: QSharedPointer _manager; - QWriteLocker _locker; - QStack _prefixes; }; namespace Setting { diff --git a/libraries/shared/src/SettingHelpers.cpp b/libraries/shared/src/SettingHelpers.cpp new file mode 100644 index 0000000000..f7d2510458 --- /dev/null +++ b/libraries/shared/src/SettingHelpers.cpp @@ -0,0 +1,283 @@ +// +// SettingHelpers.cpp +// libraries/shared/src +// +// Created by Clement on 9/13/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "SettingHelpers.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +QSettings::SettingsMap jsonDocumentToVariantMap(const QJsonDocument& document); +QJsonDocument variantMapToJsonDocument(const QSettings::SettingsMap& map); + +bool readJSONFile(QIODevice& device, QSettings::SettingsMap& map) { + QJsonParseError jsonParseError; + + auto bytesRead = device.readAll(); + auto document = QJsonDocument::fromJson(bytesRead, &jsonParseError); + + if (jsonParseError.error != QJsonParseError::NoError) { + qDebug() << "Error parsing QSettings file:" << jsonParseError.errorString(); + return false; + } + + map = jsonDocumentToVariantMap(document); + + return true; +} + +bool writeJSONFile(QIODevice& device, const QSettings::SettingsMap& map) { + auto document = variantMapToJsonDocument(map); + auto jsonByteArray = document.toJson(QJsonDocument::Indented); + auto bytesWritten = device.write(jsonByteArray); + return bytesWritten == jsonByteArray.size(); +} + +void loadOldINIFile(QSettings& settings) { + QSettings::setDefaultFormat(QSettings::IniFormat); + + QSettings iniSettings; + if (!iniSettings.allKeys().isEmpty()) { + qDebug() << "No data in json settings file, trying to load old ini settings file."; + + for (auto key : iniSettings.allKeys()) { + auto variant = iniSettings.value(key); + + if (variant.type() == QVariant::String) { + auto string = variant.toString(); + if (string == "true") { + variant = true; + } else if (string == "false") { + variant = false; + } else { + bool ok; + double value = string.toDouble(&ok); + if (ok) { + variant = value; + } + } + } + settings.setValue(key, variant); + } + + qDebug() << "Loaded" << settings.allKeys().size() << "keys from ini settings file."; + } + + QSettings::setDefaultFormat(JSON_FORMAT); +} + +QStringList splitArgs(const QString& string, int idx) { + int length = string.length(); + Q_ASSERT(length > 0); + Q_ASSERT(string.at(idx) == QLatin1Char('(')); + Q_ASSERT(string.at(length - 1) == QLatin1Char(')')); + + QStringList result; + QString item; + + for (++idx; idx < length; ++idx) { + QChar c = string.at(idx); + if (c == QLatin1Char(')')) { + Q_ASSERT(idx == length - 1); + result.append(item); + } else if (c == QLatin1Char(' ')) { + result.append(item); + item.clear(); + } else { + item.append(c); + } + } + + return result; +} + +QJsonDocument variantMapToJsonDocument(const QSettings::SettingsMap& map) { + QJsonObject object; + for (auto it = map.cbegin(); it != map.cend(); ++it) { + auto& key = it.key(); + auto& variant = it.value(); + auto variantType = variant.type(); + + // Switch some types so they are readable/modifiable in the json file + if (variantType == QVariant(1.0f).type()) { // float + variantType = QVariant::Double; + } + if (variantType == QVariant((quint16)0).type()) { // uint16 + variantType = QVariant::UInt; + } + if (variantType == QVariant::Url) { // QUrl + variantType = QVariant::String; + } + + switch (variantType) { + case QVariant::Map: + case QVariant::List: + case QVariant::Hash: { + qCritical() << "Unsupported variant type" << variant.typeName(); + Q_ASSERT(false); + break; + } + + case QVariant::Invalid: + object.insert(key, QJsonValue()); + break; + case QVariant::LongLong: + case QVariant::ULongLong: + case QVariant::Int: + case QVariant::UInt: + case QVariant::Bool: + case QVariant::Double: + object.insert(key, QJsonValue::fromVariant(variant)); + break; + + case QVariant::String: { + QString result = variant.toString(); + if (result.startsWith(QLatin1Char('@'))) { + result.prepend(QLatin1Char('@')); + } + object.insert(key, result); + break; + } + + case QVariant::ByteArray: { + QByteArray a = variant.toByteArray(); + QString result = QLatin1String("@ByteArray("); + result += QString::fromLatin1(a.constData(), a.size()); + result += QLatin1Char(')'); + object.insert(key, result); + break; + } + case QVariant::Rect: { + QRect r = qvariant_cast(variant); + QString result = QLatin1String("@Rect("); + result += QString::number(r.x()); + result += QLatin1Char(' '); + result += QString::number(r.y()); + result += QLatin1Char(' '); + result += QString::number(r.width()); + result += QLatin1Char(' '); + result += QString::number(r.height()); + result += QLatin1Char(')'); + object.insert(key, result); + break; + } + case QVariant::Size: { + QSize s = qvariant_cast(variant); + QString result = QLatin1String("@Size("); + result += QString::number(s.width()); + result += QLatin1Char(' '); + result += QString::number(s.height()); + result += QLatin1Char(')'); + object.insert(key, result); + break; + } + case QVariant::Point: { + QPoint p = qvariant_cast(variant); + QString result = QLatin1String("@Point("); + result += QString::number(p.x()); + result += QLatin1Char(' '); + result += QString::number(p.y()); + result += QLatin1Char(')'); + object.insert(key, result); + break; + } + + default: { + QByteArray array; + { + QDataStream stream(&array, QIODevice::WriteOnly); + stream.setVersion(QDataStream::Qt_4_0); + stream << variant; + } + + QString result = QLatin1String("@Variant("); + result += QString::fromLatin1(array.constData(), array.size()); + result += QLatin1Char(')'); + object.insert(key, result); + break; + } + } + } + + return QJsonDocument(object); +} + + +QSettings::SettingsMap jsonDocumentToVariantMap(const QJsonDocument& document) { + if (!document.isObject()) { + qWarning() << "Settings file does not contain a JSON object"; + return QSettings::SettingsMap(); + } + auto object = document.object(); + QSettings::SettingsMap map; + + for (auto it = object.begin(); it != object.end(); ++it) { + + QVariant result; + + if (!it->isString()) { + result = it->toVariant(); + } else { + auto string = it->toString(); + + if (string.startsWith(QLatin1String("@@"))) { // Standard string starting with '@' + result = QVariant(string.mid(1)); + + } else if (string.startsWith(QLatin1Char('@'))) { // Custom type to string + + if (string.endsWith(QLatin1Char(')'))) { + + if (string.startsWith(QLatin1String("@ByteArray("))) { + result = QVariant(string.toLatin1().mid(11, string.size() - 12)); + + } else if (string.startsWith(QLatin1String("@Variant("))) { + QByteArray a(string.toLatin1().mid(9)); + QDataStream stream(&a, QIODevice::ReadOnly); + stream.setVersion(QDataStream::Qt_4_0); + stream >> result; + + } else if (string.startsWith(QLatin1String("@Rect("))) { + QStringList args = splitArgs(string, 5); + if (args.size() == 4) { + result = QRect(args[0].toInt(), args[1].toInt(), + args[2].toInt(), args[3].toInt()); + } + + } else if (string.startsWith(QLatin1String("@Size("))) { + QStringList args = splitArgs(string, 5); + if (args.size() == 2) { + result = QSize(args[0].toInt(), args[1].toInt()); + } + + } else if (string.startsWith(QLatin1String("@Point("))) { + QStringList args = splitArgs(string, 6); + if (args.size() == 2) { + result = QPoint(args[0].toInt(), args[1].toInt()); + } + } + } + } else { // Standard string + result = string; + } + } + + map.insert(it.key(), result); + } + + return map; +} diff --git a/libraries/shared/src/SettingHelpers.h b/libraries/shared/src/SettingHelpers.h new file mode 100644 index 0000000000..122e56957c --- /dev/null +++ b/libraries/shared/src/SettingHelpers.h @@ -0,0 +1,25 @@ +// +// SettingHelpers.h +// libraries/shared/src +// +// Created by Clement on 9/13/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_SettingHelpers_h +#define hifi_SettingHelpers_h + +#include + +bool readJSONFile(QIODevice& device, QSettings::SettingsMap& map); +bool writeJSONFile(QIODevice& device, const QSettings::SettingsMap& map); + +static const auto JSON_FORMAT = QSettings::registerFormat("json", readJSONFile, writeJSONFile); + +void loadOldINIFile(QSettings& settings); + + +#endif // hifi_SettingHelpers_h diff --git a/libraries/shared/src/SettingInterface.cpp b/libraries/shared/src/SettingInterface.cpp index 9db84055f7..01b9f3884f 100644 --- a/libraries/shared/src/SettingInterface.cpp +++ b/libraries/shared/src/SettingInterface.cpp @@ -17,13 +17,12 @@ #include #include "PathUtils.h" +#include "SettingHelpers.h" #include "SettingManager.h" #include "SharedLogging.h" namespace Setting { static QSharedPointer globalManager; - - const QString Interface::FIRST_RUN { "firstRun" }; // cleans up the settings private instance. Should only be run once at closing down. void cleanupPrivateInstance() { @@ -40,30 +39,27 @@ namespace Setting { settingsManagerThread->quit(); settingsManagerThread->wait(); } + + // Sets up the settings private instance. Should only be run once at startup. preInit() must be run beforehand, + void init() { + // Set settings format + QSettings::setDefaultFormat(JSON_FORMAT); + QSettings settings; + qCDebug(shared) << "Settings file:" << settings.fileName(); - // Set up application settings. Should only be run once at startup. - void preInit() { - // read the ApplicationInfo.ini file for Name/Version/Domain information - QSettings::setDefaultFormat(QSettings::IniFormat); - QSettings applicationInfo(PathUtils::resourcesPath() + "info/ApplicationInfo.ini", QSettings::IniFormat); - // set the associated application properties - applicationInfo.beginGroup("INFO"); - QCoreApplication::setApplicationName(applicationInfo.value("name").toString()); - QCoreApplication::setOrganizationName(applicationInfo.value("organizationName").toString()); - QCoreApplication::setOrganizationDomain(applicationInfo.value("organizationDomain").toString()); + if (settings.allKeys().isEmpty()) { + loadOldINIFile(settings); + } // Delete Interface.ini.lock file if it exists, otherwise Interface freezes. - QSettings settings; QString settingsLockFilename = settings.fileName() + ".lock"; QFile settingsLockFile(settingsLockFilename); if (settingsLockFile.exists()) { bool deleted = settingsLockFile.remove(); qCDebug(shared) << (deleted ? "Deleted" : "Failed to delete") << "settings lock file" << settingsLockFilename; } - } - - // Sets up the settings private instance. Should only be run once at startup. preInit() must be run beforehand, - void init() { + + // Let's set up the settings Private instance on its own thread QThread* thread = new QThread(); Q_CHECK_PTR(thread); diff --git a/libraries/shared/src/SettingInterface.h b/libraries/shared/src/SettingInterface.h index 5e23d42223..082adf3e54 100644 --- a/libraries/shared/src/SettingInterface.h +++ b/libraries/shared/src/SettingInterface.h @@ -20,14 +20,11 @@ namespace Setting { class Manager; - void preInit(); void init(); void cleanupSettings(); class Interface { public: - static const QString FIRST_RUN; - const QString& getKey() const { return _key; } bool isSet() const { return _isSet; } diff --git a/libraries/shared/src/SettingManager.cpp b/libraries/shared/src/SettingManager.cpp index a42e62c1c8..929fe2b0ff 100644 --- a/libraries/shared/src/SettingManager.cpp +++ b/libraries/shared/src/SettingManager.cpp @@ -9,12 +9,13 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "SettingManager.h" + #include #include #include #include "SettingInterface.h" -#include "SettingManager.h" namespace Setting { @@ -32,7 +33,6 @@ namespace Setting { // Custom deleter does nothing, because we need to shutdown later than the dependency manager void Manager::customDeleter() { } - void Manager::registerHandle(Interface* handle) { const QString& key = handle->getKey(); withWriteLock([&] { diff --git a/tests/render-texture-load/src/GLIHelpers.cpp b/tests/render-texture-load/src/GLIHelpers.cpp index 8067993b49..be39e7f1c8 100644 --- a/tests/render-texture-load/src/GLIHelpers.cpp +++ b/tests/render-texture-load/src/GLIHelpers.cpp @@ -48,7 +48,7 @@ QString convertTexture(const QString& sourceFile) { fromQImageFormat(sourceImage.format()), gli::extent2d(sourceImage.width(), sourceImage.height())); auto sourceSize = sourceImage.byteCount(); - assert(sourceSize == workTexture[workTexture.base_level()].size()); + assert(sourceSize == (int)workTexture[workTexture.base_level()].size()); memcpy(workTexture[workTexture.base_level()].data(), sourceImage.constBits(), sourceSize); QString resultFile = getKtxFileName(sourceFile) ; diff --git a/tests/render-utils/src/main.cpp b/tests/render-utils/src/main.cpp index c38bd6765c..7e909bf31f 100644 --- a/tests/render-utils/src/main.cpp +++ b/tests/render-utils/src/main.cpp @@ -152,7 +152,6 @@ protected: //static const wchar_t* EXAMPLE_TEXT = L"Hello"; //static const wchar_t* EXAMPLE_TEXT = L"\xC1y Hello 1.0\ny\xC1 line 2\n\xC1y"; -static const glm::uvec2 QUAD_OFFSET(10, 10); void testShaderBuild(const char* vs_src, const char * fs_src) { auto vs = gpu::Shader::createVertex(std::string(vs_src)); diff --git a/tools/ac-client/src/ACClientApp.cpp b/tools/ac-client/src/ACClientApp.cpp index dad0a6d617..4c12a09388 100644 --- a/tools/ac-client/src/ACClientApp.cpp +++ b/tools/ac-client/src/ACClientApp.cpp @@ -81,9 +81,8 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : listenPort = parser.value(listenPortOption).toInt(); } - Setting::preInit(); - DependencyManager::registerInheritance(); Setting::init(); + DependencyManager::registerInheritance(); DependencyManager::set([&]{ return QString("Mozilla/5.0 (HighFidelityACClient)"); }); DependencyManager::set(); diff --git a/tools/ac-client/src/main.cpp b/tools/ac-client/src/main.cpp index 918df6413f..12c5e6f5f8 100644 --- a/tools/ac-client/src/main.cpp +++ b/tools/ac-client/src/main.cpp @@ -13,11 +13,19 @@ #include #include +#include + #include "ACClientApp.h" using namespace std; int main(int argc, char * argv[]) { + QCoreApplication::setApplicationName(BuildInfo::AC_CLIENT_SERVER_NAME); + QCoreApplication::setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION); + QCoreApplication::setOrganizationDomain(BuildInfo::ORGANIZATION_DOMAIN); + QCoreApplication::setApplicationVersion(BuildInfo::VERSION); + ACClientApp app(argc, argv); + return app.exec(); }