From 1fe387b5a33552b2525504d8f4899a5e44ee30e5 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Mon, 30 Oct 2023 13:19:40 +0800 Subject: [PATCH] refact: support query default application of a file or a mime type Signed-off-by: ComixHe --- api/dbus/org.desktopspec.MimeManager1.xml | 7 +++++-- src/dbus/mimemanager1service.cpp | 24 ++++++++++++++--------- src/dbus/mimemanager1service.h | 3 +-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/api/dbus/org.desktopspec.MimeManager1.xml b/api/dbus/org.desktopspec.MimeManager1.xml index 6a63b9a..370b3f2 100644 --- a/api/dbus/org.desktopspec.MimeManager1.xml +++ b/api/dbus/org.desktopspec.MimeManager1.xml @@ -2,10 +2,13 @@ - - + + + diff --git a/src/dbus/mimemanager1service.cpp b/src/dbus/mimemanager1service.cpp index 05a8d7c..2007274 100644 --- a/src/dbus/mimemanager1service.cpp +++ b/src/dbus/mimemanager1service.cpp @@ -38,22 +38,28 @@ ObjectMap MimeManager1Service::listApplications(const QString &mimeType) const n } appIds.removeDuplicates(); qInfo() << "query" << mimeType << "find:" << appIds; - const auto &apps = static_cast(parent())->findApplicationsByIds(appIds); + const auto &apps = dynamic_cast(parent())->findApplicationsByIds(appIds); return dumpDBusObject(apps); } -QString MimeManager1Service::queryFileTypeAndDefaultApplication(const QString &filePath, - QDBusObjectPath &application) const noexcept +QString MimeManager1Service::queryDefaultApplication(const QString &content, QDBusObjectPath &application) const noexcept { - QString mimeType; - application = QDBusObjectPath{"/"}; + QMimeType mime; + QFileInfo info{content}; - auto mime = m_database.mimeTypeForFile(filePath); - if (mime.isValid()) { - mimeType = mime.name(); + if (info.isAbsolute() and info.exists() and info.isFile()) { + mime = m_database.mimeTypeForFile(content); + } else { + mime = m_database.mimeTypeForName(content); + } + + if (!mime.isValid()) { + sendErrorReply(QDBusError::Failed, "query content is invalid."); + return {}; } QString defaultAppId; + auto mimeType = mime.name(); for (auto it1 = m_infos.rbegin(); it1 != m_infos.rend(); ++it1) { const auto &list = it1->appsList(); for (auto it2 = list.rbegin(); it2 != list.rend(); ++it2) { @@ -68,7 +74,7 @@ QString MimeManager1Service::queryFileTypeAndDefaultApplication(const QString &f return mimeType; } - const auto &apps = static_cast(parent())->findApplicationsByIds({defaultAppId}); + const auto &apps = dynamic_cast(parent())->findApplicationsByIds({defaultAppId}); if (apps.isEmpty()) { qWarning() << "default application has been found:" << defaultAppId << " but we can't find corresponding application in ApplicationManagerService."; diff --git a/src/dbus/mimemanager1service.h b/src/dbus/mimemanager1service.h index 747c965..e553cdf 100644 --- a/src/dbus/mimemanager1service.h +++ b/src/dbus/mimemanager1service.h @@ -26,8 +26,7 @@ public: public Q_SLOTS: [[nodiscard]] ObjectMap listApplications(const QString &mimeType) const noexcept; - [[nodiscard]] QString queryFileTypeAndDefaultApplication(const QString &filePath, - QDBusObjectPath &application) const noexcept; + [[nodiscard]] QString queryDefaultApplication(const QString &content, QDBusObjectPath &application) const noexcept; void setDefaultApplication(const QStringMap &defaultApps) noexcept; void unsetDefaultApplication(const QStringList &mimeTypes) noexcept;