checking if internet is available before trying to check for an update. This resolve the shutdown after a minute error on mac os x and windows

preferencesAboutTextFull
Claudio Valerio 13 years ago
parent f6684fc7ea
commit 3d9cd22bd2
  1. 32
      src/core/UBApplicationController.cpp
  2. 3
      src/core/UBApplicationController.h
  3. 323
      src/network/UBNetworkAccessManager.cpp

@ -49,6 +49,8 @@
#include "podcast/UBPodcastController.h" #include "podcast/UBPodcastController.h"
#include "network/UBNetworkAccessManager.h"
#include "ui_mainWindow.h" #include "ui_mainWindow.h"
#ifdef Q_WS_MAC #ifdef Q_WS_MAC
@ -70,6 +72,7 @@ UBApplicationController::UBApplicationController(UBBoardView *pControlView, UBBo
, mAutomaticCheckForUpdates(false) , mAutomaticCheckForUpdates(false)
, mCheckingForUpdates(false) , mCheckingForUpdates(false)
, mIsShowingDesktop(false) , mIsShowingDesktop(false)
, mHttp(0)
{ {
mDisplayManager = new UBDisplayManager(this); mDisplayManager = new UBDisplayManager(this);
@ -121,6 +124,7 @@ UBApplicationController::~UBApplicationController()
delete mBlackScene; delete mBlackScene;
delete mMirror; delete mMirror;
if (mFtp) delete mFtp; if (mFtp) delete mFtp;
if (mHttp) delete mHttp;
} }
@ -499,17 +503,29 @@ void UBApplicationController::showSankoreEditor()
emit mainModeChanged(mMainMode); emit mainModeChanged(mMainMode);
} }
void UBApplicationController::runCheckUpdate(int id, bool error)
{
if(!error){
if(mFtp!=NULL)
delete mFtp;
mFtp = new QFtp(this);
connect(mFtp, SIGNAL(commandFinished(int,bool)), this, SLOT(ftpCommandFinished(int,bool)));
mFtp->connectToHost("91.121.248.138",21);
mFtp->login("anonymous", "anonymous");
mFtp->get("update.json",0);
}
}
void UBApplicationController::checkUpdate() void UBApplicationController::checkUpdate()
{ {
if (mFtp!=NULL) //TODO change this when upgrade the qt version
delete mFtp; // networkAccessible : NetworkAccessibility not yet available
mFtp = new QFtp(this); if(mHttp)
connect(mFtp, SIGNAL(commandFinished(int,bool)), this, SLOT(ftpCommandFinished(int,bool))); delete mHttp;
QUrl url("http://www.google.com");
mFtp->connectToHost("91.121.248.138",21); mHttp = new QHttp(url.host());
mFtp->login("anonymous", "anonymous"); connect(mHttp, SIGNAL(requestFinished(int,bool)), this, SLOT(runCheckUpdate(int,bool)));
mFtp->get("update.json",0); mHttp->get(url.path());
} }
void UBApplicationController::ftpCommandFinished(int id, bool error) void UBApplicationController::ftpCommandFinished(int id, bool error)

@ -30,6 +30,7 @@ class UBVersion;
class UBSoftwareUpdate; class UBSoftwareUpdate;
class QNetworkAccessManager; class QNetworkAccessManager;
class QNetworkReply; class QNetworkReply;
class QHttp;
class UBApplicationController : public QObject class UBApplicationController : public QObject
@ -135,6 +136,7 @@ class UBApplicationController : public QObject
private slots: private slots:
void ftpCommandFinished(int id, bool error); void ftpCommandFinished(int id, bool error);
void runCheckUpdate(int id, bool error);
protected: protected:
@ -171,6 +173,7 @@ class UBApplicationController : public QObject
QNetworkAccessManager *networkAccessManager; QNetworkAccessManager *networkAccessManager;
void downloadJsonFinished(QString updateString); void downloadJsonFinished(QString updateString);
QHttp* mHttp;
}; };
#endif /* UBAPPLICATIONCONTROLLER_H_ */ #endif /* UBAPPLICATIONCONTROLLER_H_ */

@ -12,165 +12,164 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "UBNetworkAccessManager.h" #include "UBNetworkAccessManager.h"
#include <QtGui> #include <QtGui>
#include <QtNetwork> #include <QtNetwork>
#include "frameworks/UBDesktopServices.h" #include "frameworks/UBDesktopServices.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/UBApplicationController.h" #include "core/UBApplicationController.h"
#include "core/UBSettings.h" #include "core/UBSettings.h"
#include "ui_passworddialog.h" #include "ui_passworddialog.h"
#include "ui_proxy.h" #include "ui_proxy.h"
#include "UBCookieJar.h" #include "UBCookieJar.h"
#include "core/memcheck.h" #include "core/memcheck.h"
UBNetworkAccessManager *UBNetworkAccessManager::sNetworkAccessManager = 0; UBNetworkAccessManager *UBNetworkAccessManager::sNetworkAccessManager = 0;
UBNetworkAccessManager *UBNetworkAccessManager::defaultAccessManager() UBNetworkAccessManager *UBNetworkAccessManager::defaultAccessManager()
{ {
if (!sNetworkAccessManager) { if (!sNetworkAccessManager) {
sNetworkAccessManager = new UBNetworkAccessManager(qApp); sNetworkAccessManager = new UBNetworkAccessManager(qApp);
sNetworkAccessManager->setCookieJar(new UBCookieJar(sNetworkAccessManager)); sNetworkAccessManager->setCookieJar(new UBCookieJar(sNetworkAccessManager));
} }
return sNetworkAccessManager; return sNetworkAccessManager;
} }
UBNetworkAccessManager::UBNetworkAccessManager(QObject *parent) UBNetworkAccessManager::UBNetworkAccessManager(QObject *parent)
: QNetworkAccessManager(parent) : QNetworkAccessManager(parent)
, mProxyAuthenticationCount(0) , mProxyAuthenticationCount(0)
{ {
connect(this, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), connect(this, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)),
SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*))); SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
connect(this, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)), connect(this, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)),
SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*))); SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)));
connect(this, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), connect(this, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)),
SLOT(sslErrors(QNetworkReply*, const QList<QSslError>&))); SLOT(sslErrors(QNetworkReply*, const QList<QSslError>&)));
QNetworkProxy* proxy = UBSettings::settings()->httpProxy(); QNetworkProxy* proxy = UBSettings::settings()->httpProxy();
if (proxy) if (proxy)
{ {
setProxy(*proxy); setProxy(*proxy);
} }
else else
{ {
QNetworkProxyFactory::setUseSystemConfiguration(true); QNetworkProxyFactory::setUseSystemConfiguration(true);
} }
QNetworkDiskCache *diskCache = new QNetworkDiskCache(this); QNetworkDiskCache *diskCache = new QNetworkDiskCache(this);
QString location = UBSettings::uniboardDataDirectory() + "/web-cache"; QString location = UBSettings::uniboardDataDirectory() + "/web-cache";
diskCache->setCacheDirectory(location); diskCache->setCacheDirectory(location);
setCache(diskCache); setCache(diskCache);
} }
QNetworkReply* UBNetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData) QNetworkReply* UBNetworkAccessManager::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData)
{ {
QNetworkRequest request = req; // copy so we can modify QNetworkRequest request = req; // copy so we can modify
// this is a temporary hack until we properly use the pipelining flags from QtWebkit // this is a temporary hack until we properly use the pipelining flags from QtWebkit
// pipeline everything! :) // pipeline everything! :)
request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true); request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
QNetworkReply* reply = QNetworkAccessManager::createRequest(op, request, outgoingData); QNetworkReply* reply = QNetworkAccessManager::createRequest(op, request, outgoingData);
return reply; return reply;
} }
QNetworkReply *UBNetworkAccessManager::get(const QNetworkRequest &request) QNetworkReply *UBNetworkAccessManager::get(const QNetworkRequest &request)
{ {
qDebug() << "request url: " << request.url(); qDebug() << "request url: " << request.url();
QTime loadStartTime; QTime loadStartTime;
loadStartTime.start(); loadStartTime.start();
QNetworkReply *networkReply = QNetworkAccessManager::get(request); QNetworkReply *networkReply = QNetworkAccessManager::get(request);
return networkReply; return networkReply;
} }
void UBNetworkAccessManager::authenticationRequired(QNetworkReply *reply, QAuthenticator *auth) void UBNetworkAccessManager::authenticationRequired(QNetworkReply *reply, QAuthenticator *auth)
{ {
QWidget *mainWindow = QApplication::activeWindow(); QWidget *mainWindow = QApplication::activeWindow();
QDialog dialog(mainWindow); QDialog dialog(mainWindow);
dialog.setWindowFlags(Qt::Sheet); dialog.setWindowFlags(Qt::Sheet);
Ui::PasswordDialog passwordDialog; Ui::PasswordDialog passwordDialog;
passwordDialog.setupUi(&dialog); passwordDialog.setupUi(&dialog);
passwordDialog.iconLabel->setText(QString()); passwordDialog.iconLabel->setText(QString());
passwordDialog.iconLabel->setPixmap(mainWindow->style()->standardIcon(QStyle::SP_MessageBoxQuestion, 0, mainWindow).pixmap(32, 32)); passwordDialog.iconLabel->setPixmap(mainWindow->style()->standardIcon(QStyle::SP_MessageBoxQuestion, 0, mainWindow).pixmap(32, 32));
QString introMessage = tr("<qt>Enter username and password for \"%1\" at %2</qt>"); QString introMessage = tr("<qt>Enter username and password for \"%1\" at %2</qt>");
introMessage = introMessage.arg(Qt::escape(reply->url().toString())).arg(Qt::escape(reply->url().toString())); introMessage = introMessage.arg(Qt::escape(reply->url().toString())).arg(Qt::escape(reply->url().toString()));
passwordDialog.introLabel->setText(introMessage); passwordDialog.introLabel->setText(introMessage);
passwordDialog.introLabel->setWordWrap(true); passwordDialog.introLabel->setWordWrap(true);
if (dialog.exec() == QDialog::Accepted) if (dialog.exec() == QDialog::Accepted)
{ {
if(auth && passwordDialog.userNameLineEdit) if(auth && passwordDialog.userNameLineEdit)
auth->setUser(passwordDialog.userNameLineEdit->text()); auth->setUser(passwordDialog.userNameLineEdit->text());
if(auth && passwordDialog.passwordLineEdit) if(auth && passwordDialog.passwordLineEdit)
auth->setPassword(passwordDialog.passwordLineEdit->text()); auth->setPassword(passwordDialog.passwordLineEdit->text());
} }
} }
void UBNetworkAccessManager::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *auth) void UBNetworkAccessManager::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *auth)
{ {
Q_UNUSED(proxy); Q_UNUSED(proxy);
QString username = UBSettings::settings()->proxyUsername(); QString username = UBSettings::settings()->proxyUsername();
QString password = UBSettings::settings()->proxyPassword(); QString password = UBSettings::settings()->proxyPassword();
if (username.length() > 0 || password.length() > 0) if (username.length() > 0 || password.length() > 0)
{ {
auth->setUser(username); auth->setUser(username);
auth->setPassword(password); auth->setPassword(password);
} }
mProxyAuthenticationCount++; mProxyAuthenticationCount++;
if (mProxyAuthenticationCount == 3) if (mProxyAuthenticationCount == 3)
{ {
UBApplication::showMessage(tr("Failed to log to Proxy")); UBApplication::showMessage(tr("Failed to log to Proxy"));
disconnect(SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)) disconnect(SIGNAL(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*))
, this, SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*))); , this, SLOT(proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)));
} }
return; return;
} }
void UBNetworkAccessManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &error) void UBNetworkAccessManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &error)
{ {
// check if SSL certificate has been trusted already // check if SSL certificate has been trusted already
QString replyHost = reply->url().host() + ":" + reply->url().port(); QString replyHost = reply->url().host() + ":" + reply->url().port();
if(!sslTrustedHostList.contains(replyHost)) if(!sslTrustedHostList.contains(replyHost))
{ {
QWidget *mainWindow = QApplication::activeWindow(); QWidget *mainWindow = QApplication::activeWindow();
QStringList errorStrings; QStringList errorStrings;
for (int i = 0; i < error.count(); ++i) for (int i = 0; i < error.count(); ++i)
errorStrings += error.at(i).errorString(); errorStrings += error.at(i).errorString();
QString errors = errorStrings.join(QLatin1String("\n")); QString errors = errorStrings.join(QLatin1String("\n"));
int ret = QMessageBox::warning(mainWindow, QCoreApplication::applicationName(), int ret = QMessageBox::warning(mainWindow, QCoreApplication::applicationName(),
tr("SSL Errors:\n\n%1\n\n%2\n\n" tr("SSL Errors:\n\n%1\n\n%2\n\n"
"Do you want to ignore these errors for this host?").arg(reply->url().toString()).arg(errors), "Do you want to ignore these errors for this host?").arg(reply->url().toString()).arg(errors),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes | QMessageBox::No,
QMessageBox::No); QMessageBox::No);
if (ret == QMessageBox::Yes) if (ret == QMessageBox::Yes)
{ {
reply->ignoreSslErrors(); reply->ignoreSslErrors();
sslTrustedHostList.append(replyHost); sslTrustedHostList.append(replyHost);
} }
} }
} }

Loading…
Cancel
Save