serializer: ensure backwards compatibility

This commit is contained in:
itsmattkc
2023-02-26 15:42:54 -08:00
parent 46d15396a6
commit 7ec8a4dd7e
31 changed files with 777 additions and 417 deletions
+31 -51
View File
@@ -58,7 +58,7 @@ void ProjectSerializer::Destroy()
instances_.clear();
}
ProjectSerializer::Result ProjectSerializer::Load(Project *project, const QString &filename, const QString &type)
ProjectSerializer::Result ProjectSerializer::Load(Project *project, const QString &filename, LoadType load_type)
{
QFile project_file(filename);
@@ -76,7 +76,7 @@ ProjectSerializer::Result ProjectSerializer::Load(Project *project, const QStrin
reader.reset(new QXmlStreamReader(&project_file));
}
Result inner_result = Load(project, reader.get(), type);
Result inner_result = Load(project, reader.get(), load_type);
project_file.close();
@@ -89,14 +89,14 @@ ProjectSerializer::Result ProjectSerializer::Load(Project *project, const QStrin
r.SetDetails(reader->errorString());
return r;
} else {
return kSuccess;
return inner_result;
}
} else {
return kFileError;
}
}
ProjectSerializer::Result ProjectSerializer::Load(Project *project, QXmlStreamReader *reader, const QString &type)
ProjectSerializer::Result ProjectSerializer::Load(Project *project, QXmlStreamReader *reader, LoadType load_type)
{
// Determine project version
uint version = 0;
@@ -106,24 +106,26 @@ ProjectSerializer::Result ProjectSerializer::Load(Project *project, QXmlStreamRe
if (reader->name() == QStringLiteral("olive")
|| reader->name() == QStringLiteral("project")) { // 0.1 projects only
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("version")) {
version = reader->readElementText().toUInt();
} else if (reader->name() == QStringLiteral("url")) {
project->SetSavedURL(reader->readElementText());
// HACK for 0.1 projects
if (version == 190219) {
res = LoadWithSerializerVersion(version, project, reader);
}
} else if (reader->name() == type) {
// Found our data
res = LoadWithSerializerVersion(version, project, reader);
} else {
reader->skipCurrentElement();
XMLAttributeLoop(reader, attr) {
if (attr.name() == QStringLiteral("version")) { // 230220+ projects
version = attr.value().toUInt();
}
}
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("version")) { // projects <= 220403
version = reader->readElementText().toUInt();
} else if (reader->name() == QStringLiteral("url")) {
if (project) {
project->SetSavedURL(reader->readElementText());
} else {
reader->skipCurrentElement();
}
} else {
// Handle any other value with the serializer
res = LoadWithSerializerVersion(version, project, reader, load_type);
}
}
} else {
reader->skipCurrentElement();
}
@@ -132,7 +134,7 @@ ProjectSerializer::Result ProjectSerializer::Load(Project *project, QXmlStreamRe
return res;
}
ProjectSerializer::Result ProjectSerializer::Paste(const QString &type)
ProjectSerializer::Result ProjectSerializer::Paste(LoadType load_type)
{
QString clipboard = Core::PasteStringFromClipboard();
if (clipboard.isEmpty()) {
@@ -141,28 +143,10 @@ ProjectSerializer::Result ProjectSerializer::Paste(const QString &type)
QXmlStreamReader reader(clipboard);
Project temp;
ProjectSerializer::Result res = ProjectSerializer::Load(&temp, &reader, type);
if (res.code() != ProjectSerializer::kSuccess) {
return res;
}
QVector<Node*> pasted_nodes;
foreach (Node *n, temp.nodes()) {
if (!temp.default_nodes().contains(n)) {
// Move nodes out of Project
n->setParent(nullptr);
pasted_nodes.append(n);
}
}
res.SetLoadedNodes(pasted_nodes);
return res;
return ProjectSerializer::Load(nullptr, &reader, load_type);
}
ProjectSerializer::Result ProjectSerializer::Save(const SaveData &data, const QString &type, bool compress)
ProjectSerializer::Result ProjectSerializer::Save(const SaveData &data, bool compress)
{
QString temp_save = FileFunctions::GetSafeTemporaryFilename(data.GetFilename());
@@ -172,7 +156,7 @@ ProjectSerializer::Result ProjectSerializer::Save(const SaveData &data, const QS
QByteArray b;
QXmlStreamWriter writer(&b);
Result inner_result = Save(&writer, data, type);
Result inner_result = Save(&writer, data);
if (writer.hasError()) {
Result r(kXmlError);
@@ -207,7 +191,7 @@ ProjectSerializer::Result ProjectSerializer::Save(const SaveData &data, const QS
}
}
ProjectSerializer::Result ProjectSerializer::Save(QXmlStreamWriter *writer, const SaveData &data, const QString &type)
ProjectSerializer::Result ProjectSerializer::Save(QXmlStreamWriter *writer, const SaveData &data)
{
writer->setAutoFormatting(true);
@@ -221,18 +205,14 @@ ProjectSerializer::Result ProjectSerializer::Save(QXmlStreamWriter *writer, cons
// Version is stored in YYMMDD from whenever the project format was last changed
// Allows easy integer math for checking project versions.
writer->writeTextElement(QStringLiteral("version"), QString::number(serializer->Version()));
writer->writeAttribute(QStringLiteral("version"), QString::number(serializer->Version()));
if (!data.GetFilename().isEmpty()) {
writer->writeTextElement("url", data.GetFilename());
}
writer->writeStartElement(type);
serializer->Save(writer, data, nullptr);
writer->writeEndElement(); // [type]
writer->writeEndElement(); // olive
writer->writeEndDocument();
@@ -244,12 +224,12 @@ ProjectSerializer::Result ProjectSerializer::Save(QXmlStreamWriter *writer, cons
return kSuccess;
}
ProjectSerializer::Result ProjectSerializer::Copy(const SaveData &data, const QString &type)
ProjectSerializer::Result ProjectSerializer::Copy(const SaveData &data)
{
QString copy_str;
QXmlStreamWriter writer(&copy_str);
ProjectSerializer::Result res = ProjectSerializer::Save(&writer, data, type);
ProjectSerializer::Result res = ProjectSerializer::Save(&writer, data);
if (res == kSuccess) {
Core::CopyStringToClipboard(copy_str);
@@ -269,7 +249,7 @@ bool ProjectSerializer::IsCancelled() const
return false;
}
ProjectSerializer::Result ProjectSerializer::LoadWithSerializerVersion(uint version, Project *project, QXmlStreamReader *reader)
ProjectSerializer::Result ProjectSerializer::LoadWithSerializerVersion(uint version, Project *project, QXmlStreamReader *reader, LoadType load_type)
{
// Failed to find version in file
if (version == 0) {
@@ -291,7 +271,7 @@ ProjectSerializer::Result ProjectSerializer::LoadWithSerializerVersion(uint vers
}
if (serializer) {
LoadData ld = serializer->Load(project, reader, nullptr);
LoadData ld = serializer->Load(project, reader, load_type, nullptr);
Result r(kSuccess);
if (reader->hasError()) {
r = Result(kXmlError);