1 #include "networkaccess.h"
9 NetworkReply::NetworkReply(QNetworkReply *networkReply) : QObject(networkReply) {
10 this->networkReply = networkReply;
13 void NetworkReply::finished() {
15 QUrl redirection = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
16 if (redirection.isValid()) {
18 // qDebug() << "Redirect!"; // << redirection;
20 QNetworkReply *redirectReply = The::http()->simpleGet(redirection, networkReply->operation());
22 setParent(redirectReply);
23 networkReply->deleteLater();
24 networkReply = redirectReply;
26 // when the request is finished we'll invoke the target method
27 connect(networkReply, SIGNAL(finished()), this, SLOT(finished()), Qt::AutoConnection);
33 emit finished(networkReply);
35 // get the HTTP response body
36 QByteArray bytes = networkReply->readAll();
41 // this will also delete this NetworkReply as the QNetworkReply is its parent
42 networkReply->deleteLater();
45 void NetworkReply::requestError(QNetworkReply::NetworkError code) {
46 emit error(networkReply);
49 /* --- NetworkAccess --- */
51 NetworkAccess::NetworkAccess( QObject* parent) : QObject( parent ) {}
53 QNetworkReply* NetworkAccess::simpleGet(QUrl url, int operation) {
55 QNetworkAccessManager *manager = The::networkAccessManager();
57 QNetworkRequest request(url);
58 request.setRawHeader("User-Agent", Constants::USER_AGENT.toUtf8());
59 request.setRawHeader("Connection", "Keep-Alive");
61 QNetworkReply *networkReply;
64 case QNetworkAccessManager::GetOperation:
65 qDebug() << "GET" << url.toString();
66 networkReply = manager->get(request);
69 case QNetworkAccessManager::HeadOperation:
70 qDebug() << "HEAD" << url.toString();
71 networkReply = manager->head(request);
75 qDebug() << "Unknown operation:" << operation;
81 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
82 this, SLOT(error(QNetworkReply::NetworkError)));
88 NetworkReply* NetworkAccess::get(const QUrl url) {
90 QNetworkReply *networkReply = simpleGet(url);
91 NetworkReply *reply = new NetworkReply(networkReply);
94 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
95 reply, SLOT(requestError(QNetworkReply::NetworkError)));
97 // when the request is finished we'll invoke the target method
98 connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
104 NetworkReply* NetworkAccess::head(const QUrl url) {
106 QNetworkReply *networkReply = simpleGet(url, QNetworkAccessManager::HeadOperation);
107 NetworkReply *reply = new NetworkReply(networkReply);
110 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
111 reply, SLOT(requestError(QNetworkReply::NetworkError)));
113 // when the request is finished we'll invoke the target method
114 connect(networkReply, SIGNAL(finished()), reply, SLOT(finished()), Qt::AutoConnection);
123 QNetworkReply* NetworkAccess::syncGet(QUrl url) {
127 networkReply = simpleGet(url);
128 connect(networkReply, SIGNAL(metaDataChanged()),
129 this, SLOT(syncMetaDataChanged()), Qt::AutoConnection);
130 connect(networkReply, SIGNAL(finished()),
131 this, SLOT(syncFinished()), Qt::AutoConnection);
132 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
133 this, SLOT(error(QNetworkReply::NetworkError)));
135 // A little trick to make this function blocking
137 // Do something else, maybe even network processing events
138 qApp->processEvents();
141 networkReply->deleteLater();
146 void NetworkAccess::syncMetaDataChanged() {
148 QUrl redirection = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
149 if (redirection.isValid()) {
151 qDebug() << "Redirect" << redirection;
152 networkReply->deleteLater();
153 syncGet(redirection);
156 QNetworkAccessManager *manager = The::networkAccessManager();
157 networkReply->deleteLater();
158 networkReply = manager->get(QNetworkRequest(redirection));
159 connect(networkReply, SIGNAL(metaDataChanged()),
160 this, SLOT(metaDataChanged()), Qt::AutoConnection);
161 connect(networkReply, SIGNAL(finished()),
162 this, SLOT(finished()), Qt::AutoConnection);
168 void NetworkAccess::syncFinished() {
173 void NetworkAccess::error(QNetworkReply::NetworkError code) {
174 // get the QNetworkReply that sent the signal
175 QNetworkReply *networkReply = static_cast<QNetworkReply *>(sender());
177 qDebug() << "Cannot get sender";
182 if (networkReply->operation() == QNetworkAccessManager::HeadOperation)
185 // report the error in the status bar
186 QMainWindow* mainWindow = dynamic_cast<QMainWindow*>(qApp->topLevelWidgets().first());
187 if (mainWindow) mainWindow->statusBar()->showMessage(
188 tr("Network error: %1").arg(networkReply->errorString()));
190 qDebug() << "Network error:" << networkReply->errorString() << code;
192 networkReply->deleteLater();
195 QByteArray NetworkAccess::syncGetBytes(QUrl url) {
196 return syncGet(url)->readAll();
199 QString NetworkAccess::syncGetString(QUrl url) {
200 return QString::fromUtf8(syncGetBytes(url));