From 9833dd24eb2a5da8ecde71bb99fedcf59d98ea26 Mon Sep 17 00:00:00 2001 From: ComixHe Date: Tue, 9 Jan 2024 15:16:01 +0800 Subject: [PATCH] fix: create user's mimeapp when it doesn't exists issue: https://github.com/linuxdeepin/developer-center/issues/6794 Signed-off-by: ComixHe --- src/applicationmimeinfo.cpp | 33 +++++++++++++++++++++----------- src/dbus/mimemanager1service.cpp | 12 ++++++++++++ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/applicationmimeinfo.cpp b/src/applicationmimeinfo.cpp index b2254cd..09f1b7d 100644 --- a/src/applicationmimeinfo.cpp +++ b/src/applicationmimeinfo.cpp @@ -88,11 +88,6 @@ std::optional MimeFileBase::loadFromFile(const QFileInfo &fileInfo return std::nullopt; } - if (content.isEmpty()) { - qInfo() << "ignore empty file:" << filePath; - return std::nullopt; - } - return MimeFileBase{fileInfo, std::move(content), desktopSpec, isWritable}; } @@ -306,6 +301,23 @@ QStringList MimeCache::queryApps(const QString &type) const noexcept return ret; } +void createUserConfig(const QString &filename) noexcept +{ + QFile userFile{filename}; + if (!userFile.open(QFile::WriteOnly | QFile::Text)) { + qCritical() << "failed to create user file:" << filename << userFile.errorString(); + } + + decltype(auto) initContent = u8"[Default Applications]"; + if (userFile.write(initContent) == sizeof(initContent) - 1 and userFile.flush()) { + qInfo() << "create user mimeapps:" << filename; + return; + } + + qWarning() << "failed to write content into" << filename << userFile.errorString(); + userFile.remove(); +} + std::optional MimeInfo::createMimeInfo(const QString &directory) noexcept { MimeInfo ret; @@ -333,12 +345,11 @@ std::optional MimeInfo::createMimeInfo(const QString &directory) noexc } QFileInfo appList{dir.filePath("mimeapps.list")}; - if (auto userMimeApps = appList.absoluteFilePath(); - userMimeApps.startsWith(getXDGConfigHome()) and (!appList.exists() or !appList.isFile())) [[unlikely]] { - QFile userFile{userMimeApps}; - if (!userFile.open(QFile::WriteOnly | QFile::Text)) { - qCritical() << "failed to create user file:" << userMimeApps << userFile.errorString(); - } + appList.setCaching(false); + + auto userMimeApps = appList.absoluteFilePath(); + if (userMimeApps.startsWith(getXDGConfigHome()) and (!appList.exists() or !appList.isFile())) { + createUserConfig(userMimeApps); } if (appList.exists() and appList.isFile()) { diff --git a/src/dbus/mimemanager1service.cpp b/src/dbus/mimemanager1service.cpp index df565f2..0d18e0c 100644 --- a/src/dbus/mimemanager1service.cpp +++ b/src/dbus/mimemanager1service.cpp @@ -90,9 +90,21 @@ QString MimeManager1Service::queryDefaultApplication(const QString &content, QDB void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) noexcept { auto &app = m_infos.front().appsList(); + + if (app.empty()) { + sendErrorReply(QDBusError::InternalError); + return; + } + auto userConfig = std::find_if( app.begin(), app.end(), [](const MimeApps &config) { return !config.isDesktopSpecific(); }); // always find this + if (userConfig == app.end()) { + qWarning() << "couldn't find user mimeApps"; + sendErrorReply(QDBusError::InternalError); + return; + } + for (auto it = defaultApps.constKeyValueBegin(); it != defaultApps.constKeyValueEnd(); ++it) { userConfig->setDefaultApplication(it->first, it->second); }