From 34f820be1847c7ecb75bc2d40c889f59bf3befa4 Mon Sep 17 00:00:00 2001 From: TranRed Date: Wed, 1 May 2019 09:58:13 +0200 Subject: [PATCH] implemented fallback logic for corrupted window layout (#1039) * fallback logic for corrupted window layout 1. before saving the window-layout a backup will created to avoid corruption due to crashes while saving 2. when starting chatterino and the window-layout file returns and empty window layout (due to corruptio) the backup will be read and the layout will be build from this data * Update WindowManager.hpp * used QSaveFile instead of crude custom implementation * implemented suggested feedback from review * proper method call was tired and slightly drunk Kapp --- src/singletons/WindowManager.cpp | 21 ++++++++++++++------- src/singletons/WindowManager.hpp | 1 + 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index e90e04e0..09201481 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -258,11 +259,7 @@ void WindowManager::initialize(Settings &settings, Paths &paths) // load file QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME; - QFile file(settingsPath); - file.open(QIODevice::ReadOnly); - QByteArray data = file.readAll(); - QJsonDocument document = QJsonDocument::fromJson(data); - QJsonArray windows_arr = document.object().value("windows").toArray(); + QJsonArray windows_arr = this->loadWindowArray(settingsPath); // "deserialize" for (QJsonValue window_val : windows_arr) @@ -477,7 +474,7 @@ void WindowManager::save() // save file QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME; - QFile file(settingsPath); + QSaveFile file(settingsPath); file.open(QIODevice::WriteOnly | QIODevice::Truncate); QJsonDocument::JsonFormat format = @@ -489,7 +486,7 @@ void WindowManager::save() ; file.write(document.toJson(format)); - file.flush(); + file.commit(); } void WindowManager::sendAlert() @@ -622,4 +619,14 @@ void WindowManager::incGeneration() this->generation_++; } +QJsonArray WindowManager::loadWindowArray(const QString &settingsPath) +{ + QFile file(settingsPath); + file.open(QIODevice::ReadOnly); + QByteArray data = file.readAll(); + QJsonDocument document = QJsonDocument::fromJson(data); + QJsonArray windows_arr = document.object().value("windows").toArray(); + return windows_arr; +} + } // namespace chatterino diff --git a/src/singletons/WindowManager.hpp b/src/singletons/WindowManager.hpp index 038eb41a..dd9e7fb6 100644 --- a/src/singletons/WindowManager.hpp +++ b/src/singletons/WindowManager.hpp @@ -54,6 +54,7 @@ public: virtual void initialize(Settings &settings, Paths &paths) override; virtual void save() override; void closeAll(); + QJsonArray loadWindowArray(const QString &settingsPath); int getGeneration() const; void incGeneration();