diff --git a/docs/global/dconfig.zh_CN.dox b/docs/global/dconfig.zh_CN.dox index a37c82a0..f3861070 100644 --- a/docs/global/dconfig.zh_CN.dox +++ b/docs/global/dconfig.zh_CN.dox @@ -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() @@ -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 返回配置文件名称 diff --git a/include/global/dconfig.h b/include/global/dconfig.h index c4c633b0..45eb9f39 100644 --- a/include/global/dconfig.h +++ b/include/global/dconfig.h @@ -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; @@ -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; diff --git a/src/dconfig.cpp b/src/dconfig.cpp index ce1c4222..5a1b4d22 100644 --- a/src/dconfig.cpp +++ b/src/dconfig.cpp @@ -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 @@ -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"); @@ -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"); @@ -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 diff --git a/tests/data/dconf-example.meta.json b/tests/data/dconf-example.meta.json index 4063fab8..eccba33d 100755 --- a/tests/data/dconf-example.meta.json +++ b/tests/data/dconf-example.meta.json @@ -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" } } } diff --git a/tests/ut_dconfig.cpp b/tests/ut_dconfig.cpp index 5c720f87..6cd1bf53 100644 --- a/tests/ut_dconfig.cpp +++ b/tests/ut_dconfig.cpp @@ -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); + } +}