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;
}
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> MimeInfo::createMimeInfo(const QString &directory) noexcept
{
MimeInfo ret;
@ -333,12 +345,11 @@ std::optional<MimeInfo> 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()) {

View File

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