1 |
#include "packagepage2.h" |
2 |
#include "ui_packagepage2.h" |
3 |
|
4 |
const QString PackagePage2::ZipCacheFile = "jsoncache.zip"; |
5 |
const QString PackagePage2::PackagesCacheUrl = "http://mods.oni2.net/jsoncache/"+ZipCacheFile; |
6 |
const QString PackagePage2::CacheFile = "nodes.json"; |
7 |
|
8 |
PackagePage2::PackagePage2(QWidget *parent) : |
9 |
QWizardPage(parent), |
10 |
ui(new Ui::PackagePage2) |
11 |
{ |
12 |
ui->setupUi(this); |
13 |
|
14 |
this->setTitle("Mandatory Fields"); |
15 |
|
16 |
//Register fields to be accessible in another pages //Not using mandatory field, it would require empty verification too... |
17 |
registerField("leModName", ui->leModName); |
18 |
registerField("leAuthors", ui->leAuthors); |
19 |
registerField("leVersion", ui->leVersion); |
20 |
registerField("ptDescription", ui->ptDescription,"plainText"); |
21 |
registerField("lePackageNumber", ui->lePackageNumber); |
22 |
registerField("rbReplace", ui->rbReplace); |
23 |
|
24 |
ui->lbFieldsReadOnly->setText("<html><span style='color:#0000ff;'>* Fields read only by AEI2 when the package " |
25 |
"isn't at the mod depot.</span></html>"); // Don't use rich text in qtdesigner because it generates platform dependent code |
26 |
QString htmlAsterisk="<html><span style='color:#0000ff;'>*</span></html>"; |
27 |
ui->lbAsteriscAuthors->setText(htmlAsterisk); |
28 |
ui->lbAsteriscModName->setText(htmlAsterisk); |
29 |
ui->lbAsteriscVersion->setText(htmlAsterisk); |
30 |
ui->lbAsteriscDescription->setText(htmlAsterisk); |
31 |
} |
32 |
|
33 |
bool PackagePage2::validatePage(){ |
34 |
QString modName=ui->leModName->text(); |
35 |
QString authors=ui->leAuthors->text(); |
36 |
QString version=ui->leVersion->text(); |
37 |
QString description=ui->ptDescription->toPlainText(); |
38 |
QString number=ui->lePackageNumber->text(); |
39 |
|
40 |
bool emptyContent=Util::Validation::checkEmptySpaces(QStringList()<<modName<<authors<<version<<description<<number); |
41 |
|
42 |
|
43 |
if(emptyContent){ |
44 |
Util::Dialogs::showError("You need to fill all fields first!"); |
45 |
return false; |
46 |
} |
47 |
|
48 |
if(number.size()!=5){ |
49 |
Util::Dialogs::showError("Invalid number format. It should contain 5 numbers."); |
50 |
return false; |
51 |
} |
52 |
|
53 |
if(!Util::Validation::isStringInteger(number)){ |
54 |
Util::Dialogs::showError("Number is not numeric."); |
55 |
return false; |
56 |
} |
57 |
|
58 |
return true; |
59 |
} |
60 |
|
61 |
PackagePage2::~PackagePage2() |
62 |
{ |
63 |
delete ui; |
64 |
} |
65 |
|
66 |
void PackagePage2::on_pbCheck_clicked() |
67 |
{ |
68 |
QString number = ui->lePackageNumber->text(); |
69 |
|
70 |
if(Util::Validation::checkEmptySpaces(QStringList(number))){ |
71 |
Util::Dialogs::showError("Number is empty. Please fill it first."); |
72 |
return; |
73 |
} |
74 |
|
75 |
if(number.size()!=5){ |
76 |
Util::Dialogs::showError("Invalid number format. It should contain 5 numeric characters."); |
77 |
return; |
78 |
} |
79 |
|
80 |
if(Util::Validation::isStringInteger(number)){ |
81 |
|
82 |
bool necessaryToRedownload=false; |
83 |
|
84 |
QFile file(GlobalVars::VagoTemporaryDir+"/"+this->ZipCacheFile); |
85 |
|
86 |
if(!file.exists()){ |
87 |
necessaryToRedownload=true; //File doesn't exist yet, necessary to download |
88 |
} |
89 |
else if (QDateTime::currentDateTime().toTime_t()-QFileInfo(file).lastModified().toTime_t() > 150){ //checks between 2 minutes (give more 30 seconds due to zip extraction) |
90 |
necessaryToRedownload=true; //File already exists but already expired (+2 mins without update) |
91 |
} |
92 |
|
93 |
if(necessaryToRedownload){ |
94 |
//let's start the search in the web, so we make sure it doesn't exists yet |
95 |
QNetworkAccessManager *manager = new QNetworkAccessManager(this); |
96 |
connect(manager, SIGNAL(finished(QNetworkReply*)), |
97 |
this, SLOT(downloadPackagesCache(QNetworkReply*))); |
98 |
|
99 |
//This timestamp is to guarantee that the cache received is fresh even through proxys |
100 |
QDateTime currTime = QDateTime::currentDateTime(); |
101 |
QString t_time = QString::number(currTime.toTime_t()); |
102 |
|
103 |
manager->get(QNetworkRequest(QUrl(this->PackagesCacheUrl+"?ts="+t_time))); |
104 |
} |
105 |
else{ //Not needed to download! :) Let's use our local cache. |
106 |
checkForPackagesInCache(); |
107 |
} |
108 |
} |
109 |
else{ |
110 |
Util::Dialogs::showError("Number is not numeric."); |
111 |
} |
112 |
} |
113 |
|
114 |
void PackagePage2::downloadPackagesCache(QNetworkReply *result){ |
115 |
|
116 |
if(result->error()==QNetworkReply::NoError){ |
117 |
|
118 |
QFile file(GlobalVars::VagoTemporaryDir+"/"+this->ZipCacheFile); |
119 |
|
120 |
// Create temp folder if it doesn't exist |
121 |
if(!QDir(GlobalVars::VagoTemporaryDir).exists()){ |
122 |
QDir().mkdir(GlobalVars::VagoTemporaryDir); |
123 |
} |
124 |
|
125 |
if(!file.open(QIODevice::WriteOnly)){ |
126 |
UtilVago::showAndLogErrorPopUp("Error fetching package data: creating cache file."); |
127 |
return; |
128 |
} |
129 |
file.write(result->readAll()); |
130 |
file.close(); |
131 |
|
132 |
//Let's extract the cache data |
133 |
if(JlCompress::extractFile(GlobalVars::VagoTemporaryDir+"/"+this->ZipCacheFile, "/"+this->CacheFile ,GlobalVars::VagoTemporaryDir+"/"+this->CacheFile).isEmpty()){ |
134 |
UtilVago::showAndLogErrorPopUp("An error occurred while unzipping the package data."); |
135 |
} |
136 |
|
137 |
checkForPackagesInCache(); |
138 |
|
139 |
} |
140 |
else{ |
141 |
UtilVago::showAndLogErrorPopUpLogButton("An error occurred checking number availability:\n\n"+result->errorString()); |
142 |
} |
143 |
|
144 |
result->deleteLater(); |
145 |
} |
146 |
|
147 |
void PackagePage2::checkForPackagesInCache(){ |
148 |
QString packageNumber=ui->lePackageNumber->text(); |
149 |
|
150 |
QFile file(GlobalVars::VagoTemporaryDir+"/"+this->CacheFile); //let's read the chache unzipped |
151 |
if(!file.open(QIODevice::ReadOnly)){ |
152 |
UtilVago::showAndLogErrorPopUp("Error reading downloaded package cache data."); |
153 |
return; |
154 |
} |
155 |
//Read file cache to ram |
156 |
QString data=file.readAll(); |
157 |
|
158 |
|
159 |
//Let's play with json engine |
160 |
QScriptEngine engine; |
161 |
QScriptValue sc = engine.evaluate("(" + data + ")"); |
162 |
|
163 |
QScriptValue currNumber; |
164 |
QString existingModName,existingModUrl; |
165 |
|
166 |
QScriptValueIterator it(sc); |
167 |
|
168 |
while (it.hasNext()) { |
169 |
it.next(); |
170 |
currNumber=it.value().toObject().property("field_package_number").toObject().property("und").toObject().property("0").toObject().property("value"); |
171 |
if(currNumber.isValid() && currNumber.toString() == packageNumber){ |
172 |
existingModName = it.value().toObject().property("title").toString(); |
173 |
existingModUrl = it.value().toObject().property("path").toString(); |
174 |
break; |
175 |
} |
176 |
} |
177 |
|
178 |
if(!existingModName.isEmpty()){ |
179 |
Util::Dialogs::showRichError("Package "+packageNumber+" is already being used by the following mod:<br/><br/>"+ |
180 |
existingModName+"<br/><br/>"+ |
181 |
"More information <a href='"+existingModUrl+"'>here</a>."); |
182 |
} |
183 |
else{ |
184 |
Util::Dialogs::showInfo("It seems that the package number " + packageNumber + " is not being used yet! :)"); |
185 |
} |
186 |
} |
187 |
|
188 |
void PackagePage2::on_cbType_currentIndexChanged(int index) |
189 |
{ |
190 |
ui->lePackageNumber->setText(QString().setNum(index+1)+"XXXX"); |
191 |
} |