diff --git a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml
index 112c09c..b19efeb 100644
--- a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml
+++ b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml
@@ -7,6 +7,9 @@
/>
+
+
+
desktopFileSource().modified(mtime)) {
+ if (destApp->desktopFileSource().modified(std::get<1>(mtime))) {
auto *newEntry = new (std::nothrow) DesktopEntry{};
if (newEntry == nullptr) {
qCritical() << "new DesktopEntry failed.";
diff --git a/src/dbus/applicationservice.cpp b/src/dbus/applicationservice.cpp
index 6ffe725..076d59a 100644
--- a/src/dbus/applicationservice.cpp
+++ b/src/dbus/applicationservice.cpp
@@ -264,6 +264,23 @@ QString ApplicationService::id() const noexcept
return m_desktopSource.desktopId();
}
+bool ApplicationService::x_Flatpak() const noexcept
+{
+ auto val = findEntryValue(DesktopFileEntryKey, "X-flatpak", EntryValueType::String);
+ return val.isNull();
+}
+
+bool ApplicationService::x_linglong() const noexcept
+{
+ auto val = findEntryValue(DesktopFileEntryKey, "X-linglong", EntryValueType::String);
+ return val.isNull();
+}
+
+qulonglong ApplicationService::installedTime() const noexcept
+{
+ return m_desktopSource.createTime();
+}
+
qulonglong ApplicationService::lastLaunchedTime() const noexcept
{
return m_lastLaunch;
diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h
index 0e3b98e..b4e991b 100644
--- a/src/dbus/applicationservice.h
+++ b/src/dbus/applicationservice.h
@@ -60,6 +60,15 @@ public:
Q_PROPERTY(QList Instances READ instances)
[[nodiscard]] QList instances() const noexcept;
+ Q_PROPERTY(bool X_Flatpak READ x_Flatpak)
+ [[nodiscard]] bool x_Flatpak() const noexcept;
+
+ Q_PROPERTY(bool X_linglong READ x_linglong)
+ [[nodiscard]] bool x_linglong() const noexcept;
+
+ Q_PROPERTY(qulonglong installedTime READ installedTime)
+ [[nodiscard]] qulonglong installedTime() const noexcept;
+
[[nodiscard]] QDBusObjectPath findInstance(const QString &instanceId) const;
[[nodiscard]] const QString &getLauncher() const noexcept { return m_launcher; }
diff --git a/src/desktopentry.cpp b/src/desktopentry.cpp
index bd3e332..6826023 100644
--- a/src/desktopentry.cpp
+++ b/src/desktopentry.cpp
@@ -259,12 +259,12 @@ bool DesktopEntry::checkMainEntryValidation() const noexcept
std::optional DesktopFile::createTemporaryDesktopFile(std::unique_ptr temporaryFile) noexcept
{
- auto mtime = getFileModifiedTime(*temporaryFile);
+ auto [ctime, mtime, _] = getFileTimeInfo(*temporaryFile);
if (mtime == 0) {
qWarning() << "create temporary file failed.";
return std::nullopt;
}
- return DesktopFile{std::move(temporaryFile), "", mtime};
+ return DesktopFile{std::move(temporaryFile), "", mtime, ctime};
}
std::optional DesktopFile::createTemporaryDesktopFile(const QString &temporaryFile) noexcept
@@ -330,7 +330,7 @@ std::optional DesktopFile::searchDesktopFileByPath(const QString &d
auto filePtr = std::make_unique(std::move(path));
- auto mtime = getFileModifiedTime(*filePtr);
+ auto [ctime, mtime, _] = getFileTimeInfo(*filePtr);
if (mtime == 0) {
err = DesktopErrorCode::OpenFailed;
@@ -338,7 +338,7 @@ std::optional DesktopFile::searchDesktopFileByPath(const QString &d
}
err = DesktopErrorCode::NoError;
- return DesktopFile{std::move(filePtr), std::move(id), mtime};
+ return DesktopFile{std::move(filePtr), std::move(id), mtime, ctime};
}
std::optional DesktopFile::searchDesktopFileById(const QString &appId, DesktopErrorCode &err) noexcept
diff --git a/src/desktopentry.h b/src/desktopentry.h
index b7ca1d3..ce8b564 100644
--- a/src/desktopentry.h
+++ b/src/desktopentry.h
@@ -48,6 +48,7 @@ struct DesktopFile
[[nodiscard]] QFile &sourceFileRef() const noexcept { return *m_fileSource; };
[[nodiscard]] const QString &desktopId() const noexcept { return m_desktopId; }
[[nodiscard]] bool modified(std::size_t time) const noexcept;
+ [[nodiscard]] std::size_t createTime() const noexcept { return m_ctime; }
static std::optional searchDesktopFileById(const QString &appId, DesktopErrorCode &err) noexcept;
static std::optional searchDesktopFileByPath(const QString &desktopFilePath, DesktopErrorCode &err) noexcept;
@@ -55,14 +56,16 @@ struct DesktopFile
static std::optional createTemporaryDesktopFile(std::unique_ptr temporaryFile) noexcept;
private:
- DesktopFile(std::unique_ptr source, QString fileId, std::size_t mtime)
+ DesktopFile(std::unique_ptr source, QString fileId, std::size_t mtime, std::size_t ctime)
: m_mtime(mtime)
+ , m_ctime(ctime)
, m_fileSource(std::move(source))
, m_desktopId(std::move(fileId))
{
}
std::size_t m_mtime;
+ std::size_t m_ctime;
std::unique_ptr m_fileSource{nullptr};
QString m_desktopId{""};
};
diff --git a/src/global.h b/src/global.h
index eef5643..0dedb0b 100644
--- a/src/global.h
+++ b/src/global.h
@@ -467,7 +467,7 @@ ObjectMap dumpDBusObject(const QMap> &map)
return objs;
}
-inline std::size_t getFileModifiedTime(QFile &file)
+inline std::tuple getFileTimeInfo(QFile &file)
{
struct stat buf;
QFileInfo info{file};
@@ -475,17 +475,22 @@ inline std::size_t getFileModifiedTime(QFile &file)
if (!file.isOpen()) {
if (auto ret = file.open(QFile::ExistingOnly | QFile::ReadOnly | QFile::Text); !ret) {
qWarning() << "open file" << info.absoluteFilePath() << "failed.";
- return 0;
+ return std::make_tuple(0, 0, 0);
}
}
if (auto ret = stat(info.absoluteFilePath().toLocal8Bit().data(), &buf); ret == -1) {
qWarning() << "get file" << info.absoluteFilePath() << "state failed:" << std::strerror(errno);
- return 0;
+ return std::make_tuple(0, 0, 0);
}
constexpr std::size_t secToNano = 1e9;
- return buf.st_mtim.tv_sec * secToNano + buf.st_mtim.tv_nsec;
+
+ auto mtime = buf.st_mtim.tv_sec * secToNano + buf.st_mtim.tv_nsec;
+ auto ctime = buf.st_ctim.tv_sec * secToNano + buf.st_ctim.tv_nsec;
+ auto atime = buf.st_atim.tv_sec * secToNano + buf.st_atim.tv_nsec;
+
+ return std::make_tuple(ctime, mtime, atime);
}
#endif
diff --git a/tests/ut_applicationmanager.cpp b/tests/ut_applicationmanager.cpp
index ef352e7..c917bf0 100644
--- a/tests/ut_applicationmanager.cpp
+++ b/tests/ut_applicationmanager.cpp
@@ -36,7 +36,7 @@ public:
m_am = new ApplicationManager1Service{std::make_unique(), bus.globalServerBus()};
auto ptr = std::make_unique(QString{"/usr/share/applications/test-Application.desktop"});
- DesktopFile file{std::move(ptr), "test-Application", 0};
+ DesktopFile file{std::move(ptr), "test-Application", 0, 0};
QSharedPointer app = QSharedPointer::create(std::move(file), nullptr);
QSharedPointer instance =
QSharedPointer::create(InstancePath.path().split('/').last(), ApplicationPath.path(), QString{"/"});