#include "pebblefirmware.h" #include #include #include #include #include const QString PebbleFirmware::firmwareURL("http://pebblefw.s3.amazonaws.com/pebble/%1/%2/latest.json"); PebbleFirmware::PebbleFirmware(QObject *parent) : QObject(parent), nm(new QNetworkAccessManager(this)) { connect(nm, SIGNAL(finished(QNetworkReply*)), SLOT(onNetworkReplyFinished(QNetworkReply*))); } void PebbleFirmware::updateLatest(QString hw) { QNetworkRequest req; req.setUrl(firmwareURL.arg(hw).arg("release-v3.8")); req.setRawHeader("Cache-Control", "no-cache"); qDebug() << "Getting latest firmware" << req.url(); nm->get(req); } void PebbleFirmware::fetchFirmware(QString currVer) { QJsonObject targetFirmware; if (_latest.contains("3.x-migration") && currVer < "v3.0.0") { targetFirmware = _latest.value("3.x-migration").toObject(); } else if (currVer >= "v3.0.0" && _latest.value("normal").toObject().value("friendlyVersion").toString() > currVer){ targetFirmware = _latest.value("normal").toObject(); } if (targetFirmware.isEmpty()) { qDebug() << "Watch firmware is up to date"; return; } QNetworkRequest req; req.setUrl(targetFirmware.value("url").toString()); req.setRawHeader("Cache-Control", "no-cache"); qDebug() << "Fetching firmware" << req.url(); nm->get(req); } void PebbleFirmware::onNetworkReplyFinished(QNetworkReply* rep) { qDebug() << "Download finished" << rep->url(); if (rep->request().url().toString().endsWith("/latest.json")) { QJsonDocument jsonResponse = QJsonDocument::fromJson(rep->readAll()); _latest = jsonResponse.object(); if (!_latest.isEmpty()) { qDebug() << "Latest firmware" << _latest; emit latestChanged(); } } else if (rep->url().toString().endsWith(".pbz")) { QDir downDir(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); QFileInfo name(rep->url().toString(QUrl::FullyDecoded|QUrl::NormalizePathSegments| QUrl::RemoveQuery|QUrl::RemoveFragment)); QFile file(downDir.absoluteFilePath(name.fileName())); file.open(QIODevice::WriteOnly|QIODevice::Truncate); if (file.write(rep->readAll()) == -1) { qWarning() << "Error writing" << file.fileName() << file.errorString(); } else { file.close(); qDebug() << "Downloaded" << file.fileName(); emit firmwareFetched(file.fileName()); } } else { qWarning() << "Unrequested download" << rep->request().url(); } }