diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2018-01-03 14:00:44 +0100 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2018-01-03 14:35:56 +0100 | 
| commit | abf0bf769a8f1fb7bc3022aa69d519e261e1d595 (patch) | |
| tree | 5487392e621f6446fab2c45c90de857069d57d2e | |
| parent | cbaafb9a828f13abb55b99f8f2c4caa2337ef9e9 (diff) | |
gui/process-detector: change separator characters
Prevent common characters from breaking the saved list. Use unprintable
characters. Add migration.
| -rw-r--r-- | gui/process_detector.cpp | 15 | ||||
| -rw-r--r-- | migration/20180102_00-process-detector-separator.cpp | 48 | 
2 files changed, 60 insertions, 3 deletions
diff --git a/gui/process_detector.cpp b/gui/process_detector.cpp index b1ad541d..806f0b47 100644 --- a/gui/process_detector.cpp +++ b/gui/process_detector.cpp @@ -17,6 +17,9 @@  #include <QPushButton>  #include <QSettings> +static constexpr inline auto RECORD_SEPARATOR = QChar(char(0x1e));  // RS ^] +static constexpr inline auto UNIT_SEPARATOR = QChar(char(0x1f));    // US ^_ +  void settings::set_game_list(const QString &game_list)  {      group::with_global_settings_object([&](QSettings& settings) { @@ -49,12 +52,18 @@ QHash<QString, QString> settings::split_process_names()  {      QHash<QString, QString> ret;      QString str = get_game_list(); -    QStringList pairs = str.split('|'); +    QStringList pairs = str.split(RECORD_SEPARATOR, QString::SkipEmptyParts);      for (auto pair : pairs)      { -        QList<QString> tmp = pair.split(':'); +        QList<QString> tmp = pair.split(UNIT_SEPARATOR);          if (tmp.count() != 2)              continue; +        if (tmp[0].contains(UNIT_SEPARATOR) || tmp[0].contains(RECORD_SEPARATOR)) +            continue; +        if (tmp[1].contains(UNIT_SEPARATOR) || tmp[1].contains(RECORD_SEPARATOR)) +            continue; +        if (tmp[0] == QLatin1String("") || tmp[1] == QLatin1String("")) +            continue;          ret[tmp[0]] = tmp[1];      }      return ret; @@ -136,7 +145,7 @@ void process_detector::save()      {          auto exe = ui.tableWidget->item(i, 0)->text();          auto profile = reinterpret_cast<QComboBox*>(ui.tableWidget->cellWidget(i, 1))->currentText(); -        str += "|" + exe + ":" + profile; +        str += RECORD_SEPARATOR + exe + UNIT_SEPARATOR + profile;      }      s.set_game_list(str); diff --git a/migration/20180102_00-process-detector-separator.cpp b/migration/20180102_00-process-detector-separator.cpp new file mode 100644 index 00000000..c1864adf --- /dev/null +++ b/migration/20180102_00-process-detector-separator.cpp @@ -0,0 +1,48 @@ +#include "migration.hpp" +#include "options/options.hpp" + +using namespace options; +using namespace migrations; + +static constexpr auto OLD_RECORD_SEPARATOR  = QChar('|'); +static constexpr auto OLD_UNIT_SEPARATOR    = QChar(':'); + +static constexpr auto NEW_RECORD_SEPARATOR  = QChar(0x1e); +static constexpr auto NEW_UNIT_SEPARATOR    = QChar(0x1f); + +static constexpr QLatin1String KEY_NAME = "executable-list"_qstr; + +struct process_detector_record_separator : migration +{ +    QString unique_date() const override +    { +        return "20180102_00"; +    } + +    QString name() const override +    { +        return "process detector record separator"; +    } + +    bool should_run() const override +    { +        return group::with_global_settings_object([](const QSettings& s) +        { +            const QString old_value = s.value(KEY_NAME).toString(); +            return old_value.contains(OLD_RECORD_SEPARATOR); +        }); +    } + +    void run() override +    { +        return group::with_global_settings_object([](QSettings& s) +        { +            QString value = s.value(KEY_NAME).toString(); +            value.replace(OLD_UNIT_SEPARATOR,   NEW_UNIT_SEPARATOR); +            value.replace(OLD_RECORD_SEPARATOR, NEW_RECORD_SEPARATOR); +            s.setValue(KEY_NAME, value); +        }); +    } +}; + +OPENTRACK_MIGRATION(process_detector_record_separator);  | 
