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{"/"});