diff --git a/CMakeLists.txt b/CMakeLists.txt index fe499da3..1f460426 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,6 +147,8 @@ target_sources( ${LIB_NAME} PRIVATE lib/utils/action-queue.cpp lib/utils/action-queue.hpp + lib/utils/backup.cpp + lib/utils/backup.hpp lib/utils/curl-helper.cpp lib/utils/curl-helper.hpp lib/utils/duration-control.cpp diff --git a/lib/advanced-scene-switcher.cpp b/lib/advanced-scene-switcher.cpp index ac810e08..2d7a2460 100644 --- a/lib/advanced-scene-switcher.cpp +++ b/lib/advanced-scene-switcher.cpp @@ -1,4 +1,5 @@ #include "advanced-scene-switcher.hpp" +#include "backup.hpp" #include "curl-helper.hpp" #include "log-helper.hpp" #include "macro-helpers.hpp" @@ -17,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -143,7 +143,6 @@ bool AdvSceneSwitcher::eventFilter(QObject *obj, QEvent *event) /****************************************************************************** * Saving and loading ******************************************************************************/ -static void AskForBackup(const QString &json); static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) { @@ -192,34 +191,6 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) } } -static void AskForBackup(const QString &json) -{ - const bool backupWasConfirmed = DisplayMessage( - obs_module_text("AdvSceneSwitcher.askBackup"), true, false); - - if (!backupWasConfirmed) { - return; - } - - QString path = QFileDialog::getSaveFileName( - nullptr, - obs_module_text( - "AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle"), - GetDefaultSettingsSaveLocation(), - obs_module_text( - "AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType")); - if (path.isEmpty()) { - return; - } - - QFile file(path); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - return; - } - auto out = QTextStream(&file); - out << json; -} - /****************************************************************************** * Main switcher thread ******************************************************************************/ @@ -635,6 +606,8 @@ static void handleShutdown() // TODO: Look for a way to possibly resolve this obs_frontend_save(); } + + BackupSettingsOfCurrentVersion(); } static void handleSceneCollectionChanging() diff --git a/lib/utils/backup.cpp b/lib/utils/backup.cpp new file mode 100644 index 00000000..38bf2fd3 --- /dev/null +++ b/lib/utils/backup.cpp @@ -0,0 +1,86 @@ +#include "backup.hpp" +#include "log-helper.hpp" +#include "obs-module-helper.hpp" +#include "path-helpers.hpp" +#include "plugin-state-helpers.hpp" +#include "ui-helpers.hpp" +#include "version.h" + +#include +#include +#include +#include +#include + +namespace advss { + +void AskForBackup(const QString &json) +{ + const bool backupWasConfirmed = DisplayMessage( + obs_module_text("AdvSceneSwitcher.askBackup"), true, false); + + if (!backupWasConfirmed) { + return; + } + + QString path = QFileDialog::getSaveFileName( + nullptr, + obs_module_text( + "AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle"), + GetDefaultSettingsSaveLocation(), + obs_module_text( + "AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType")); + if (path.isEmpty()) { + return; + } + + QFile file(path); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + return; + } + auto out = QTextStream(&file); + out << json; +} + +void BackupSettingsOfCurrentVersion() +{ + auto sceneCollectionName = obs_frontend_get_current_scene_collection(); + const std::string fileName = + std::string("settings-backup-") + + (sceneCollectionName ? sceneCollectionName : "-") + "-" + + g_GIT_TAG + ".json"; + bfree(sceneCollectionName); + auto settingsFile = obs_module_config_path(fileName.c_str()); + if (!settingsFile) { + return; + } + + QString dirPath = QFileInfo(settingsFile).absolutePath(); + QDir dir(dirPath); + if (!dir.exists()) { + if (!dir.mkpath(dirPath)) { + blog(LOG_WARNING, + "failed to create directory to save automated backup"); + bfree(settingsFile); + return; + } + } + + QFile file(settingsFile); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + bfree(settingsFile); + return; + } + + OBSDataAutoRelease data = obs_data_create(); + SavePluginSettings(data); + + auto settings = obs_data_get_json(data); + QString settingsString = QString(settings ? settings : ""); + + auto out = QTextStream(&file); + out << settingsString; + bfree(settingsFile); +} + +} // namespace advss diff --git a/lib/utils/backup.hpp b/lib/utils/backup.hpp new file mode 100644 index 00000000..e5448d39 --- /dev/null +++ b/lib/utils/backup.hpp @@ -0,0 +1,9 @@ +#pragma once +#include + +namespace advss { + +void AskForBackup(const QString &json); +void BackupSettingsOfCurrentVersion(); + +} // namespace advss diff --git a/lib/utils/plugin-state-helpers.cpp b/lib/utils/plugin-state-helpers.cpp index aa3d7592..a02e3fda 100644 --- a/lib/utils/plugin-state-helpers.cpp +++ b/lib/utils/plugin-state-helpers.cpp @@ -3,6 +3,11 @@ namespace advss { +void SavePluginSettings(obs_data_t *obj) +{ + GetSwitcher()->SaveSettings(obj); +} + void LoadPluginSettings(obs_data_t *obj) { GetSwitcher()->LoadSettings(obj); diff --git a/lib/utils/plugin-state-helpers.hpp b/lib/utils/plugin-state-helpers.hpp index 691ab43f..05116534 100644 --- a/lib/utils/plugin-state-helpers.hpp +++ b/lib/utils/plugin-state-helpers.hpp @@ -5,6 +5,7 @@ namespace advss { +void SavePluginSettings(obs_data_t *); EXPORT void LoadPluginSettings(obs_data_t *); EXPORT void AddSaveStep(std::function);