refact: support query default application of a file or a mime type

Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
ComixHe 2023-10-30 13:19:40 +08:00 committed by Comix
parent 5e8c53479d
commit 1fe387b5a3
3 changed files with 21 additions and 13 deletions

View File

@ -2,10 +2,13 @@
<node> <node>
<interface name="org.desktopspec.MimeManager1"> <interface name="org.desktopspec.MimeManager1">
<method name="queryFileTypeAndDefaultApplication"> <method name="queryDefaultApplication">
<arg type="s" name="filePath" direction="in"/> <arg type="s" name="content" direction="in"/>
<arg type="s" name="mimeType" direction="out"/> <arg type="s" name="mimeType" direction="out"/>
<arg type="o" name="application" direction="out"/> <arg type="o" name="application" direction="out"/>
<annotation
name="org.freedesktop.DBus.Description"
value="content can be absolute path of a file or a mime type."/>
</method> </method>
<method name="setDefaultApplication"> <method name="setDefaultApplication">

View File

@ -38,22 +38,28 @@ ObjectMap MimeManager1Service::listApplications(const QString &mimeType) const n
} }
appIds.removeDuplicates(); appIds.removeDuplicates();
qInfo() << "query" << mimeType << "find:" << appIds; qInfo() << "query" << mimeType << "find:" << appIds;
const auto &apps = static_cast<ApplicationManager1Service *>(parent())->findApplicationsByIds(appIds); const auto &apps = dynamic_cast<ApplicationManager1Service *>(parent())->findApplicationsByIds(appIds);
return dumpDBusObject(apps); return dumpDBusObject(apps);
} }
QString MimeManager1Service::queryFileTypeAndDefaultApplication(const QString &filePath, QString MimeManager1Service::queryDefaultApplication(const QString &content, QDBusObjectPath &application) const noexcept
QDBusObjectPath &application) const noexcept
{ {
QString mimeType; QMimeType mime;
application = QDBusObjectPath{"/"}; QFileInfo info{content};
auto mime = m_database.mimeTypeForFile(filePath); if (info.isAbsolute() and info.exists() and info.isFile()) {
if (mime.isValid()) { mime = m_database.mimeTypeForFile(content);
mimeType = mime.name(); } else {
mime = m_database.mimeTypeForName(content);
}
if (!mime.isValid()) {
sendErrorReply(QDBusError::Failed, "query content is invalid.");
return {};
} }
QString defaultAppId; QString defaultAppId;
auto mimeType = mime.name();
for (auto it1 = m_infos.rbegin(); it1 != m_infos.rend(); ++it1) { for (auto it1 = m_infos.rbegin(); it1 != m_infos.rend(); ++it1) {
const auto &list = it1->appsList(); const auto &list = it1->appsList();
for (auto it2 = list.rbegin(); it2 != list.rend(); ++it2) { for (auto it2 = list.rbegin(); it2 != list.rend(); ++it2) {
@ -68,7 +74,7 @@ QString MimeManager1Service::queryFileTypeAndDefaultApplication(const QString &f
return mimeType; return mimeType;
} }
const auto &apps = static_cast<ApplicationManager1Service *>(parent())->findApplicationsByIds({defaultAppId}); const auto &apps = dynamic_cast<ApplicationManager1Service *>(parent())->findApplicationsByIds({defaultAppId});
if (apps.isEmpty()) { if (apps.isEmpty()) {
qWarning() << "default application has been found:" << defaultAppId qWarning() << "default application has been found:" << defaultAppId
<< " but we can't find corresponding application in ApplicationManagerService."; << " but we can't find corresponding application in ApplicationManagerService.";

View File

@ -26,8 +26,7 @@ public:
public Q_SLOTS: public Q_SLOTS:
[[nodiscard]] ObjectMap listApplications(const QString &mimeType) const noexcept; [[nodiscard]] ObjectMap listApplications(const QString &mimeType) const noexcept;
[[nodiscard]] QString queryFileTypeAndDefaultApplication(const QString &filePath, [[nodiscard]] QString queryDefaultApplication(const QString &content, QDBusObjectPath &application) const noexcept;
QDBusObjectPath &application) const noexcept;
void setDefaultApplication(const QStringMap &defaultApps) noexcept; void setDefaultApplication(const QStringMap &defaultApps) noexcept;
void unsetDefaultApplication(const QStringList &mimeTypes) noexcept; void unsetDefaultApplication(const QStringList &mimeTypes) noexcept;