bool ChangeLog::checkChanges(const QString &previousVersion, const QString ¤tVersion) { QVersionNumber previous = QVersionNumber::fromString(previousVersion); QVersionNumber current = QVersionNumber::fromString(currentVersion); if (current <= previous) { qCInfo(CHANGELOG_CATEGORY) << "Current version isn't newer, than previous" << previousVersion << currentVersion; return false; } QFileSelector fileSelector; fileSelector.setExtraSelectors(QStringList() << QLocale::system().uiLanguages().constFirst().split('-').constFirst()); const QString path = fileSelector.select(":/changelogs/changelog.json"); QFile file(path); if (!file.open(QIODevice::ReadOnly)) { qCCritical(CHANGELOG_CATEGORY) << "Fail to open changelog file" << path << file.errorString(); return false; } QByteArray data = file.readAll(); QJsonParseError parseError; QJsonDocument document = QJsonDocument::fromJson(data, &parseError); if (parseError.error != QJsonParseError::NoError) { qCritical(CHANGELOG_CATEGORY) << "Fail to parse changelog data JSON:" << data << "error at offset" << parseError.offset << parseError.errorString() << parseError.error; return false; } QVariantList content = document.array().toVariantList(); while (!content.isEmpty()) { if (QVersionNumber::fromString(content.constFirst().toMap().value("version").toString()) > current) { content.takeFirst(); } else { break; } } QVariantList result; while (!content.isEmpty()) { if (QVersionNumber::fromString(content.constFirst().toMap().value("version").toString()) > previous) { result.append(content.takeFirst()); } else { break; } } if (result.isEmpty()) { qCWarning(CHANGELOG_CATEGORY) << "Empty changelog" << previousVersion << currentVersion; return false; } emit changesAvailable(result); return true; }