]> git.sur5r.net Git - minitube/blobdiff - src/networkaccess.cpp
Better constants definition
[minitube] / src / networkaccess.cpp
index b48d14a5374a1da225f1c8941a968899907927f7..378cb1a80fd51e9573e27b2e778ef6dc46141d1e 100644 (file)
@@ -1,46 +1,44 @@
 #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
@@ -48,19 +46,40 @@ void NetworkReply::finished() {
     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)),
@@ -75,26 +94,45 @@ NetworkReply* NetworkAccess::get(const QUrl url) {
     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)));
 
@@ -123,9 +161,9 @@ void NetworkAccess::syncMetaDataChanged() {
         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);
         */
     }
 
@@ -144,11 +182,17 @@ void NetworkAccess::error(QNetworkReply::NetworkError code) {
         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();
 }