Skip to content

Commit

Permalink
sync: from linuxdeepin/dtkcore
Browse files Browse the repository at this point in the history
Synchronize source files from linuxdeepin/dtkcore.

Source-pull-request: linuxdeepin/dtkcore#451
  • Loading branch information
deepin-ci-robot authored and mhduiy committed Dec 12, 2024
1 parent 66f1448 commit 12dc3da
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 1 deletion.
17 changes: 17 additions & 0 deletions src/dconfigfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1288,12 +1288,22 @@ class Q_DECL_HIDDEN DConfigFilePrivate : public DObjectPrivate {
return cache->setValue(key, value, configMeta->serial(key), cache->uid(), appid);

// convert copy to meta's type, it promises `setValue` don't change meta's type.
// canConvert isn't explicit, e.g: QString is also can convert to double.
auto copy = value;
if (!copy.convert(metaValue.metaType())) {
qCWarning(cfLog) << "check type error, meta type is " << metaValue.metaType().name()
<< ", and now type is " << value.metaType().name();
return false;
}

// TODO it's a bug of qt, MetaType of 1.0 is qlonglong instead of double in json file.
static const QVector<QMetaType> filterConvertType {
QMetaType{QMetaType::Double}
};
// reset to origin value.
if (filterConvertType.contains(value.metaType())) {
copy = value;
}
#else
if (metaValue.type() == value.type())
return cache->setValue(key, value, configMeta->serial(key), cache->uid(), appid);
Expand All @@ -1304,6 +1314,13 @@ class Q_DECL_HIDDEN DConfigFilePrivate : public DObjectPrivate {
<< ", and now type is " << value.type();
return false;
}

static const QVector<QVariant::Type> filterConvertType {
QVariant::Double
};
if (filterConvertType.contains(value.type())) {
copy = value;
}
#endif

return cache->setValue(key, copy, configMeta->serial(key), cache->uid(), appid);
Expand Down
4 changes: 3 additions & 1 deletion src/dsgapplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ QByteArray DSGApplication::getId(qint64 pid)

int pidfd = syscall(SYS_pidfd_open, pid, 0);
if (pidfd < 0) {
qCWarning(dsgApp) << "pidfd open failed:" << strerror(errno);
qCWarning(dsgApp) << "pidfd open failed:" << strerror(errno) << ", the pid:" << pid;
return QByteArray();
}

Expand All @@ -109,6 +109,8 @@ QByteArray DSGApplication::getId(qint64 pid)
"org.desktopspec.ApplicationManager1");

QDBusReply<QString> reply = infc.call("Identify", QVariant::fromValue(QDBusUnixFileDescriptor(pidfd)));
// see QDBusUnixFileDescriptor: The original file descriptor is not touched and must be closed by the user.
close(pidfd);

if (!reply.isValid()) {
qCWarning(dsgApp) << "Identify from AM failed." << reply.error().message();
Expand Down
8 changes: 8 additions & 0 deletions tests/data/dconf-example.meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@
"permissions": "readwrite",
"visibility": "public"
},
"numberDouble": {
"value": 1.0,
"serial": 0,
"flags": ["global"],
"name": "double value type",
"permissions": "readwrite",
"visibility": "public"
},
"array": {
"value": ["value1", "value2"],
"serial": 0,
Expand Down
5 changes: 5 additions & 0 deletions tests/ut_dconfigfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ TEST_F(ut_DConfigFile, setValueTypeCheck) {
ASSERT_FALSE(config.setValue("number", "1ab", "test", userCache.get()));
ASSERT_EQ(config.value("number", userCache.get()).type(), type);
}
{
const auto type = config.value("numberDouble", userCache.get()).type();
ASSERT_TRUE(config.setValue("numberDouble", 1.2, "test", userCache.get()));
ASSERT_EQ(config.value("numberDouble", userCache.get()), 1.2);
}
{
const auto type = config.value("array", userCache.get()).type();
const QStringList array{"value1", "value2"};
Expand Down

0 comments on commit 12dc3da

Please sign in to comment.