Skip to content

Commit b204889

Browse files
Updater now grabs necessary files from the release channel when doing a dev update.
1 parent 7aeddfb commit b204889

File tree

5 files changed

+150
-117
lines changed

5 files changed

+150
-117
lines changed

FEBioStudio/UpdateChecker.cpp

+106-62
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@ SOFTWARE.*/
4545
#include <iostream>
4646

4747
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)
5150
{
5251
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
5352
layout = new QVBoxLayout;
@@ -75,22 +74,16 @@ void CUpdateWidget::sslErrorHandler(QNetworkReply *reply, const QList<QSslError>
7574

7675
void CUpdateWidget::connFinished(QNetworkReply *r)
7776
{
78-
if(r->request().url().path() == urlBase + ".xml")
77+
if(r->request().url().path() == QString(UPDATER_BASE) + ".xml")
7978
{
80-
checkForAppUpdateResponse(r);
79+
checkForUpdaterUpdateResponse(r);
8180
}
82-
else if(r->request().url().path() == updaterBase + ".xml")
81+
else
8382
{
84-
checkForUpdaterUpdateResponse(r);
83+
checkForAppUpdateResponse(r);
8584
}
8685
}
8786

88-
bool CUpdateWidget::NetworkAccessibleCheck()
89-
{
90-
// return restclient->networkAccessible() == QNetworkAccessManager::Accessible;
91-
return true;
92-
}
93-
9487
void CUpdateWidget::checkForUpdate(bool dev, bool checkSDK, bool upCheck)
9588
{
9689
updaterUpdateCheck = upCheck;
@@ -109,7 +102,9 @@ void CUpdateWidget::checkForUpdate(bool dev, bool checkSDK, bool upCheck)
109102

110103
void CUpdateWidget::checkForAppUpdate()
111104
{
112-
if(devChannel)
105+
QString urlBase;
106+
107+
if(devChannel && !devAlreadyParsed)
113108
{
114109
urlBase = DEV_BASE;
115110
}
@@ -131,10 +126,7 @@ void CUpdateWidget::checkForAppUpdate()
131126

132127
request.setRawHeader(QByteArray("UUID"), UUID.toUtf8());
133128

134-
if(NetworkAccessibleCheck())
135-
{
136-
restclient->get(request);
137-
}
129+
restclient->get(request);
138130
}
139131

140132
void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
@@ -146,16 +138,53 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
146138
serverMessage = r->rawHeader("message");
147139
}
148140

149-
std::cout << statusCode << std::endl;
150-
151141
if(statusCode != 200)
152142
{
153143
showError("Update Check Failed!\n\nUnable to receive response from server.");
154144
}
155145

156146
QXmlStreamReader reader(r->readAll());
157147

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.\nPlease try again later.");
182+
}
183+
}
184+
185+
void CUpdateWidget::parseAppXML(QXmlStreamReader& reader, bool dev)
186+
{
187+
if (reader.readNextStartElement())
159188
{
160189
if(reader.name() == UPDATE)
161190
{
@@ -205,6 +234,9 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
205234

206235
release.sdk.size = reader.attributes().value("size").toLongLong();
207236
release.sdk.name = reader.readElementText();
237+
238+
if(dev) release.sdk.baseURL = DEV_BASE;
239+
else release.sdk.baseURL = URL_BASE;
208240
}
209241
else if(reader.name() == FEBFILES)
210242
{
@@ -216,7 +248,9 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
216248
rfile.size = reader.attributes().value("size").toLongLong();
217249
rfile.name = reader.readElementText();
218250

219-
251+
if(dev) rfile.baseURL = DEV_BASE;
252+
else rfile.baseURL = URL_BASE;
253+
220254
release.files.push_back(rfile);
221255
}
222256
else
@@ -245,7 +279,26 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
245279
}
246280
}
247281

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+
249302
}
250303
else
251304
{
@@ -255,31 +308,6 @@ void CUpdateWidget::checkForAppUpdateResponse(QNetworkReply *r)
255308

256309
}
257310
}
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.\nPlease try again later.");
282-
}
283311
}
284312

285313
void CUpdateWidget::checkForUpdaterUpdate()
@@ -288,17 +316,13 @@ void CUpdateWidget::checkForUpdaterUpdate()
288316
myurl.setScheme(ServerSettings::Scheme());
289317
myurl.setHost(ServerSettings::URL());
290318
myurl.setPort(ServerSettings::Port());
291-
myurl.setPath(updaterBase + ".xml");
319+
myurl.setPath(QString(UPDATER_BASE) + ".xml");
292320

293321
QNetworkRequest request;
294322
request.setUrl(myurl);
295323
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::SameOriginRedirectPolicy);
296324

297-
if(NetworkAccessibleCheck())
298-
{
299-
restclient->get(request);
300-
}
301-
325+
restclient->get(request);
302326
}
303327

304328
void CUpdateWidget::checkForUpdaterUpdateResponse(QNetworkReply *r)
@@ -344,7 +368,7 @@ void CUpdateWidget::checkForUpdaterUpdateResponse(QNetworkReply *r)
344368
ReleaseFile rfile;
345369
rfile.size = reader.attributes().value("size").toLongLong();
346370
rfile.name = reader.readElementText();
347-
371+
rfile.baseURL = UPDATER_BASE;
348372

349373
release.files.push_back(rfile);
350374
}
@@ -437,9 +461,19 @@ void CUpdateWidget::showUpdateInfo()
437461
{
438462
for(auto file : release.files)
439463
{
440-
if(!updateFiles.contains(file.name))
464+
bool duplicate = false;
465+
for(auto updateFile : updateFiles)
441466
{
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);
443477
overallSize += file.size;
444478
}
445479
}
@@ -588,11 +622,21 @@ void CUpdateWidget::showUpdaterUpdateInfo()
588622
{
589623
for(auto file : release.files)
590624
{
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+
}
596640
}
597641
}
598642
}

FEBioStudio/UpdateChecker.h

+7-10
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ SOFTWARE.*/
3030
#include <QDialog>
3131
#include <QSslError>
3232
#include <QStringList>
33+
#include <unordered_map>
3334

3435
class QNetworkReply;
3536
class QVBoxLayout;
3637
class QLabel;
3738
class QCheckBox;
3839
class QNetworkAccessManager;
3940
class QDialogButtonBox;
41+
class QXmlStreamReader;
4042

4143
#ifdef WIN32
4244
#define URL_BASE "/update2/FEBioStudio2/Windows"
@@ -60,7 +62,8 @@ class QDialogButtonBox;
6062

6163
struct ReleaseFile
6264
{
63-
QString name;
65+
QString baseURL;
66+
QString name;
6467
qint64 size;
6568
};
6669

@@ -105,10 +108,9 @@ private slots:
105108
void sslErrorHandler(QNetworkReply *reply, const QList<QSslError> &errors);
106109

107110
private:
108-
bool NetworkAccessibleCheck();
109-
110111
void checkForAppUpdate();
111112
void checkForAppUpdateResponse(QNetworkReply *r);
113+
void parseAppXML(QXmlStreamReader& reader, bool dev);
112114

113115
void checkForUpdaterUpdate();
114116
void checkForUpdaterUpdateResponse(QNetworkReply *r);
@@ -127,24 +129,19 @@ private slots:
127129

128130
QNetworkAccessManager* restclient;
129131

130-
QStringList updateFiles;
132+
std::vector<ReleaseFile> updateFiles;
131133
QStringList deleteFiles;
132-
QStringList newFiles;
133-
QStringList newDirs;
134-
int currentIndex;
135134
qint64 overallSize;
136-
qint64 downloadedSize;
137135

138136
std::vector<Release> releases;
139137
std::vector<Release> updaterReleases;
140138
qint64 lastUpdate;
141139
qint64 serverTime;
142140

143141
bool devChannel;
142+
bool devAlreadyParsed;
144143
bool updaterUpdateCheck;
145144
bool doingUpdaterUpdate;
146-
QString urlBase;
147-
QString updaterBase;
148145

149146
bool m_askSDK;
150147
QCheckBox* m_getSDK;

Updater/FEBioStudioUpdater.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,15 @@ int main(int argc, char* argv[])
6262
bool updaterUpdateCheck = true;
6363
for(int index = 1; index < argc; index++)
6464
{
65-
if(QString(argv[index]) == QString("--devChannel"))
65+
if(QString(argv[index]) == QString("--devChannel") || QString(argv[index]) == QString("-d"))
6666
{
6767
devChannel = true;
6868
}
69-
else if(QString(argv[index]) == QString("--noUpdaterCheck"))
69+
else if(QString(argv[index]) == QString("--noUpdaterCheck") || QString(argv[index]) == QString("-n"))
7070
{
7171
updaterUpdateCheck = false;
7272
}
7373
}
74-
75-
argc > 1 && QString(argv[1]) == QString("--devChannel");
7674

7775
// create the main window
7876
CMainWindow wnd(devChannel, updaterUpdateCheck);

0 commit comments

Comments
 (0)