#include "packagepage2.h" #include "ui_packagepage2.h" const QString PackagePage2::ZipCacheFile = "jsoncache.zip"; const QString PackagePage2::PackagesCacheUrl = "http://mods.oni2.net/jsoncache/"+ZipCacheFile; const QString PackagePage2::CacheFile = "nodes.json"; PackagePage2::PackagePage2(QWidget *parent) : QWizardPage(parent), ui(new Ui::PackagePage2) { ui->setupUi(this); this->setTitle("Mandatory Fields"); //Register fields to be accessible in another pages //Not using mandatory field, it would require empty verification too... registerField("leModName", ui->leModName); registerField("leAuthors", ui->leAuthors); registerField("leVersion", ui->leVersion); registerField("ptDescription", ui->ptDescription,"plainText"); registerField("lePackageNumber", ui->lePackageNumber); registerField("rbReplace", ui->rbReplace); ui->lbFieldsReadOnly->setText("* Fields read only by AEI2 when the package " "isn't at the mod depot."); // Don't use rich text in qtdesigner because it generates platform dependent code QString htmlAsterisk="*"; ui->lbAsteriscAuthors->setText(htmlAsterisk); ui->lbAsteriscModName->setText(htmlAsterisk); ui->lbAsteriscVersion->setText(htmlAsterisk); ui->lbAsteriscDescription->setText(htmlAsterisk); } bool PackagePage2::validatePage(){ QString modName=ui->leModName->text(); QString authors=ui->leAuthors->text(); QString version=ui->leVersion->text(); QString description=ui->ptDescription->toPlainText(); QString number=ui->lePackageNumber->text(); bool emptyContent=Util::Validation::checkEmptySpaces(QStringList()<lePackageNumber->text(); if(Util::Validation::checkEmptySpaces(QStringList(number))){ Util::Dialogs::showError("Number is empty. Please fill it first."); return; } if(number.size()!=5){ Util::Dialogs::showError("Invalid number format. It should contain 5 numeric characters."); return; } if(Util::Validation::isStringInteger(number)){ bool necessaryToRedownload=false; QFile file(GlobalVars::VagoTemporaryDir+"/"+this->ZipCacheFile); if(!file.exists()){ necessaryToRedownload=true; //File doesn't exist yet, necessary to download } else if (QDateTime::currentDateTime().toTime_t()-QFileInfo(file).lastModified().toTime_t() > 150){ //checks between 2 minutes (give more 30 seconds due to zip extraction) necessaryToRedownload=true; //File already exists but already expired (+2 mins without update) } if(necessaryToRedownload){ //let's start the search in the web, so we make sure it doesn't exists yet QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(downloadPackagesCache(QNetworkReply*))); //This timestamp is to guarantee that the cache received is fresh even through proxys QDateTime currTime = QDateTime::currentDateTime(); QString t_time = QString::number(currTime.toTime_t()); manager->get(QNetworkRequest(QUrl(this->PackagesCacheUrl+"?ts="+t_time))); } else{ //Not needed to download! :) Let's use our local cache. checkForPackagesInCache(); } } else{ Util::Dialogs::showError("Number is not numeric."); } } void PackagePage2::downloadPackagesCache(QNetworkReply *result){ if(result->error()==QNetworkReply::NoError){ QFile file(GlobalVars::VagoTemporaryDir+"/"+this->ZipCacheFile); // Create temp folder if it doesn't exist if(!QDir(GlobalVars::VagoTemporaryDir).exists()){ QDir().mkdir(GlobalVars::VagoTemporaryDir); } if(!file.open(QIODevice::WriteOnly)){ UtilVago::showAndLogErrorPopUp("Error fetching package data: creating cache file."); return; } file.write(result->readAll()); file.close(); //Let's extract the cache data if(JlCompress::extractFile(GlobalVars::VagoTemporaryDir+"/"+this->ZipCacheFile, "/"+this->CacheFile ,GlobalVars::VagoTemporaryDir+"/"+this->CacheFile).isEmpty()){ UtilVago::showAndLogErrorPopUp("An error occurred while unzipping the package data."); } checkForPackagesInCache(); } else{ UtilVago::showAndLogErrorPopUpLogButton("An error occurred checking number availability:\n\n"+result->errorString()); } result->deleteLater(); } void PackagePage2::checkForPackagesInCache(){ QString packageNumber=ui->lePackageNumber->text(); QFile file(GlobalVars::VagoTemporaryDir+"/"+this->CacheFile); //let's read the chache unzipped if(!file.open(QIODevice::ReadOnly)){ UtilVago::showAndLogErrorPopUp("Error reading downloaded package cache data."); return; } //Read file cache to ram QString data=file.readAll(); //Let's play with json engine QScriptEngine engine; QScriptValue sc = engine.evaluate("(" + data + ")"); QScriptValue currNumber; QString existingModName,existingModUrl; QScriptValueIterator it(sc); while (it.hasNext()) { it.next(); currNumber=it.value().toObject().property("field_package_number").toObject().property("und").toObject().property("0").toObject().property("value"); if(currNumber.isValid() && currNumber.toString() == packageNumber){ existingModName = it.value().toObject().property("title").toString(); existingModUrl = it.value().toObject().property("path").toString(); break; } } if(!existingModName.isEmpty()){ Util::Dialogs::showRichError("Package "+packageNumber+" is already being used by the following mod:

"+ existingModName+"

"+ "More information here."); } else{ Util::Dialogs::showInfo("It seems that the package number " + packageNumber + " is not being used yet! :)"); } } void PackagePage2::on_cbType_currentIndexChanged(int index) { ui->lePackageNumber->setText(QString().setNum(index+1)+"XXXX"); }