9 changed files with 366 additions and 85 deletions
			
			
		@ -0,0 +1,96 @@ | 
				
			|||
#include "datasyncsettingsaccessor.h" | 
				
			|||
#include "datasyncsettingsaccessor_p.h" | 
				
			|||
#include <QtCore/QRegularExpression> | 
				
			|||
 | 
				
			|||
#undef logDebug | 
				
			|||
#undef logInfo | 
				
			|||
#undef logWarning | 
				
			|||
#undef logCritical | 
				
			|||
#include <QtMvvmCore/private/qtmvvm_logging_p.h> | 
				
			|||
 | 
				
			|||
using namespace QtMvvm; | 
				
			|||
 | 
				
			|||
DataSyncSettingsAccessor::DataSyncSettingsAccessor(QObject *parent) : | 
				
			|||
	DataSyncSettingsAccessor{QtDataSync::DefaultSetup, parent} | 
				
			|||
{} | 
				
			|||
 | 
				
			|||
DataSyncSettingsAccessor::DataSyncSettingsAccessor(const QString &setupName, QObject *parent) : | 
				
			|||
	DataSyncSettingsAccessor{new QtDataSync::DataTypeStore<DataSyncSettingsEntry>{setupName}, parent} | 
				
			|||
{ | 
				
			|||
	d->store->setParent(this); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
DataSyncSettingsAccessor::DataSyncSettingsAccessor(QtDataSync::DataStore *store, QObject *parent) : | 
				
			|||
	DataSyncSettingsAccessor{new QtDataSync::DataTypeStore<DataSyncSettingsEntry>{store}, parent} | 
				
			|||
{ | 
				
			|||
	d->store->setParent(this); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
DataSyncSettingsAccessor::DataSyncSettingsAccessor(QtDataSync::DataTypeStore<DataSyncSettingsEntry> *store, QObject *parent) : | 
				
			|||
	ISettingsAccessor{parent}, | 
				
			|||
	d{new DataSyncSettingsAccessorPrivate{store}} | 
				
			|||
{} | 
				
			|||
 | 
				
			|||
DataSyncSettingsAccessor::~DataSyncSettingsAccessor() = default; | 
				
			|||
 | 
				
			|||
bool DataSyncSettingsAccessor::contains(const QString &key) const | 
				
			|||
{ | 
				
			|||
	try { | 
				
			|||
		return d->store->keys().contains(key); | 
				
			|||
	} catch(QException &e) { | 
				
			|||
		logCritical() << "Failed to check if entry" << key << "exists with error:" | 
				
			|||
					  << e.what(); | 
				
			|||
		return false; | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
QVariant DataSyncSettingsAccessor::load(const QString &key, const QVariant &defaultValue) const | 
				
			|||
{ | 
				
			|||
	try { | 
				
			|||
		return d->store->load(key).value(); | 
				
			|||
	} catch (QtDataSync::NoDataException &e) { | 
				
			|||
		Q_UNUSED(e) | 
				
			|||
		return defaultValue; | 
				
			|||
	} catch (QException &e) { | 
				
			|||
		logCritical() << "Failed to load entry" << key << "from datasync settings with error:" | 
				
			|||
					  << e.what(); | 
				
			|||
		return defaultValue; | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void DataSyncSettingsAccessor::save(const QString &key, const QVariant &value) | 
				
			|||
{ | 
				
			|||
	try { | 
				
			|||
		d->store->save({key, value}); | 
				
			|||
	} catch (QException &e) { | 
				
			|||
		logCritical() << "Failed to save entry" << key << "to datasync settings with error:" | 
				
			|||
					  << e.what(); | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void DataSyncSettingsAccessor::remove(const QString &key) | 
				
			|||
{ | 
				
			|||
	try { | 
				
			|||
		auto rmKeys = d->store->keys().filter(QRegularExpression{ | 
				
			|||
			QStringLiteral(R"__(^%1\/.*)__").arg(QRegularExpression::escape(key)), | 
				
			|||
			QRegularExpression::DontCaptureOption | 
				
			|||
		}); | 
				
			|||
		for(const auto &rmKey : rmKeys) | 
				
			|||
			d->store->remove(rmKey); | 
				
			|||
		d->store->remove(key); | 
				
			|||
	} catch (QException &e) { | 
				
			|||
		logCritical() << "Failed to remove entry" << key << "from datasync settings with error:" | 
				
			|||
					  << e.what(); | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void DataSyncSettingsAccessor::sync() | 
				
			|||
{ | 
				
			|||
	// nothing needs to be done
 | 
				
			|||
} | 
				
			|||
 | 
				
			|||
// ------------- Private Implementation -------------
 | 
				
			|||
 | 
				
			|||
DataSyncSettingsAccessorPrivate::DataSyncSettingsAccessorPrivate(QtDataSync::DataTypeStore<DataSyncSettingsEntry> *store) : | 
				
			|||
	store{store} | 
				
			|||
{} | 
				
			|||
@ -0,0 +1,40 @@ | 
				
			|||
#ifndef QTMVVM_DATASYNCSETTINGSACCESSOR_H | 
				
			|||
#define QTMVVM_DATASYNCSETTINGSACCESSOR_H | 
				
			|||
 | 
				
			|||
#include <QtCore/qscopedpointer.h> | 
				
			|||
#include <QtMvvmCore/isettingsaccessor.h> | 
				
			|||
#include <QtDataSync/datatypestore.h> | 
				
			|||
 | 
				
			|||
#include "QtMvvmDataSyncCore/qtmvvmdatasynccore_global.h" | 
				
			|||
#include "QtMvvmDataSyncCore/datasyncsettingsentry.h" | 
				
			|||
 | 
				
			|||
namespace QtMvvm { | 
				
			|||
 | 
				
			|||
class DataSyncSettingsAccessorPrivate; | 
				
			|||
class Q_MVVMDATASYNCCORE_EXPORT DataSyncSettingsAccessor : public ISettingsAccessor | 
				
			|||
{ | 
				
			|||
	Q_OBJECT | 
				
			|||
	Q_INTERFACES(QtMvvm::ISettingsAccessor) | 
				
			|||
 | 
				
			|||
public: | 
				
			|||
	Q_INVOKABLE explicit DataSyncSettingsAccessor(QObject *parent = nullptr); | 
				
			|||
	explicit DataSyncSettingsAccessor(const QString &setupName, QObject *parent = nullptr); | 
				
			|||
	explicit DataSyncSettingsAccessor(QtDataSync::DataStore *store, QObject *parent = nullptr); | 
				
			|||
	explicit DataSyncSettingsAccessor(QtDataSync::DataTypeStore<DataSyncSettingsEntry> *store, QObject *parent = nullptr); | 
				
			|||
	~DataSyncSettingsAccessor() override; | 
				
			|||
 | 
				
			|||
	bool contains(const QString &key) const override; | 
				
			|||
	QVariant load(const QString &key, const QVariant &defaultValue) const override; | 
				
			|||
	void save(const QString &key, const QVariant &value) override; | 
				
			|||
	void remove(const QString &key) override; | 
				
			|||
 | 
				
			|||
public Q_SLOTS: | 
				
			|||
	void sync() override; | 
				
			|||
 | 
				
			|||
private: | 
				
			|||
	QScopedPointer<DataSyncSettingsAccessorPrivate> d; | 
				
			|||
}; | 
				
			|||
 | 
				
			|||
} | 
				
			|||
 | 
				
			|||
#endif // QTMVVM_DATASYNCSETTINGSACCESSOR_H
 | 
				
			|||
@ -0,0 +1,19 @@ | 
				
			|||
#ifndef QTMVVM_DATASYNCSETTINGSACCESSOR_P_H | 
				
			|||
#define QTMVVM_DATASYNCSETTINGSACCESSOR_P_H | 
				
			|||
 | 
				
			|||
#include "qtmvvmdatasynccore_global.h" | 
				
			|||
#include "datasyncsettingsaccessor.h" | 
				
			|||
 | 
				
			|||
namespace QtMvvm { | 
				
			|||
 | 
				
			|||
class DataSyncSettingsAccessorPrivate | 
				
			|||
{ | 
				
			|||
public: | 
				
			|||
	DataSyncSettingsAccessorPrivate(QtDataSync::DataTypeStore<DataSyncSettingsEntry> *store); | 
				
			|||
 | 
				
			|||
	QtDataSync::DataTypeStore<DataSyncSettingsEntry> *store; | 
				
			|||
}; | 
				
			|||
 | 
				
			|||
} | 
				
			|||
 | 
				
			|||
#endif // QTMVVM_DATASYNCSETTINGSACCESSOR_P_H
 | 
				
			|||
@ -0,0 +1,128 @@ | 
				
			|||
#include "datasyncsettingsentry.h" | 
				
			|||
#include <QtCore/QDataStream> | 
				
			|||
#if QT_HAS_INCLUDE(<optional>) | 
				
			|||
#include <optional> | 
				
			|||
#define QTMVVM_HAS_OPTIONAL | 
				
			|||
#endif | 
				
			|||
using namespace QtMvvm; | 
				
			|||
 | 
				
			|||
namespace QtMvvm { | 
				
			|||
 | 
				
			|||
class DataSyncSettingsEntryData : public QSharedData | 
				
			|||
{ | 
				
			|||
public: | 
				
			|||
	inline DataSyncSettingsEntryData() = default; | 
				
			|||
	inline DataSyncSettingsEntryData(QString key) : | 
				
			|||
		key{std::move(key)} | 
				
			|||
	{} | 
				
			|||
 | 
				
			|||
	QString key; | 
				
			|||
	int version = QDataStream::Qt_DefaultCompiledVersion; | 
				
			|||
	QByteArray data; | 
				
			|||
#ifdef QTMVVM_HAS_OPTIONAL | 
				
			|||
	mutable std::optional<QVariant> value; | 
				
			|||
#else | 
				
			|||
	mutable QVariant value; | 
				
			|||
#endif | 
				
			|||
}; | 
				
			|||
 | 
				
			|||
} | 
				
			|||
 | 
				
			|||
DataSyncSettingsEntry::DataSyncSettingsEntry() : | 
				
			|||
	d{new DataSyncSettingsEntryData{}} | 
				
			|||
{} | 
				
			|||
 | 
				
			|||
DataSyncSettingsEntry::~DataSyncSettingsEntry() = default; | 
				
			|||
 | 
				
			|||
DataSyncSettingsEntry::DataSyncSettingsEntry(const DataSyncSettingsEntry &other) = default; | 
				
			|||
 | 
				
			|||
DataSyncSettingsEntry::DataSyncSettingsEntry(DataSyncSettingsEntry &&other) noexcept = default; | 
				
			|||
 | 
				
			|||
DataSyncSettingsEntry &DataSyncSettingsEntry::operator=(const DataSyncSettingsEntry &other) = default; | 
				
			|||
 | 
				
			|||
DataSyncSettingsEntry &DataSyncSettingsEntry::operator=(DataSyncSettingsEntry &&other) noexcept = default; | 
				
			|||
 | 
				
			|||
DataSyncSettingsEntry::DataSyncSettingsEntry(QString key, QVariant value) : | 
				
			|||
	d{new DataSyncSettingsEntryData{std::move(key)}} | 
				
			|||
{ | 
				
			|||
	setValue(std::move(value)); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
QString DataSyncSettingsEntry::key() const | 
				
			|||
{ | 
				
			|||
	return d->key; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
int DataSyncSettingsEntry::dataVersion() const | 
				
			|||
{ | 
				
			|||
	return d->version; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
QVariant DataSyncSettingsEntry::value() const | 
				
			|||
{ | 
				
			|||
#ifdef QTMVVM_HAS_OPTIONAL | 
				
			|||
	if(!d->data.isNull() && !d->value) { | 
				
			|||
		QDataStream stream{d->data}; | 
				
			|||
		stream.setVersion(d->version); | 
				
			|||
		d->value = QVariant{}; | 
				
			|||
		stream >> d->value.value(); | 
				
			|||
	} | 
				
			|||
	return d->value.value_or(QVariant{}); | 
				
			|||
#else | 
				
			|||
	if(!d->data.isNull() && !d->value.isValid()) { | 
				
			|||
		QDataStream stream{d->data}; | 
				
			|||
		stream.setVersion(d->version); | 
				
			|||
		stream >> d->value; | 
				
			|||
	} | 
				
			|||
	return d->value; | 
				
			|||
#endif | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void DataSyncSettingsEntry::setKey(QString key) | 
				
			|||
{ | 
				
			|||
	d->key = std::move(key); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void DataSyncSettingsEntry::setDataVersion(int dataVersion) | 
				
			|||
{ | 
				
			|||
	if(d->version == dataVersion) | 
				
			|||
		return; | 
				
			|||
 | 
				
			|||
	if(d->data.isNull()) | 
				
			|||
		d->version = dataVersion; | 
				
			|||
	else { | 
				
			|||
		// update the internally stored data based on the version
 | 
				
			|||
		auto mValue = value(); | 
				
			|||
		d->version = dataVersion; | 
				
			|||
		setValue(mValue); | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void DataSyncSettingsEntry::setValue(QVariant value) | 
				
			|||
{ | 
				
			|||
#ifdef QTMVVM_HAS_OPTIONAL | 
				
			|||
	d->value.reset(); | 
				
			|||
#else | 
				
			|||
	d->value.clear(); | 
				
			|||
#endif | 
				
			|||
	d->data.clear(); | 
				
			|||
	QDataStream stream{&d->data, QIODevice::WriteOnly}; | 
				
			|||
	stream.setVersion(d->version); | 
				
			|||
	stream << value; | 
				
			|||
	d->value = std::move(value); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
QByteArray DataSyncSettingsEntry::valueData() const | 
				
			|||
{ | 
				
			|||
	return d->data; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
void DataSyncSettingsEntry::setValueData(QByteArray data) | 
				
			|||
{ | 
				
			|||
#ifdef QTMVVM_HAS_OPTIONAL | 
				
			|||
	d->value.reset(); | 
				
			|||
#else | 
				
			|||
	d->value.clear(); | 
				
			|||
#endif | 
				
			|||
	d->data = std::move(data); | 
				
			|||
} | 
				
			|||
@ -0,0 +1,70 @@ | 
				
			|||
#ifndef QTMVVM_DATASYNCSETTINGSENTRY_H | 
				
			|||
#define QTMVVM_DATASYNCSETTINGSENTRY_H | 
				
			|||
 | 
				
			|||
#include <QtCore/qobject.h> | 
				
			|||
#include <QtCore/qvariant.h> | 
				
			|||
#include <QtCore/qshareddata.h> | 
				
			|||
 | 
				
			|||
#include "QtMvvmDataSyncCore/qtmvvmdatasynccore_global.h" | 
				
			|||
 | 
				
			|||
namespace QtMvvm { | 
				
			|||
 | 
				
			|||
class DataSyncSettingsEntryData; | 
				
			|||
struct Q_MVVMDATASYNCCORE_EXPORT DataSyncSettingsEntry | 
				
			|||
{ | 
				
			|||
	Q_GADGET | 
				
			|||
 | 
				
			|||
	Q_PROPERTY(QString key READ key WRITE setKey USER true) | 
				
			|||
	Q_PROPERTY(int dataVersion READ dataVersion WRITE setDataVersion) | 
				
			|||
	Q_PROPERTY(QByteArray value READ valueData WRITE setValueData) | 
				
			|||
 | 
				
			|||
	Q_PROPERTY(QVariant variantValue READ value WRITE setValue STORED false) | 
				
			|||
 | 
				
			|||
public: | 
				
			|||
	DataSyncSettingsEntry(); | 
				
			|||
	~DataSyncSettingsEntry(); | 
				
			|||
	DataSyncSettingsEntry(const DataSyncSettingsEntry &other); | 
				
			|||
	DataSyncSettingsEntry(DataSyncSettingsEntry &&other) noexcept; | 
				
			|||
	DataSyncSettingsEntry &operator=(const DataSyncSettingsEntry &other); | 
				
			|||
	DataSyncSettingsEntry &operator=(DataSyncSettingsEntry &&other) noexcept; | 
				
			|||
 | 
				
			|||
	DataSyncSettingsEntry(QString key, QVariant value); | 
				
			|||
	template <typename T> | 
				
			|||
	DataSyncSettingsEntry(QString key, const T &value); | 
				
			|||
 | 
				
			|||
	QString key() const; | 
				
			|||
	int dataVersion() const; | 
				
			|||
 | 
				
			|||
	QVariant value() const; | 
				
			|||
	template <typename T> | 
				
			|||
	T value() const; | 
				
			|||
 | 
				
			|||
	void setKey(QString key); | 
				
			|||
	void setDataVersion(int dataVersion); | 
				
			|||
	void setValue(QVariant value); | 
				
			|||
 | 
				
			|||
private: | 
				
			|||
	QByteArray valueData() const; | 
				
			|||
	void setValueData(QByteArray value); | 
				
			|||
 | 
				
			|||
	QSharedDataPointer<DataSyncSettingsEntryData> d; | 
				
			|||
}; | 
				
			|||
 | 
				
			|||
// ------------- Generic Implementation -------------
 | 
				
			|||
 | 
				
			|||
template<typename T> | 
				
			|||
DataSyncSettingsEntry::DataSyncSettingsEntry(QString key, const T &value) : | 
				
			|||
	DataSyncSettingsEntry{std::move(key), QVariant::fromValue(value)} | 
				
			|||
{} | 
				
			|||
 | 
				
			|||
template<typename T> | 
				
			|||
T DataSyncSettingsEntry::value() const | 
				
			|||
{ | 
				
			|||
	return value().template value<T>(); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
} | 
				
			|||
 | 
				
			|||
Q_DECLARE_METATYPE(QtMvvm::DataSyncSettingsEntry) | 
				
			|||
 | 
				
			|||
#endif // QTMVVM_DATASYNCSETTINGSENTRY_H
 | 
				
			|||
					Loading…
					
					
				
		Reference in new issue