fix: create user's mimeapp when it doesn't exists

issue: https://github.com/linuxdeepin/developer-center/issues/6794

Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
ComixHe 2024-01-09 15:16:01 +08:00 committed by Comix
parent 75c333366a
commit 9833dd24eb
2 changed files with 34 additions and 11 deletions

View File

@ -88,11 +88,6 @@ std::optional<MimeFileBase> MimeFileBase::loadFromFile(const QFileInfo &fileInfo
return std::nullopt; return std::nullopt;
} }
if (content.isEmpty()) {
qInfo() << "ignore empty file:" << filePath;
return std::nullopt;
}
return MimeFileBase{fileInfo, std::move(content), desktopSpec, isWritable}; return MimeFileBase{fileInfo, std::move(content), desktopSpec, isWritable};
} }
@ -306,6 +301,23 @@ QStringList MimeCache::queryApps(const QString &type) const noexcept
return ret; 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> MimeInfo::createMimeInfo(const QString &directory) noexcept std::optional<MimeInfo> MimeInfo::createMimeInfo(const QString &directory) noexcept
{ {
MimeInfo ret; MimeInfo ret;
@ -333,12 +345,11 @@ std::optional<MimeInfo> MimeInfo::createMimeInfo(const QString &directory) noexc
} }
QFileInfo appList{dir.filePath("mimeapps.list")}; QFileInfo appList{dir.filePath("mimeapps.list")};
if (auto userMimeApps = appList.absoluteFilePath(); appList.setCaching(false);
userMimeApps.startsWith(getXDGConfigHome()) and (!appList.exists() or !appList.isFile())) [[unlikely]] {
QFile userFile{userMimeApps}; auto userMimeApps = appList.absoluteFilePath();
if (!userFile.open(QFile::WriteOnly | QFile::Text)) { if (userMimeApps.startsWith(getXDGConfigHome()) and (!appList.exists() or !appList.isFile())) {
qCritical() << "failed to create user file:" << userMimeApps << userFile.errorString(); createUserConfig(userMimeApps);
}
} }
if (appList.exists() and appList.isFile()) { if (appList.exists() and appList.isFile()) {

View File

@ -90,9 +90,21 @@ QString MimeManager1Service::queryDefaultApplication(const QString &content, QDB
void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) noexcept void MimeManager1Service::setDefaultApplication(const QStringMap &defaultApps) noexcept
{ {
auto &app = m_infos.front().appsList(); auto &app = m_infos.front().appsList();
if (app.empty()) {
sendErrorReply(QDBusError::InternalError);
return;
}
auto userConfig = std::find_if( auto userConfig = std::find_if(
app.begin(), app.end(), [](const MimeApps &config) { return !config.isDesktopSpecific(); }); // always find this 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) { for (auto it = defaultApps.constKeyValueBegin(); it != defaultApps.constKeyValueEnd(); ++it) {
userConfig->setDefaultApplication(it->first, it->second); userConfig->setDefaultApplication(it->first, it->second);
} }