fix: add fallback when query mime type

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

View File

@ -234,7 +234,7 @@ bool MimeApps::writeToFile() const noexcept
return true; return true;
} }
QString MimeApps::queryDefaultApp(const QMimeType &type) const noexcept QString MimeApps::queryDefaultApp(const QString &type) const noexcept
{ {
const auto &map = content(); const auto &map = content();
auto defaultSection = map.find(defaultApplications); auto defaultSection = map.find(defaultApplications);
@ -242,7 +242,7 @@ QString MimeApps::queryDefaultApp(const QMimeType &type) const noexcept
return {}; return {};
} }
auto defaultApp = defaultSection->find(type.name()); auto defaultApp = defaultSection->find(type);
if (defaultApp == defaultSection->end()) { if (defaultApp == defaultSection->end()) {
return {}; return {};
} }
@ -284,7 +284,7 @@ MimeCache::MimeCache(MimeFileBase &&base)
{ {
} }
QStringList MimeCache::queryApps(const QMimeType &type) const noexcept QStringList MimeCache::queryApps(const QString &type) const noexcept
{ {
const auto &content = this->content(); const auto &content = this->content();
auto it = content.constFind(mimeCache); auto it = content.constFind(mimeCache);
@ -294,7 +294,7 @@ QStringList MimeCache::queryApps(const QMimeType &type) const noexcept
} }
QStringList ret; QStringList ret;
if (auto kv = it->constFind(type.name()); kv != it->constEnd()) { if (auto kv = it->constFind(type); kv != it->constEnd()) {
const auto &apps = kv.value(); const auto &apps = kv.value();
for (const auto &e : apps) { for (const auto &e : apps) {
if (!e.endsWith(desktopSuffix.data())) { if (!e.endsWith(desktopSuffix.data())) {

View File

@ -67,7 +67,7 @@ public:
void setDefaultApplication(const QString &mimeType, const QString &appId) noexcept; void setDefaultApplication(const QString &mimeType, const QString &appId) noexcept;
void unsetDefaultApplication(const QString &mimeType) noexcept; void unsetDefaultApplication(const QString &mimeType) noexcept;
[[nodiscard]] QString queryDefaultApp(const QMimeType &type) const noexcept; [[nodiscard]] QString queryDefaultApp(const QString &type) const noexcept;
[[nodiscard]] AppList queryTypes(QString appId) const noexcept; [[nodiscard]] AppList queryTypes(QString appId) const noexcept;
[[nodiscard]] bool writeToFile() const noexcept; [[nodiscard]] bool writeToFile() const noexcept;
@ -87,7 +87,7 @@ public:
MimeCache &operator=(const MimeCache &) = delete; MimeCache &operator=(const MimeCache &) = delete;
~MimeCache() override = default; ~MimeCache() override = default;
[[nodiscard]] QStringList queryApps(const QMimeType &type) const noexcept; [[nodiscard]] QStringList queryApps(const QString &type) const noexcept;
[[nodiscard]] QStringList queryTypes(QString appId) const noexcept; [[nodiscard]] QStringList queryTypes(QString appId) const noexcept;
private: private:

View File

@ -20,10 +20,10 @@ MimeManager1Service::~MimeManager1Service() = default;
ObjectMap MimeManager1Service::listApplications(const QString &mimeType) const noexcept ObjectMap MimeManager1Service::listApplications(const QString &mimeType) const noexcept
{ {
auto mime = m_database.mimeTypeForName(mimeType); auto type = m_database.mimeTypeForName(mimeType).name();
if (!mime.isValid()) { if (type.isEmpty()) {
qWarning() << "can't find" << mimeType; qInfo() << "try to query raw type:" << mimeType;
return {}; type = mimeType;
} }
QStringList appIds; QStringList appIds;
@ -33,7 +33,7 @@ ObjectMap MimeManager1Service::listApplications(const QString &mimeType) const n
if (!info) { if (!info) {
continue; continue;
} }
auto apps = info->queryApps(mime); auto apps = info->queryApps(type);
appIds.append(std::move(apps)); appIds.append(std::move(apps));
} }
appIds.removeDuplicates(); appIds.removeDuplicates();
@ -53,17 +53,18 @@ QString MimeManager1Service::queryDefaultApplication(const QString &content, QDB
mime = m_database.mimeTypeForName(content); mime = m_database.mimeTypeForName(content);
} }
if (!mime.isValid()) { auto type = mime.name();
sendErrorReply(QDBusError::Failed, "query content is invalid.");
return {}; if (type.isEmpty()) {
qInfo() << "try to query raw content:" << content;
type = content;
} }
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) {
if (auto app = it2->queryDefaultApp(mime); !app.isEmpty()) { if (auto app = it2->queryDefaultApp(type); !app.isEmpty()) {
defaultAppId = app; defaultAppId = app;
} }
} }
@ -71,7 +72,7 @@ QString MimeManager1Service::queryDefaultApplication(const QString &content, QDB
if (defaultAppId.isEmpty()) { if (defaultAppId.isEmpty()) {
qInfo() << "file's mimeType:" << mime.name() << "but can't find a default application for this type."; qInfo() << "file's mimeType:" << mime.name() << "but can't find a default application for this type.";
return mimeType; return type;
} }
const auto &apps = dynamic_cast<ApplicationManager1Service *>(parent())->findApplicationsByIds({defaultAppId}); const auto &apps = dynamic_cast<ApplicationManager1Service *>(parent())->findApplicationsByIds({defaultAppId});
@ -82,7 +83,7 @@ QString MimeManager1Service::queryDefaultApplication(const QString &content, QDB
application = apps.firstKey(); application = apps.firstKey();
} }
return mimeType; return type;
} }
void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) noexcept void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) noexcept