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
This commit is contained in:
TranRed 2019-05-01 09:58:13 +02:00 committed by fourtf
parent ad559f9d97
commit 34f820be18
2 changed files with 15 additions and 7 deletions

View file

@ -22,6 +22,7 @@
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QSaveFile>
#include <chrono> #include <chrono>
@ -258,11 +259,7 @@ void WindowManager::initialize(Settings &settings, Paths &paths)
// load file // load file
QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME; QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME;
QFile file(settingsPath); QJsonArray windows_arr = this->loadWindowArray(settingsPath);
file.open(QIODevice::ReadOnly);
QByteArray data = file.readAll();
QJsonDocument document = QJsonDocument::fromJson(data);
QJsonArray windows_arr = document.object().value("windows").toArray();
// "deserialize" // "deserialize"
for (QJsonValue window_val : windows_arr) for (QJsonValue window_val : windows_arr)
@ -477,7 +474,7 @@ void WindowManager::save()
// save file // save file
QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME; QString settingsPath = getPaths()->settingsDirectory + SETTINGS_FILENAME;
QFile file(settingsPath); QSaveFile file(settingsPath);
file.open(QIODevice::WriteOnly | QIODevice::Truncate); file.open(QIODevice::WriteOnly | QIODevice::Truncate);
QJsonDocument::JsonFormat format = QJsonDocument::JsonFormat format =
@ -489,7 +486,7 @@ void WindowManager::save()
; ;
file.write(document.toJson(format)); file.write(document.toJson(format));
file.flush(); file.commit();
} }
void WindowManager::sendAlert() void WindowManager::sendAlert()
@ -622,4 +619,14 @@ void WindowManager::incGeneration()
this->generation_++; 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 } // namespace chatterino

View file

@ -54,6 +54,7 @@ public:
virtual void initialize(Settings &settings, Paths &paths) override; virtual void initialize(Settings &settings, Paths &paths) override;
virtual void save() override; virtual void save() override;
void closeAll(); void closeAll();
QJsonArray loadWindowArray(const QString &settingsPath);
int getGeneration() const; int getGeneration() const;
void incGeneration(); void incGeneration();