void MainWindow::httpRequestFinished(QNetworkReply *reply) { bool silent = reply->property("silent").toBool(); QString str; if (reply->error() == QNetworkReply::NoError && reply->isReadable()) str = QString::fromUtf8(reply->readAll()); else return httpRequestFailed(silent); reply->deleteLater(); QTextStream in(&str); if (in.readLine() != "[iTest.current-version]") return httpRequestFailed(silent); QString current_ver = in.readLine(); if (in.readLine() != "[iTest.current-version.float]") return httpRequestFailed(silent); double f_current_ver = in.readLine().toDouble(); if (in.readLine() != "[iTest.release-notes]") return httpRequestFailed(silent); QString release_notes; while (!in.atEnd()) { release_notes.append(in.readLine()); } if (f_current_ver <= F_ITEST_VERSION) { if (!silent) { QMessageBox message(this); message.setWindowTitle("iTest"); message.setWindowModality(Qt::WindowModal); message.setWindowFlags(message.windowFlags() | Qt::Sheet); message.setIcon(QMessageBox::Information); message.setText(tr("You are running the latest version of iTest.")); message.exec(); } } else { QMessageBox message(this); message.setWindowTitle("iTest"); message.setWindowModality(Qt::WindowModal); message.setWindowFlags(message.windowFlags() | Qt::Sheet); message.setIcon(QMessageBox::Information); message.setText(tr("iTest %1 is available now.").arg(current_ver)); message.setInformativeText(QString("<html><head>" "<meta name=\"qrichtext\" content=\"1\" />" "<style type=\"text/css\">p, li { white-space: pre-wrap; }</style>" "</head><body><p>%1</p></body></html>") .arg(release_notes)); message.addButton(tr("&Download Update"), QMessageBox::AcceptRole); message.addButton(tr("Remind Me &Later"), QMessageBox::RejectRole); switch (message.exec()) { case QMessageBox::AcceptRole: // Download QDesktopServices::openUrl(QUrl("http://github.com/michal-tomlein/itest/releases")); break; case QMessageBox::RejectRole: // Later break; } } }
static memBuf_t * httpRequest(const char *url, const char *logUrl, const char *data, const char *logData, enum requestType rt) { const char *nonNullData = data ? data : ""; memBuf_t *mp = (memBuf_t *)myMalloc(sizeof(memBuf_t)); char *metaRefresh; mp->memory = mp->readptr = NULL; mp->size = 0; mp->timeToFirstByte = 0; lastURL = url; if (!curlInitDone && initCurlStuff()) return NULL; /* Note: was CURLOPT_WRITEDATA, which is the same as CURLOPT_FILE. * Some older versions of libcurl don't have CURLOPT_WRITEDATA. */ if ((curlrc = curl_easy_setopt(easyhandle, CURLOPT_FILE, (void *)mp))) return httpRequestFailed(mp); if (rt == GET) { if ((curlrc = curl_easy_setopt(easyhandle, CURLOPT_HTTPGET, 1))) return httpRequestFailed(mp); } else { log(("%s", logData ? logData : nonNullData)); if ((curlrc = curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, nonNullData))) return httpRequestFailed(mp); } log(("%s", logUrl ? logUrl : url)); if ((curlrc = curl_easy_setopt(easyhandle, CURLOPT_URL, url))) return httpRequestFailed(mp); if ((curlrc = curl_easy_perform(easyhandle))) return httpRequestFailed(mp); log(("checking for META Refresh")); if ((metaRefresh = memGetMetaRefresh(mp)) != NULL) { log(("page redirection by META Refresh: %s\n", metaRefresh)); freeMembuf(mp); return httpGet(metaRefresh, NULL); } return mp; }