]> git.sur5r.net Git - minitube/blob - lib/updater/src/impl/checker.cpp
New upstream version 3.5
[minitube] / lib / updater / src / impl / checker.cpp
1 #include "checker.h"
2
3 #include "appcastparser.h"
4 #include "defaultupdater.h"
5 #include "parser.h"
6
7 #ifdef HTTP
8 #include "http.h"
9 #endif
10
11 namespace {
12 const QString updateCheckKey = "updateCheck";
13 }
14
15 namespace updater {
16
17 Checker::Checker(DefaultUpdater *updater, QObject *parent) : QObject(parent), updater(updater) {}
18
19 void Checker::check() {
20     error = false;
21     errorMessage.clear();
22
23 #ifdef HTTP
24     HttpReply *reply = Http::instance().get(updater->getManifestUrl());
25     connect(reply, &HttpReply::finished, this, [this](const HttpReply &reply) {
26         if (reply.isSuccessful()) {
27             invokeParser(reply.body());
28         } else {
29             qWarning() << "Update check failed" << reply.statusCode() << reply.reasonPhrase();
30             error = true;
31             errorMessage = reply.reasonPhrase();
32             emit done();
33         }
34     });
35 #else
36     QNetworkAccessManager *manager = new QNetworkAccessManager(this);
37     QNetworkRequest request;
38     request.setUrl(updater->getManifestUrl());
39     request.setRawHeader("User-Agent",
40                          (updater->getAppName() + ' ' + updater->getLocalVersion()).toUtf8());
41     connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply) {
42         int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
43         if (status >= 200 && status < 300) {
44             invokeParser(reply->readAll());
45         } else {
46             QString msg = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
47             qWarning() << "Update check failed" << status << msg;
48             error = true;
49             errorMessage = msg;
50             emit done();
51         }
52         reply->deleteLater();
53     });
54     manager->get(request);
55 #endif
56 } // namespace updater
57
58 qint64 Checker::getLastCheck() {
59     QSettings settings;
60     return settings.value(updateCheckKey).toInt();
61 }
62
63 void Checker::invokeParser(const QByteArray &bytes) {
64     auto parser = updater->getParser();
65     if (!parser) {
66         AppcastParser defaultParser;
67         defaultParser.setUpdater(updater);
68         defaultParser.parse(bytes);
69     } else {
70         parser->parse(bytes);
71     }
72
73     bool versionsDontMatch =
74             !updater->getVersion().isEmpty() && updater->getVersion() != updater->getLocalVersion();
75     if (versionsDontMatch && updater->getStatus() != Updater::Status::UpdateDownloaded) {
76         if (updater->getAutomaticDownload()) {
77             updater->downloadUpdate();
78         } else {
79             updater->setStatus(Updater::Status::UpdateAvailable);
80         }
81     }
82
83     QSettings settings;
84     settings.setValue(updateCheckKey, QDateTime::currentSecsSinceEpoch());
85     emit done();
86 }
87
88 } // namespace updater