inputd: save profiles atomically

This commit is contained in:
Marco Allegretti 2026-02-13 13:16:36 +01:00
parent 9160076aa2
commit a032bec8c4

View file

@ -15,6 +15,7 @@
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QSaveFile>
#include <QStandardPaths> #include <QStandardPaths>
#include <memory> #include <memory>
@ -87,14 +88,6 @@ static QString gamepadTypeToString(SDL_GamepadType t)
return QStringLiteral("unknown"); return QStringLiteral("unknown");
} }
} }
static QVariantMap unwrapVariantMap(QVariant v)
{
if (v.canConvert<QVariantMap>()) {
return v.toMap();
}
return {};
}
} }
QVariantMap InputDaemon::Profile::toVariantMap() const QVariantMap InputDaemon::Profile::toVariantMap() const
@ -273,7 +266,10 @@ void InputDaemon::loadProfiles()
bool InputDaemon::saveProfiles() const bool InputDaemon::saveProfiles() const
{ {
const QString path = profilesPath(); const QString path = profilesPath();
QDir().mkpath(QFileInfo(path).absolutePath()); const QString dirPath = QFileInfo(path).absolutePath();
if (!QDir().mkpath(dirPath)) {
return false;
}
QJsonArray profiles; QJsonArray profiles;
for (const Profile &p : m_profiles) { for (const Profile &p : m_profiles) {
@ -289,13 +285,17 @@ bool InputDaemon::saveProfiles() const
root.insert(QStringLiteral("profiles"), profiles); root.insert(QStringLiteral("profiles"), profiles);
root.insert(QStringLiteral("assignments"), assignments); root.insert(QStringLiteral("assignments"), assignments);
QFile f(path); QSaveFile f(path);
if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) { if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
return false; return false;
} }
f.write(QJsonDocument(root).toJson()); const QByteArray payload = QJsonDocument(root).toJson();
return true; if (f.write(payload) != payload.size()) {
return false;
}
return f.commit();
} }
InputDaemon::Profile InputDaemon::profileById(const QString &profileId) const InputDaemon::Profile InputDaemon::profileById(const QString &profileId) const