Skip to content
Snippets Groups Projects
Commit 5c449c7e authored by SeeLook's avatar SeeLook :musical_note:
Browse files

Raise exam/level file version, compress XML level content

- due to new instrument support
- but compression gives almost 20 times file reduction
parent b6eaf8f0
No related branches found
No related tags found
No related merge requests found
Pipeline #3765 passed
......@@ -247,17 +247,27 @@ Tlevel TlevelSelector::getLevelFromFile(QFile &file) {
level.name.clear();;
if (file.open(QIODevice::ReadOnly)) {
QDataStream in(&file);
in.setVersion(QDataStream::Qt_5_2);
quint32 lv; // level version identifier
in >> lv;
bool wasLevelValid = true;
bool wasLevelFile = true;
auto levelVer = Tlevel::levelVersionNr(lv);
if (levelVer == 1 || levelVer == 2) { // *.nel with binary data
in.setVersion(QDataStream::Qt_4_7);
wasLevelValid = getLevelFromStream(in, level, lv);
} else if (levelVer > 2 && levelVer <= 4) { // *.nel in XML
} else if (levelVer > 2 && levelVer <= 5) { // *.nel in XML, from version 5 compressed
Tlevel::EerrorType er;
QXmlStreamReader xml(in.device());
QXmlStreamReader xml;
if (levelVer >= 5) { // compressed level
in.setVersion(QDataStream::Qt_5_9);
auto arrayXML = file.readAll();
arrayXML.remove(0, 4);
auto unZipXml = qUncompress(arrayXML);
xml.addData(unZipXml);
} else { // bare text (XML)
in.setVersion(QDataStream::Qt_5_2);
xml.setDevice(in.device());
}
if (!xml.readNextStartElement()) // open first XML node
er = Tlevel::e_noLevelInXml;
else
......@@ -278,25 +288,26 @@ Tlevel TlevelSelector::getLevelFromFile(QFile &file) {
return level;
}
file.close();
if (!wasLevelFile) {
auto m = QLatin1String("<br><font size=\"4\"><b>")
+ tr("File: %1 \n is not Nootka level file!").arg(file.fileName()).replace(QLatin1String("\n"), QLatin1String("<br>"))
+ QLatin1String("</b></font>");
emit warnMessage(m, Qt::red);
level.name.clear();
return level;
} else if (!wasLevelValid) {
auto m = QLatin1String("<br><font size=\"4\"><b>")
+ tr("Level file\n %1 \n was corrupted and repaired!\n Check please, if its parameters are as expected.").arg(file.fileName())
.replace(QLatin1String("\n"), QLatin1String("<br>")) + QLatin1String("</font>");
emit warnMessage(m, Qt::yellow);
}
if (wasLevelFile) {
if (level.clef.type() == Tclef::Bass_F_8down) {
qDebug() << "[TlevelSelector] OBSOLETE bass dropped clef detected. Converting level to ordinary bass clef.";
level.convFromDropedBass();
}
if (!wasLevelFile) {
auto m = QLatin1String("<br><font size=\"4\"><b>")
+ tr("File: %1 \n is not Nootka level file!").arg(file.fileName()).replace(QLatin1String("\n"), QLatin1String("<br>"))
+ QLatin1String("</b></font>");
emit warnMessage(m, Qt::red);
level.name.clear();
return level;
} else if (!wasLevelValid) {
auto m = QLatin1String("<br><font size=\"4\"><b>")
+ tr("Level file\n %1 \n was corrupted and repaired!\n Check please, if its parameters are as expected.").arg(file.fileName())
.replace(QLatin1String("\n"), QLatin1String("<br>")) + QLatin1String("</font>");
emit warnMessage(m, Qt::yellow);
}
if (wasLevelFile) {
if (level.clef.type() == Tclef::Bass_F_8down) {
qDebug() << "[TlevelSelector] OBSOLETE bass dropped clef detected. Converting level to ordinary bass clef.";
level.convFromDropedBass();
}
}
} else {
if (!file.fileName().isEmpty()) // skip empty file names (ignored by user)
......
......@@ -35,7 +35,9 @@
/*static*/
/** Versions history:
/**
* Versions history:
*
* 1. 0x95121702;
*
* 2. 0x95121704; (2012.07)
......@@ -49,11 +51,15 @@
*
* 5. 0x9512170A (05.02.2018)
* - new instruments, melodies in Music XML, new mistake types - it can not be compatible with older versions
*
* 6. 0x9512170C (09.06.2021)
* - ukulele support - opening with previous versions would cause problems
*
*/
const qint32 Texam::examVersion = 0x95121702;
const qint32 Texam::examVersion2 = 0x95121704;
const qint32 Texam::currentVersion = 0x9512170A; // version 5
const qint32 Texam::currentVersion = 0x9512170C; // version 5
const quint16 Texam::maxAnswerTime = 65500;
......@@ -236,7 +242,10 @@ Texam::EerrorType Texam::loadFromFile(const QString& fileName) {
bool isExamFileOk = true;
if (examVersionNr(ev) > 3) {
in.setVersion(QDataStream::Qt_5_2);
if (examVersionNr(ev) > 5)
in.setVersion(QDataStream::Qt_5_9);
else
in.setVersion(QDataStream::Qt_5_2);
QByteArray arrayXML = file.readAll();
arrayXML.remove(0, 4);
QByteArray unZipXml = qUncompress(arrayXML);
......@@ -416,7 +425,7 @@ Texam::EerrorType Texam::saveToFile(const QString& fileName) {
QFile file(m_fileName);
if (file.open(QIODevice::WriteOnly)) {
QDataStream out(&file);
out.setVersion(QDataStream::Qt_5_2);
out.setVersion(QDataStream::Qt_5_9);
out << currentVersion;
QByteArray arrayXML;
QXmlStreamWriter xml(&arrayXML);
......@@ -427,7 +436,6 @@ Texam::EerrorType Texam::saveToFile(const QString& fileName) {
xml.writeEndDocument();
out << qCompress(arrayXML);
// out << arrayXML;
file.close();
} else {
......
......@@ -31,7 +31,9 @@
/*static-------------------------------------------------------------------------------------------*/
/** Versions history:
/**
* Versions history:
*
* 1. 0x95121701
*
* 2. 0x95121703 (02.12.2013)
......@@ -41,10 +43,13 @@
* 3. 0x95121705 (22.06.2014) - XML stream - universal version
*
* 4. 0x95121707 (05.02.2018) - rhythms, new instruments, melodies in Music XML
*
* 5. 0x95121709 (09.06.2021) - compression and ukulele support
*
*/
const qint32 Tlevel::levelVersion = 0x95121701;
const qint32 Tlevel::currentVersion = 0x95121707;
const qint32 Tlevel::currentVersion = 0x95121709; // Version 5
int Tlevel::levelVersionNr(qint32 ver) {
......@@ -596,12 +601,14 @@ bool Tlevel::saveToFile(Tlevel& level, const QString& levelFile) {
QFile file(levelFile);
if (file.open(QIODevice::WriteOnly)) {
QDataStream out(&file);
out.setVersion(QDataStream::Qt_5_2);
out.setVersion(QDataStream::Qt_5_9);
out << currentVersion;
QXmlStreamWriter xml(&file);
QByteArray arrayXML;
QXmlStreamWriter xml(&arrayXML);
// QXmlStreamWriter xml(&file);
xml.setAutoFormatting(true);
xml.setAutoFormattingIndent(2);
// xml.setAutoFormatting(true);
// xml.setAutoFormattingIndent(2);
xml.writeStartDocument();
xml.writeComment(QStringLiteral("\nXML file of Nootka exam level.\n"
"https://nootka.sourceforge.io\n"
......@@ -610,6 +617,8 @@ bool Tlevel::saveToFile(Tlevel& level, const QString& levelFile) {
level.writeToXml(xml);
xml.writeEndDocument();
out << qCompress(arrayXML);
file.close();
return true;
} else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment