@@ -45,9 +45,8 @@ SOFTWARE.*/
45
45
#include < iostream>
46
46
47
47
CUpdateWidget::CUpdateWidget (QWidget* parent)
48
- : QWidget(parent), restclient(new QNetworkAccessManager), currentIndex(0 ), overallSize(0 ), downloadedSize(0 ),
49
- devChannel(false ), updaterUpdateCheck(false ), doingUpdaterUpdate(false ), urlBase(URL_BASE), updaterBase(UPDATER_BASE),
50
- m_askSDK(false ), m_getSDK(nullptr )
48
+ : QWidget(parent), restclient(new QNetworkAccessManager), overallSize(0 ), devChannel(false ), devAlreadyParsed(false ),
49
+ updaterUpdateCheck(false ), doingUpdaterUpdate(false ), m_askSDK(false ), m_getSDK(nullptr )
51
50
{
52
51
setSizePolicy (QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
53
52
layout = new QVBoxLayout;
@@ -75,22 +74,16 @@ void CUpdateWidget::sslErrorHandler(QNetworkReply *reply, const QList<QSslError>
75
74
76
75
void CUpdateWidget::connFinished (QNetworkReply *r)
77
76
{
78
- if (r->request ().url ().path () == urlBase + " .xml" )
77
+ if (r->request ().url ().path () == QString (UPDATER_BASE) + " .xml" )
79
78
{
80
- checkForAppUpdateResponse (r);
79
+ checkForUpdaterUpdateResponse (r);
81
80
}
82
- else if (r-> request (). url (). path () == updaterBase + " .xml " )
81
+ else
83
82
{
84
- checkForUpdaterUpdateResponse (r);
83
+ checkForAppUpdateResponse (r);
85
84
}
86
85
}
87
86
88
- bool CUpdateWidget::NetworkAccessibleCheck ()
89
- {
90
- // return restclient->networkAccessible() == QNetworkAccessManager::Accessible;
91
- return true ;
92
- }
93
-
94
87
void CUpdateWidget::checkForUpdate (bool dev, bool checkSDK, bool upCheck)
95
88
{
96
89
updaterUpdateCheck = upCheck;
@@ -109,7 +102,9 @@ void CUpdateWidget::checkForUpdate(bool dev, bool checkSDK, bool upCheck)
109
102
110
103
void CUpdateWidget::checkForAppUpdate ()
111
104
{
112
- if (devChannel)
105
+ QString urlBase;
106
+
107
+ if (devChannel && !devAlreadyParsed)
113
108
{
114
109
urlBase = DEV_BASE;
115
110
}
@@ -131,10 +126,7 @@ void CUpdateWidget::checkForAppUpdate()
131
126
132
127
request.setRawHeader (QByteArray (" UUID" ), UUID.toUtf8 ());
133
128
134
- if (NetworkAccessibleCheck ())
135
- {
136
- restclient->get (request);
137
- }
129
+ restclient->get (request);
138
130
}
139
131
140
132
void CUpdateWidget::checkForAppUpdateResponse (QNetworkReply *r)
@@ -146,16 +138,53 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
146
138
serverMessage = r->rawHeader (" message" );
147
139
}
148
140
149
- std::cout << statusCode << std::endl;
150
-
151
141
if (statusCode != 200 )
152
142
{
153
143
showError (" Update Check Failed!\n\n Unable to receive response from server." );
154
144
}
155
145
156
146
QXmlStreamReader reader (r->readAll ());
157
147
158
- if (reader.readNextStartElement ())
148
+ if (devChannel && !devAlreadyParsed)
149
+ {
150
+ parseAppXML (reader, true );
151
+ devAlreadyParsed = true ;
152
+ checkForAppUpdate ();
153
+ return ;
154
+ }
155
+ else
156
+ {
157
+ parseAppXML (reader, false );
158
+ }
159
+
160
+ ReadLastUpdateInfo ();
161
+
162
+ if (releases.size () > 0 )
163
+ {
164
+ serverTime = releases[0 ].timestamp ;
165
+
166
+ if (releases[0 ].terminal )
167
+ {
168
+ showTerminal ();
169
+ }
170
+ else if (releases[0 ].timestamp > lastUpdate)
171
+ {
172
+ showUpdateInfo ();
173
+ }
174
+ else
175
+ {
176
+ showUpToDate ();
177
+ }
178
+ }
179
+ else
180
+ {
181
+ showError (" Failed to read release information from server.\n Please try again later." );
182
+ }
183
+ }
184
+
185
+ void CUpdateWidget::parseAppXML (QXmlStreamReader& reader, bool dev)
186
+ {
187
+ if (reader.readNextStartElement ())
159
188
{
160
189
if (reader.name () == UPDATE)
161
190
{
@@ -205,6 +234,9 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
205
234
206
235
release.sdk .size = reader.attributes ().value (" size" ).toLongLong ();
207
236
release.sdk .name = reader.readElementText ();
237
+
238
+ if (dev) release.sdk .baseURL = DEV_BASE;
239
+ else release.sdk .baseURL = URL_BASE;
208
240
}
209
241
else if (reader.name () == FEBFILES)
210
242
{
@@ -216,7 +248,9 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
216
248
rfile.size = reader.attributes ().value (" size" ).toLongLong ();
217
249
rfile.name = reader.readElementText ();
218
250
219
-
251
+ if (dev) rfile.baseURL = DEV_BASE;
252
+ else rfile.baseURL = URL_BASE;
253
+
220
254
release.files .push_back (rfile);
221
255
}
222
256
else
@@ -245,7 +279,26 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
245
279
}
246
280
}
247
281
248
- if (release.active ) releases.push_back (release);
282
+ if (release.active )
283
+ {
284
+ // Insertion sort based on timestamp in releases. This is only necessary
285
+ // when doing a dev update, during which, the dev XML is parsed, and then
286
+ // the release xml is parsed, and those releases get interleaved into the
287
+ // dev releases according to their timestamp
288
+ bool inserted = false ;
289
+ for (auto it = releases.begin (); it != releases.end (); it++)
290
+ {
291
+ if (release.timestamp > it->timestamp )
292
+ {
293
+ releases.insert (it, release);
294
+ inserted = true ;
295
+ break ;
296
+ }
297
+ }
298
+
299
+ if (!inserted) releases.push_back (release);
300
+ }
301
+
249
302
}
250
303
else
251
304
{
@@ -255,31 +308,6 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
255
308
256
309
}
257
310
}
258
-
259
- ReadLastUpdateInfo ();
260
-
261
- if (releases.size () > 0 )
262
- {
263
- serverTime = releases[0 ].timestamp ;
264
-
265
- if (releases[0 ].terminal )
266
- {
267
- showTerminal ();
268
- }
269
- else if (releases[0 ].timestamp > lastUpdate)
270
- {
271
- showUpdateInfo ();
272
- }
273
- else
274
- {
275
- showUpToDate ();
276
- }
277
-
278
- }
279
- else
280
- {
281
- showError (" Failed to read release information from server.\n Please try again later." );
282
- }
283
311
}
284
312
285
313
void CUpdateWidget::checkForUpdaterUpdate ()
@@ -288,17 +316,13 @@ void CUpdateWidget::checkForUpdaterUpdate()
288
316
myurl.setScheme (ServerSettings::Scheme ());
289
317
myurl.setHost (ServerSettings::URL ());
290
318
myurl.setPort (ServerSettings::Port ());
291
- myurl.setPath (updaterBase + " .xml" );
319
+ myurl.setPath (QString (UPDATER_BASE) + " .xml" );
292
320
293
321
QNetworkRequest request;
294
322
request.setUrl (myurl);
295
323
request.setAttribute (QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::SameOriginRedirectPolicy);
296
324
297
- if (NetworkAccessibleCheck ())
298
- {
299
- restclient->get (request);
300
- }
301
-
325
+ restclient->get (request);
302
326
}
303
327
304
328
void CUpdateWidget::checkForUpdaterUpdateResponse (QNetworkReply *r)
@@ -344,7 +368,7 @@ void CUpdateWidget::checkForUpdaterUpdateResponse(QNetworkReply *r)
344
368
ReleaseFile rfile;
345
369
rfile.size = reader.attributes ().value (" size" ).toLongLong ();
346
370
rfile.name = reader.readElementText ();
347
-
371
+ rfile. baseURL = UPDATER_BASE;
348
372
349
373
release.files .push_back (rfile);
350
374
}
@@ -437,9 +461,19 @@ void CUpdateWidget::showUpdateInfo()
437
461
{
438
462
for (auto file : release.files )
439
463
{
440
- if (!updateFiles.contains (file.name ))
464
+ bool duplicate = false ;
465
+ for (auto updateFile : updateFiles)
441
466
{
442
- updateFiles.append (file.name );
467
+ if (updateFile.name == file.name )
468
+ {
469
+ duplicate = true ;
470
+ break ;
471
+ }
472
+ }
473
+
474
+ if (!duplicate)
475
+ {
476
+ updateFiles.push_back (file);
443
477
overallSize += file.size ;
444
478
}
445
479
}
@@ -588,11 +622,21 @@ void CUpdateWidget::showUpdaterUpdateInfo()
588
622
{
589
623
for (auto file : release.files )
590
624
{
591
- if (!updateFiles.contains (file.name ))
592
- {
593
- updateFiles.append (file.name );
594
- overallSize += file.size ;
595
- }
625
+ bool duplicate = false ;
626
+ for (auto updateFile : updateFiles)
627
+ {
628
+ if (updateFile.name == file.name )
629
+ {
630
+ duplicate = true ;
631
+ break ;
632
+ }
633
+ }
634
+
635
+ if (!duplicate)
636
+ {
637
+ updateFiles.push_back (file);
638
+ overallSize += file.size ;
639
+ }
596
640
}
597
641
}
598
642
}
0 commit comments