133 lines
3.5 KiB
C++
133 lines
3.5 KiB
C++
#include "stdafx.h"
|
|
#include "Settings.h"
|
|
//#include "qzlib.h"
|
|
#include "Common.h"
|
|
#include <QStandardPaths>
|
|
|
|
bool TestWriteRight(const QString& Path)
|
|
{
|
|
QFile TestFile(Path + "/~test-" + GetRand64Str() + ".tmp");
|
|
if(!TestFile.open(QFile::WriteOnly))
|
|
return false;
|
|
TestFile.close();
|
|
return TestFile.remove();
|
|
}
|
|
|
|
CSettings::CSettings(const QString& AppDir, const QString& AppName, bool bShared, QMap<QString, SSetting> DefaultValues, QObject* qObject) : QObject(qObject)
|
|
{
|
|
m_ConfigDir = AppDir;
|
|
if (!(m_bPortable = QFile::exists(m_ConfigDir + "/" + AppName + ".ini")))
|
|
{
|
|
QStringList dirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
|
|
if (dirs.isEmpty())
|
|
m_ConfigDir = QDir::homePath() + "/." + AppName;
|
|
//
|
|
// if shared is set a new ini is created in the shared location
|
|
// and if present take precedence over an ini in a user location
|
|
// howeever if the only existing ini is in a user location it will be used
|
|
//
|
|
else if(bShared && dirs.count() > 2 && (
|
|
QFile::exists(dirs[1] + "/" + AppName + "/" + AppName + ".ini") ||
|
|
!QFile::exists(dirs[0] + "/" + AppName + "/" + AppName + ".ini") ))
|
|
m_ConfigDir = dirs[1] + "/" + AppName;
|
|
else
|
|
m_ConfigDir = dirs[0] + "/" + AppName;
|
|
QDir().mkpath(m_ConfigDir);
|
|
}
|
|
|
|
m_pConf = new QSettings(m_ConfigDir + "/" + AppName + ".ini", QSettings::IniFormat, this);
|
|
|
|
m_pConf->sync();
|
|
|
|
//m_DefaultValues = DefaultValues;
|
|
//foreach (const QString& Key, m_DefaultValues.keys())
|
|
//{
|
|
// const SSetting& Setting = m_DefaultValues[Key];
|
|
// if(!m_pConf->contains(Key) || !Setting.Check(m_pConf->value(Key)))
|
|
// {
|
|
// if(Setting.IsBlob())
|
|
// m_pConf->setValue(Key, Setting.Value.toByteArray().toBase64().replace("+","-").replace("/","_").replace("=",""));
|
|
// else
|
|
// m_pConf->setValue(Key, Setting.Value);
|
|
// }
|
|
//}
|
|
}
|
|
|
|
CSettings::~CSettings()
|
|
{
|
|
m_pConf->sync();
|
|
}
|
|
|
|
void CSettings::DelValue(const QString& key)
|
|
{
|
|
QMutexLocker Locker(&m_Mutex);
|
|
|
|
m_pConf->remove(key);
|
|
|
|
m_ValueCache.clear();
|
|
}
|
|
|
|
bool CSettings::SetValue(const QString &key, const QVariant &value)
|
|
{
|
|
QMutexLocker Locker(&m_Mutex);
|
|
|
|
// if (!m_DefaultValues.isEmpty())
|
|
// {
|
|
// ASSERT(m_pConf->contains(key));
|
|
//#ifndef _DEBUG
|
|
// if (!m_DefaultValues[key].Check(value))
|
|
// return false;
|
|
//#endif
|
|
// }
|
|
|
|
m_pConf->setValue(key, value);
|
|
|
|
m_ValueCache.clear();
|
|
return true;
|
|
}
|
|
|
|
QVariant CSettings::GetValue(const QString &key, const QVariant& preset)
|
|
{
|
|
QMutexLocker Locker(&m_Mutex);
|
|
|
|
// ASSERT(m_DefaultValues.isEmpty() || m_pConf->contains(key));
|
|
|
|
return m_pConf->value(key, preset);
|
|
}
|
|
|
|
void CSettings::SetBlob(const QString& key, const QByteArray& value)
|
|
{
|
|
QString str;
|
|
//QByteArray data = Pack(value);
|
|
//if(data.size() < value.size())
|
|
// str = ":PackedArray:" + data.toBase64().replace("+","-").replace("/","_").replace("=","");
|
|
//else
|
|
str = ":ByteArray:" + value.toBase64().replace("+","-").replace("/","_").replace("=","");
|
|
SetValue(key, str);
|
|
}
|
|
|
|
QByteArray CSettings::GetBlob(const QString& key)
|
|
{
|
|
QByteArray value;
|
|
QByteArray str = GetValue(key).toByteArray();
|
|
if(str.left(11) == ":ByteArray:")
|
|
value = QByteArray::fromBase64(str.mid(11).replace("-","+").replace("_","/"));
|
|
//else if(str.left(13) == ":PackedArray:")
|
|
// value = Unpack(QByteArray::fromBase64(str.mid(13).replace("-","+").replace("_","/")));
|
|
return value;
|
|
}
|
|
|
|
const QStringList CSettings::ListKeys(const QString& Root)
|
|
{
|
|
QMutexLocker Locker(&m_Mutex);
|
|
QStringList Keys;
|
|
foreach(const QString& Key, m_pConf->allKeys())
|
|
{
|
|
QStringList Path = Key.split("/");
|
|
ASSERT(Path.count() == 2);
|
|
if(Path[0] == Root)
|
|
Keys.append(Path[1]);
|
|
}
|
|
return Keys;
|
|
}
|