#include "networkaccess.h"
-#include "Constants.h"
+#include "constants.h"
#include <QtGui>
namespace The {
NetworkAccess* http();
}
+const QString USER_AGENT = QString(Constants::APP_NAME)
+ + " " + Constants::VERSION
+ + " (" + Constants::WEBSITE + ")";
+
NetworkReply::NetworkReply(QNetworkReply *networkReply) : QObject(networkReply) {
this->networkReply = networkReply;
}
-void NetworkReply::metaDataChanged() {
+void NetworkReply::finished() {
QUrl redirection = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
if (redirection.isValid()) {
- qDebug() << "Redirect" << redirection;
+ // qDebug() << "Redirect!"; // << redirection;
- QNetworkReply *redirectReply = The::http()->simpleGet(redirection);
+ QNetworkReply *redirectReply = The::http()->simpleGet(redirection, networkReply->operation());
setParent(redirectReply);
networkReply->deleteLater();
networkReply = redirectReply;
- // handle redirections
- connect(networkReply, SIGNAL(metaDataChanged()),
- this, SLOT(metaDataChanged()), Qt::QueuedConnection);
-
// when the request is finished we'll invoke the target method
- connect(networkReply, SIGNAL(finished()), this, SLOT(finished()), Qt::QueuedConnection);
+ connect(networkReply, SIGNAL(finished()), this, SLOT(finished()), Qt::AutoConnection);
+ return;
}
-}
-void NetworkReply::finished() {
emit finished(networkReply);
// get the HTTP response body
QByteArray bytes = networkReply->readAll();
-
emit data(bytes);
// bye bye my reply
networkReply->deleteLater();
}
+void NetworkReply::requestError(QNetworkReply::NetworkError code) {
+ emit error(networkReply);
+}
+
/* --- NetworkAccess --- */
NetworkAccess::NetworkAccess( QObject* parent) : QObject( parent ) {}
-QNetworkReply* NetworkAccess::simpleGet(QUrl url) {
+QNetworkReply* NetworkAccess::simpleGet(QUrl url, int operation) {
QNetworkAccessManager *manager = The::networkAccessManager();
QNetworkRequest request(url);
- request.setRawHeader("User-Agent", Constants::USER_AGENT.toUtf8());
+ request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
request.setRawHeader("Connection", "Keep-Alive");
- qDebug() << "GET" << url.toString();
- QNetworkReply *networkReply = manager->get(request);
+
+ QNetworkReply *networkReply;
+ switch (operation) {
+
+ case QNetworkAccessManager::GetOperation:
+ qDebug() << "GET" << url.toString();
+ networkReply = manager->get(request);
+ break;
+
+ case QNetworkAccessManager::HeadOperation:
+ qDebug() << "HEAD" << url.toString();
+ networkReply = manager->head(request);
+ break;
+
+ default:
+ qDebug() << "Unknown operation:" << operation;
+ return 0;
+
+ }
// error handling
connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
QNetworkReply *networkReply = simpleGet(url);
NetworkReply *reply = new NetworkReply(networkReply);
- // handle redirections
- connect(networkReply, SIGNAL(metaDataChanged()),
- reply, SLOT(metaDataChanged()), Qt::QueuedConnection);
+ // error signal
+ connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
+ reply, SLOT(requestError(QNetworkReply::NetworkError)));
// when the request is finished we'll invoke the target method
- connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::QueuedConnection);
+ connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
return reply;
}
+NetworkReply* NetworkAccess::head(const QUrl url) {
+
+ QNetworkReply *networkReply = simpleGet(url, QNetworkAccessManager::HeadOperation);
+ NetworkReply *reply = new NetworkReply(networkReply);
+
+ // error signal
+ connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
+ reply, SLOT(requestError(QNetworkReply::NetworkError)));
+
+ // when the request is finished we'll invoke the target method
+ connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
+
+ return reply;
+
+}
+
+/*** sync ***/
+
+
QNetworkReply* NetworkAccess::syncGet(QUrl url) {
working = true;
networkReply = simpleGet(url);
connect(networkReply, SIGNAL(metaDataChanged()),
- this, SLOT(syncMetaDataChanged()), Qt::QueuedConnection);
+ this, SLOT(syncMetaDataChanged()), Qt::AutoConnection);
connect(networkReply, SIGNAL(finished()),
- this, SLOT(syncFinished()), Qt::QueuedConnection);
+ this, SLOT(syncFinished()), Qt::AutoConnection);
connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(error(QNetworkReply::NetworkError)));
networkReply->deleteLater();
networkReply = manager->get(QNetworkRequest(redirection));
connect(networkReply, SIGNAL(metaDataChanged()),
- this, SLOT(metaDataChanged()), Qt::QueuedConnection);
+ this, SLOT(metaDataChanged()), Qt::AutoConnection);
connect(networkReply, SIGNAL(finished()),
- this, SLOT(finished()), Qt::QueuedConnection);
+ this, SLOT(finished()), Qt::AutoConnection);
*/
}
return;
}
+ // Ignore HEADs
+ if (networkReply->operation() == QNetworkAccessManager::HeadOperation)
+ return;
+
// report the error in the status bar
QMainWindow* mainWindow = dynamic_cast<QMainWindow*>(qApp->topLevelWidgets().first());
- if (mainWindow) mainWindow->statusBar()->showMessage(networkReply->errorString());
+ if (mainWindow) mainWindow->statusBar()->showMessage(
+ tr("Network error: %1").arg(networkReply->errorString()));
+
+ qDebug() << "Network error:" << networkReply->errorString() << code;
- qDebug() << "Network error" << networkReply->errorString() << code;
networkReply->deleteLater();
}