Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions docs/global/dconfig.zh_CN.dox
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@
@sa DBusBackend::reset()
@sa QSettingBackend::reset()

@fn bool Dtk::Core::DConfigBackend::isReadOnly(const QString &key)
@brief 检测指定配置项是否为只读
@param[in] key 配置项名称
@return 如果配置项为只读返回true,否则返回false
@sa DConfig::isReadOnly()
@sa FileBackend::isReadOnly()
@sa DBusBackend::isReadOnly()

@fn QString Dtk::Core::DConfigBackend::name() const = 0
@brief 后端配置的唯一标识
@sa FileBackend::name()
Expand Down Expand Up @@ -384,6 +392,11 @@ sudo make install
@brief 设置其配置项对应的默认值,此值为经过override机制覆盖后的值,不一定为此配置文件中meta中定义的值
@param[in] key 配置项名称

@fn bool Dtk::Core::DConfig::isReadOnly(const QString &key)
@brief 检测指定配置项是否为只读
@param[in] key 配置项名称
@return 如果配置项为只读返回true,否则返回false

@fn QString Dtk::Core::DConfig::name()
@brief 返回配置文件名称

Expand Down
2 changes: 2 additions & 0 deletions include/global/dconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class DConfigBackend {
virtual void reset(const QString &key) { setValue(key, QVariant());}
virtual QString name() const {return QString("");}
virtual bool isDefaultValue(const QString &/*key*/) const { return true; }
virtual bool isReadOnly(const QString &/*key*/) const { return false; }
};

class DConfigPrivate;
Expand Down Expand Up @@ -61,6 +62,7 @@ class LIBDTKCORESHARED_EXPORT DConfig : public QObject, public DObject
QVariant value(const QString &key, const QVariant &fallback = QVariant()) const;
void setValue(const QString &key, const QVariant &value);
void reset(const QString &key);
bool isReadOnly(const QString &key) const;

QString name() const;
QString subpath() const;
Expand Down
40 changes: 40 additions & 0 deletions src/dconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,13 @@ static QString NoAppId;
@sa DConfig::reset()
*/

/*!
@~english
@fn bool DConfigBackend::isReadOnly(const QString &key) const = 0

@sa DConfig::isReadOnly()
*/

/*!
@~english
@fn QString DConfigBackend::name() const = 0
Expand Down Expand Up @@ -230,6 +237,12 @@ class Q_DECL_HIDDEN FileBackend : public DConfigBackend
setValue(key, QVariant());
}

virtual bool isReadOnly(const QString &key) const override
{
const auto vc = configFile->meta()->permissions(key);
return vc == DConfigFile::ReadOnly;
}

virtual QString name() const override
{
return QString("FileBackend");
Expand Down Expand Up @@ -425,6 +438,18 @@ class Q_DECL_HIDDEN DBusBackend : public DConfigBackend
<< ", error message:" << reply.error();
}

virtual bool isReadOnly(const QString &key) const override
{
auto reply = config->permissions(key);
reply.waitForFinished();
if (reply.isError()) {
qWarning() << "Failed to call `permissions`, key:" << key
<< ", error message:" << reply.error().message();
return false;
}
return reply.value() == QLatin1String("readonly");
}

virtual QString name() const override
{
return QString("DBusBackend");
Expand Down Expand Up @@ -821,6 +846,21 @@ void DConfig::reset(const QString &key)
d->backend->reset(key);
}

/*!
* @~english
* @brief Check whether the configuration item is read-only
* @param key Configuration Item Name
* @return Return `true` if the configuration item is read-only, otherwise return `false`
*/
bool DConfig::isReadOnly(const QString &key) const
{
D_DC(DConfig);
if (d->invalid())
return false;

return d->backend->isReadOnly(key);
}

/*!
@~english
* @brief Return configuration file name
Expand Down
20 changes: 20 additions & 0 deletions tests/data/dconf-example.meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,26 @@
"description": "I am public configure",
"permissions": "readwrite",
"visibility": "private"
},
"readwrite": {
"value": true,
"serial": 0,
"flags": [],
"name": "readwrite configure",
"name[zh_CN]": "我是可读写配置",
"description": "I am a readwrite configure",
"permissions": "readwrite",
"visibility": "private"
},
"readonly": {
"value": true,
"serial": 0,
"flags": [],
"name": "readonly configure",
"name[zh_CN]": "我是只读配置",
"description": "I am a readonly configure",
"permissions": "readonly",
"visibility": "private"
}
}
}
11 changes: 11 additions & 0 deletions tests/ut_dconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -226,3 +226,14 @@ TEST_F(ut_DConfig, isDefaultValue) {
EXPECT_EQ(config.isDefaultValue("key2"), true);
}
}

TEST_F(ut_DConfig, isReadOnly) {

FileCopyGuard guard(":/data/dconf-example.meta.json", metaFilePath);
{
DConfig config(FILE_NAME);
EXPECT_TRUE(config.isValid());
ASSERT_EQ(config.isReadOnly("readwrite"), false);
EXPECT_EQ(config.isReadOnly("readonly"), true);
}
}