Index: src/MainWindow.hxx =================================================================== --- src/MainWindow.hxx (revision 14303) +++ src/MainWindow.hxx (working copy) @@ -45,6 +45,8 @@ #define DATA_EXAMPLES_PATH "example-data" #endif +#include + class PlaybackIndicator : public QLabel { Q_OBJECT @@ -214,8 +216,85 @@ on_action_Save_triggered(); return _canvas->isChanged()? abort : goOn;; } + + void versionTokenizer(std::vector& numbers, std::string version) + { + int firstDot = version.find("."); + numbers.push_back( atoi(version.substr(0, firstDot).c_str()) ); + + int secondDot = version.find(".", firstDot + 1); + numbers.push_back( atoi(version.substr(firstDot + 1, secondDot - firstDot - 1).c_str()) ); + + int lastDot = version.find(".", secondDot + 1); + numbers.push_back( atoi(version.substr(secondDot + 1, lastDot - secondDot - 1).c_str()) ); + } + void load(const QString & filename) { + QXmlQuery query; + QFile file(filename); + if( !file.exists() ) + { + QMessageBox::critical(this, tr("Error loading the network"), + tr("

The file you selected doesn't exist.

")); + return; + } + std::string currentVersion = CLAM::GetVersion(); + + file.open(QIODevice::ReadOnly); + query.bindVariable("document", &file); + query.setQuery("doc($document)/network/@clamVersion/string()"); + + QString readClamVersion; + query.evaluateTo(&readClamVersion); + readClamVersion = readClamVersion.trimmed(); + + std::vector numbersCurrentVersion; + versionTokenizer(numbersCurrentVersion, currentVersion); + + std::vector numbersFileVersion; + versionTokenizer(numbersFileVersion, qPrintable(readClamVersion) ); + + bool outdated = false; + for(unsigned int i = 0; i < numbersFileVersion.size(); i++) + { + if( numbersCurrentVersion[i] > numbersFileVersion[i] ) + { + outdated = true; + break; + } + if( numbersCurrentVersion[i] < numbersFileVersion[i] ) + { + QMessageBox::warning(this, tr("NetworkEditor update."), + tr("This network was created with a newer version of NetworkEditor.\n" + "Maybe you should update."), + QMessageBox::Ok, QMessageBox::Ok); + loadVersionChecked(filename); + return; + } + } + if( !outdated ) + { + loadVersionChecked(filename); + return; + } + int option = QMessageBox::warning(this, tr("This file was created with an old version of NetworkEditor."), + tr("Do you want to convert to current version?\n" + "NetworkEditor won't open the file if you don't convert it"), + QMessageBox::No | QMessageBox::Yes, QMessageBox::Yes); + switch (option) + { + case QMessageBox::Yes: + std::cout << "Converting to " << currentVersion << "..." << std::endl; + // Call the python script and convert to current + loadVersionChecked(filename); + return; + case QMessageBox::No: + return; // We don't allow the network to be loaded + } + } + void loadVersionChecked(const QString & filename) + { _network.ResetConnectionReport(); std::string localFilename = filename.toLocal8Bit().constData(); Index: SConstruct =================================================================== --- SConstruct (revision 14303) +++ SConstruct (working copy) @@ -79,6 +79,7 @@ 'QtUiTools', 'QtDesigner', 'QtWebKit', + 'QtXmlPatterns', ], debug=False, crosscompiling=crosscompiling,