SettingsAccessor: Factor out basic load/save behavior

Change-Id: I654321167c623b507a9f109e42f77f41df3eccd2
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Tobias Hunger
2017-11-20 15:31:21 +01:00
parent 7b4b56c336
commit 440f65b115
2 changed files with 90 additions and 35 deletions

View File

@@ -25,7 +25,6 @@
#include "settingsaccessor.h" #include "settingsaccessor.h"
#include "persistentsettings.h"
#include "qtcassert.h" #include "qtcassert.h"
#include <QApplication> #include <QApplication>
@@ -80,6 +79,56 @@ QVariantMap VersionUpgrader::renameKeys(const QList<Change> &changes, QVariantMa
return map; return map;
} }
// --------------------------------------------------------------------
// BasicSettingsAccessor:
// --------------------------------------------------------------------
BasicSettingsAccessor::BasicSettingsAccessor(const FileName &baseFilePath, const QString &docType) :
m_baseFilePath(baseFilePath),
m_docType(docType)
{
QTC_CHECK(!m_baseFilePath.isEmpty());
QTC_CHECK(!m_docType.isEmpty());
}
BasicSettingsAccessor::~BasicSettingsAccessor() = default;
QVariantMap BasicSettingsAccessor::restoreSettings(QWidget *parent) const
{
Q_UNUSED(parent);
return readFile(m_baseFilePath);
}
bool BasicSettingsAccessor::saveSettings(const QVariantMap &data, QWidget *parent) const
{
return writeFile(m_baseFilePath, data, parent);
}
QVariantMap BasicSettingsAccessor::readFile(const FileName &path) const
{
PersistentSettingsReader reader;
if (!reader.load(path))
return QVariantMap();
return reader.restoreValues();
}
bool BasicSettingsAccessor::writeFile(const FileName &path, const QVariantMap &data, QWidget *parent) const
{
if (data.isEmpty())
return false;
if (!m_writer || m_writer->fileName() != path)
m_writer = std::make_unique<PersistentSettingsWriter>(path, m_docType);
return m_writer->save(data, parent);
}
FileName BasicSettingsAccessor::baseFilePath() const
{
return m_baseFilePath;
}
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// SettingsAccessorPrivate: // SettingsAccessorPrivate:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@@ -112,15 +161,12 @@ public:
std::vector<std::unique_ptr<VersionUpgrader>> m_upgraders; std::vector<std::unique_ptr<VersionUpgrader>> m_upgraders;
std::unique_ptr<PersistentSettingsWriter> m_writer; std::unique_ptr<PersistentSettingsWriter> m_writer;
QString m_docType;
QByteArray m_settingsId; QByteArray m_settingsId;
QString m_displayName; QString m_displayName;
QString m_applicationDisplayName; QString m_applicationDisplayName;
QString m_userSuffix; QString m_userSuffix;
QString m_sharedSuffix; QString m_sharedSuffix;
Utils::FileName m_baseFile;
}; };
// Return path to shared directory for .user files, create if necessary. // Return path to shared directory for .user files, create if necessary.
@@ -196,13 +242,9 @@ static FileName userFilePath(const Utils::FileName &projectFilePath, const QStri
} }
SettingsAccessor::SettingsAccessor(const Utils::FileName &baseFile, const QString &docType) : SettingsAccessor::SettingsAccessor(const Utils::FileName &baseFile, const QString &docType) :
BasicSettingsAccessor(baseFile, docType),
d(new SettingsAccessorPrivate) d(new SettingsAccessorPrivate)
{ {
QTC_CHECK(!baseFile.isEmpty());
QTC_CHECK(!docType.isEmpty());
d->m_docType = docType;
d->m_baseFile = baseFile;
d->m_userSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_EXTENSION")), ".user"); d->m_userSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_EXTENSION")), ".user");
d->m_sharedSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_SHARED_EXTENSION")), ".shared"); d->m_sharedSuffix = generateSuffix(QString::fromLocal8Bit(qgetenv("QTC_SHARED_EXTENSION")), ".shared");
} }
@@ -436,8 +478,7 @@ SettingsAccessor::ProceedInfo SettingsAccessor::reportIssues(const QVariantMap &
Utils::optional<SettingsAccessor::IssueInfo> Utils::optional<SettingsAccessor::IssueInfo>
SettingsAccessor::findIssues(const QVariantMap &data, const FileName &path) const SettingsAccessor::findIssues(const QVariantMap &data, const FileName &path) const
{ {
const FileName defaultSettingsPath = userFilePath(d->m_baseFile, d->m_userSuffix); const FileName defaultSettingsPath = userFilePath(baseFilePath(), d->m_userSuffix);
const int version = versionFromMap(data); const int version = versionFromMap(data);
if (data.isEmpty() || version < firstSupportedVersion() || version > currentVersion()) { if (data.isEmpty() || version < firstSupportedVersion() || version > currentVersion()) {
IssueInfo result; IssueInfo result;
@@ -581,10 +622,7 @@ bool SettingsAccessor::saveSettings(const QVariantMap &map, QWidget *parent) con
QVariantMap data = prepareToSaveSettings(map); QVariantMap data = prepareToSaveSettings(map);
FileName path = FileName::fromString(defaultFileName(d->m_userSuffix)); FileName path = FileName::fromString(defaultFileName(d->m_userSuffix));
if (!d->m_writer || d->m_writer->fileName() != path) return writeFile(path, data, parent);
d->m_writer = std::make_unique<PersistentSettingsWriter>(path, d->m_docType);
return d->m_writer->save(data, parent);
} }
bool SettingsAccessor::addVersionUpgrader(std::unique_ptr<VersionUpgrader> upgrader) bool SettingsAccessor::addVersionUpgrader(std::unique_ptr<VersionUpgrader> upgrader)
@@ -620,7 +658,7 @@ FileNameList SettingsAccessor::settingsFiles(const QString &suffix) const
FileNameList result; FileNameList result;
QFileInfoList list; QFileInfoList list;
const QFileInfo pfi = d->m_baseFile.toFileInfo(); const QFileInfo pfi = baseFilePath().toFileInfo();
const QStringList filter(pfi.fileName() + suffix + '*'); const QStringList filter(pfi.fileName() + suffix + '*');
if (!sharedUserFileDir().isEmpty()) { if (!sharedUserFileDir().isEmpty()) {
@@ -654,7 +692,7 @@ QString SettingsAccessor::displayName() const
QString SettingsAccessor::defaultFileName(const QString &suffix) const QString SettingsAccessor::defaultFileName(const QString &suffix) const
{ {
return userFilePath(d->m_baseFile, suffix).toString(); return userFilePath(baseFilePath(), suffix).toString();
} }
int SettingsAccessor::currentVersion() const int SettingsAccessor::currentVersion() const
@@ -708,7 +746,7 @@ QVariantMap SettingsAccessor::readUserSettings(QWidget *parent) const
result = d->bestSettings(this, fileList); result = d->bestSettings(this, fileList);
if (result.path.isEmpty()) if (result.path.isEmpty())
result.path = d->m_baseFile.parentDir(); result.path = baseFilePath().parentDir();
ProceedInfo proceed = reportIssues(result.map, result.path, parent); ProceedInfo proceed = reportIssues(result.map, result.path, parent);
if (proceed == DiscardAndContinue) if (proceed == DiscardAndContinue)
@@ -720,7 +758,7 @@ QVariantMap SettingsAccessor::readUserSettings(QWidget *parent) const
QVariantMap SettingsAccessor::readSharedSettings(QWidget *parent) const QVariantMap SettingsAccessor::readSharedSettings(QWidget *parent) const
{ {
SettingsAccessorPrivate::Settings sharedSettings; SettingsAccessorPrivate::Settings sharedSettings;
QString fn = d->m_baseFile.toString() + d->m_sharedSuffix; QString fn = baseFilePath().toString() + d->m_sharedSuffix;
sharedSettings.path = FileName::fromString(fn); sharedSettings.path = FileName::fromString(fn);
sharedSettings.map = readFile(sharedSettings.path); sharedSettings.map = readFile(sharedSettings.path);
@@ -757,7 +795,8 @@ SettingsAccessorPrivate::Settings SettingsAccessorPrivate::bestSettings(const Se
{ {
Settings bestMatch; Settings bestMatch;
foreach (const FileName &path, pathList) { foreach (const FileName &path, pathList) {
QVariantMap tmp = accessor->readFile(path); const QVariantMap tmp = accessor->prepareSettings(accessor->readFile(path));
if (accessor->isBetterMatch(bestMatch.map, tmp)) { if (accessor->isBetterMatch(bestMatch.map, tmp)) {
bestMatch.path = path; bestMatch.path = path;
bestMatch.map = tmp; bestMatch.map = tmp;
@@ -797,13 +836,4 @@ bool SettingsAccessorPrivate::Settings::isValid() const
return SettingsAccessor::versionFromMap(map) > -1 && !path.isEmpty(); return SettingsAccessor::versionFromMap(map) > -1 && !path.isEmpty();
} }
QVariantMap SettingsAccessor::readFile(const FileName &path) const
{
PersistentSettingsReader reader;
if (!reader.load(path))
return QVariantMap();
return prepareSettings(reader.restoreValues());
}
} // namespace Utils } // namespace Utils

View File

@@ -29,13 +29,39 @@
#include "fileutils.h" #include "fileutils.h"
#include "optional.h" #include "optional.h"
#include "persistentsettings.h"
#include <QHash> #include <QHash>
#include <QVariantMap>
#include <QMessageBox> #include <QMessageBox>
#include <QVariantMap>
namespace Utils { namespace Utils {
// --------------------------------------------------------------------
// BasicSettingsAccessor:
// --------------------------------------------------------------------
class QTCREATOR_UTILS_EXPORT BasicSettingsAccessor
{
public:
BasicSettingsAccessor(const Utils::FileName &baseFilePath, const QString &docType);
virtual ~BasicSettingsAccessor();
virtual QVariantMap restoreSettings(QWidget *parent) const;
virtual bool saveSettings(const QVariantMap &data, QWidget *parent) const;
protected:
QVariantMap readFile(const Utils::FileName &path) const;
bool writeFile(const Utils::FileName &path, const QVariantMap &data, QWidget *parent) const;
Utils::FileName baseFilePath() const;
private:
const Utils::FileName m_baseFilePath;
const QString m_docType;
mutable std::unique_ptr<PersistentSettingsWriter> m_writer;
};
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// VersionUpgrader: // VersionUpgrader:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@@ -58,14 +84,14 @@ protected:
class SettingsAccessorPrivate; class SettingsAccessorPrivate;
class QTCREATOR_UTILS_EXPORT SettingsAccessor class QTCREATOR_UTILS_EXPORT SettingsAccessor : public BasicSettingsAccessor
{ {
public: public:
explicit SettingsAccessor(const Utils::FileName &baseFile, const QString &docType); explicit SettingsAccessor(const Utils::FileName &baseFile, const QString &docType);
virtual ~SettingsAccessor(); ~SettingsAccessor() override;
QVariantMap restoreSettings(QWidget *parent) const; QVariantMap restoreSettings(QWidget *parent) const override;
bool saveSettings(const QVariantMap &data, QWidget *parent) const; bool saveSettings(const QVariantMap &data, QWidget *parent) const override;
static QVariantMap setVersionInMap(const QVariantMap &data, int version); static QVariantMap setVersionInMap(const QVariantMap &data, int version);
static int versionFromMap(const QVariantMap &data); static int versionFromMap(const QVariantMap &data);
@@ -92,7 +118,6 @@ protected:
void setSettingsId(const QByteArray &id); void setSettingsId(const QByteArray &id);
void setDisplayName(const QString &dn); void setDisplayName(const QString &dn);
void setApplicationDisplayName(const QString &dn); void setApplicationDisplayName(const QString &dn);
QVariantMap readFile(const Utils::FileName &path) const;
QVariantMap upgradeSettings(const QVariantMap &data) const; QVariantMap upgradeSettings(const QVariantMap &data) const;
QVariantMap upgradeSettings(const QVariantMap &data, const int targetVersion) const; QVariantMap upgradeSettings(const QVariantMap &data, const int targetVersion) const;