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>
<interface name="org.desktopspec.MimeManager1">
<method name="queryFileTypeAndDefaultApplication">
<arg type="s" name="filePath" direction="in"/>
<method name="queryDefaultApplication">
<arg type="s" name="content" direction="in"/>
<arg type="s" name="mimeType" 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 name="setDefaultApplication">

View File

@ -38,22 +38,28 @@ ObjectMap MimeManager1Service::listApplications(const QString &mimeType) const n
}
appIds.removeDuplicates();
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);
}
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<ApplicationManager1Service *>(parent())->findApplicationsByIds({defaultAppId});
const auto &apps = dynamic_cast<ApplicationManager1Service *>(parent())->findApplicationsByIds({defaultAppId});
if (apps.isEmpty()) {
qWarning() << "default application has been found:" << defaultAppId
<< " but we can't find corresponding application in ApplicationManagerService.";

View File

@ -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;