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:
parent
75c333366a
commit
9833dd24eb
@ -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()) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user