diff options
| author | Trial97 <alexandru.tripon97@gmail.com> | 2023-06-15 10:36:05 +0300 | 
|---|---|---|
| committer | Trial97 <alexandru.tripon97@gmail.com> | 2023-06-15 10:36:05 +0300 | 
| commit | 1ff8136f98cf3bb2983043fcaaf3e65366b4e6d4 (patch) | |
| tree | c62f2832c80c185af47498273596eeeecd79cd15 /launcher/settings | |
| parent | d33de2e4277dfcd090a36c96e09148ea6a5d2e55 (diff) | |
| parent | 9908e115aa6bdfcceefd1425406d1b6d1c1bdec4 (diff) | |
| download | PrismLauncher-1ff8136f98cf3bb2983043fcaaf3e65366b4e6d4.tar.gz PrismLauncher-1ff8136f98cf3bb2983043fcaaf3e65366b4e6d4.tar.bz2 PrismLauncher-1ff8136f98cf3bb2983043fcaaf3e65366b4e6d4.zip | |
Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into scale_cat
Diffstat (limited to 'launcher/settings')
| -rw-r--r-- | launcher/settings/INIFile.cpp | 85 | 
1 files changed, 77 insertions, 8 deletions
| diff --git a/launcher/settings/INIFile.cpp b/launcher/settings/INIFile.cpp index f0347cab..cb909ae7 100644 --- a/launcher/settings/INIFile.cpp +++ b/launcher/settings/INIFile.cpp @@ -45,12 +45,12 @@  #include <QSettings> -INIFile::INIFile() -{ -} +INIFile::INIFile() {}  bool INIFile::saveFile(QString fileName)  { +    if (!contains("ConfigVersion")) +        insert("ConfigVersion", "1.1");      QSettings _settings_obj{ fileName, QSettings::Format::IniFormat };      _settings_obj.setFallbacksEnabled(false); @@ -71,6 +71,67 @@ bool INIFile::saveFile(QString fileName)      return true;  } +QString unescape(QString orig) +{ +    QString out; +    QChar prev = QChar::Null; +    for (auto c : orig) { +        if (prev == '\\') { +            if (c == 'n') +                out += '\n'; +            else if (c == 't') +                out += '\t'; +            else if (c == '#') +                out += '#'; +            else +                out += c; +            prev = QChar::Null; +        } else { +            if (c == '\\') { +                prev = c; +                continue; +            } +            out += c; +            prev = QChar::Null; +        } +    } +    return out; +} +bool parseOldFileFormat(QIODevice& device, QSettings::SettingsMap& map) +{ +    QTextStream in(device.readAll()); +#if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0) +    in.setCodec("UTF-8"); +#endif + +    QStringList lines = in.readAll().split('\n'); +    for (int i = 0; i < lines.count(); i++) { +        QString& lineRaw = lines[i]; +        // Ignore comments. +        int commentIndex = 0; +        QString line = lineRaw; +        // Search for comments until no more escaped # are available +        while ((commentIndex = line.indexOf('#', commentIndex + 1)) != -1) { +            if (commentIndex > 0 && line.at(commentIndex - 1) == '\\') { +                continue; +            } +            line = line.left(lineRaw.indexOf('#')).trimmed(); +        } + +        int eqPos = line.indexOf('='); +        if (eqPos == -1) +            continue; +        QString key = line.left(eqPos).trimmed(); +        QString valueStr = line.right(line.length() - eqPos - 1).trimmed(); + +        valueStr = unescape(valueStr); + +        QVariant value(valueStr); +        map.insert(key, value); +    } + +    return true; +}  bool INIFile::loadFile(QString fileName)  { @@ -84,10 +145,19 @@ bool INIFile::loadFile(QString fileName)              qCritical() << "A format error occurred (e.g. loading a malformed INI file).";          return false;      } - -    for (auto&& key : _settings_obj.allKeys()) -        insert(key, _settings_obj.value(key)); -  +    if (!_settings_obj.value("ConfigVersion").isValid()) { +        QFile file(fileName); +        if (!file.open(QIODevice::ReadOnly)) +            return false; +        QSettings::SettingsMap map; +        parseOldFileFormat(file, map); +        file.close(); +        for (auto&& key : map.keys()) +            insert(key, map.value(key)); +        insert("ConfigVersion", "1.1"); +    } else +        for (auto&& key : _settings_obj.allKeys()) +            insert(key, _settings_obj.value(key));      return true;  } @@ -103,4 +173,3 @@ void INIFile::set(QString key, QVariant val)  {      this->operator[](key) = val;  } - | 
