diff --git a/context/albumview.cpp b/context/albumview.cpp index fcd5029f8..c4c3752c6 100644 --- a/context/albumview.cpp +++ b/context/albumview.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include diff --git a/context/albumview.h b/context/albumview.h index 47517065c..4253628e3 100644 --- a/context/albumview.h +++ b/context/albumview.h @@ -28,7 +28,7 @@ #include class QImage; -class QNetworkReply; +class NetworkJob; class QByteArray; class QUrl; class ContextEngine; diff --git a/context/artistview.cpp b/context/artistview.cpp index e2f823b01..1ce0a4b94 100644 --- a/context/artistview.cpp +++ b/context/artistview.cpp @@ -32,7 +32,6 @@ #include "contextengine.h" #include "actioncollection.h" #include "musiclibrarymodel.h" -#include #include #include #include @@ -242,12 +241,12 @@ void ArtistView::loadSimilar() void ArtistView::handleSimilarReply() { - QNetworkReply *reply = qobject_cast(sender()); + NetworkJob *reply = qobject_cast(sender()); if (!reply) { return; } if (reply==currentSimilarJob) { - if (QNetworkReply::NoError==reply->error()) { + if (reply->ok()) { QByteArray data=reply->readAll(); QStringList artists=parseSimilarResponse(data); if (!artists.isEmpty()) { diff --git a/context/artistview.h b/context/artistview.h index 3ad6da52f..174b52996 100644 --- a/context/artistview.h +++ b/context/artistview.h @@ -30,7 +30,7 @@ class ComboBox; class QLabel; -class QNetworkReply; +class NetworkJob; class QIODevice; class QImage; class QUrl; @@ -83,7 +83,7 @@ private: QString pic; QString biography; QString similarArtists; - QNetworkReply *currentSimilarJob; + NetworkJob *currentSimilarJob; QString provider; QString webLinks; QString albums; diff --git a/context/contextengine.cpp b/context/contextengine.cpp index 895b90cad..40f987c0a 100644 --- a/context/contextengine.cpp +++ b/context/contextengine.cpp @@ -24,7 +24,7 @@ #include "contextengine.h" #include "metaengine.h" #include "wikipediaengine.h" -#include +#include "networkaccessmanager.h" ContextEngine * ContextEngine::create(QObject *parent) { @@ -66,9 +66,9 @@ void ContextEngine::cancel() } } -QNetworkReply * ContextEngine::getReply(QObject *obj) +NetworkJob * ContextEngine::getReply(QObject *obj) { - QNetworkReply *reply = qobject_cast(obj); + NetworkJob *reply = qobject_cast(obj); if (!reply) { return 0; } diff --git a/context/contextengine.h b/context/contextengine.h index ef375d5fc..23b4d0c1a 100644 --- a/context/contextengine.h +++ b/context/contextengine.h @@ -27,7 +27,7 @@ #include #include -class QNetworkReply; +class NetworkJob; class ContextEngine : public QObject { @@ -58,10 +58,10 @@ Q_SIGNALS: void searchResult(const QString &html, const QString &lang); protected: - QNetworkReply * getReply(QObject *obj); + NetworkJob * getReply(QObject *obj); protected: - QNetworkReply *job; + NetworkJob *job; }; #endif diff --git a/context/contextwidget.cpp b/context/contextwidget.cpp index b5ef103ce..de4b83714 100644 --- a/context/contextwidget.cpp +++ b/context/contextwidget.cpp @@ -38,7 +38,6 @@ #include #include #include -#include #if QT_VERSION >= 0x050000 #include #endif @@ -660,7 +659,7 @@ void ContextWidget::getDiscoGsImage() //void ContextWidget::htBackdropsResponse() //{ -// QNetworkReply *reply = getReply(sender()); +// NetworkJob *reply = getReply(sender()); // if (!reply) { // return; // } @@ -668,7 +667,7 @@ void ContextWidget::getDiscoGsImage() // DBUG << "status" << reply->error() << reply->errorString(); // QString id; -// if (QNetworkReply::NoError==reply->error()) { +// if (reply->ok()) { // QXmlStreamReader xml(reply); // while (!xml.atEnd() && !xml.hasError() && id.isEmpty()) { // xml.readNext(); @@ -694,7 +693,7 @@ void ContextWidget::getDiscoGsImage() // } // } // } -// } else if (QNetworkReply::OperationCanceledError==reply->error()) { +// } else if (NetworkJob::OperationCanceledError==reply->error()) { // // We timed out, someting wrong with htbackdrops? Jsut use auto-generated backdrops for now... // useHtBackdrops=false; // } @@ -711,7 +710,7 @@ void ContextWidget::getDiscoGsImage() void ContextWidget::musicbrainzResponse() { - QNetworkReply *reply = getReply(sender()); + NetworkJob *reply = getReply(sender()); if (!reply) { return; } @@ -719,7 +718,7 @@ void ContextWidget::musicbrainzResponse() DBUG << "status" << reply->error() << reply->errorString(); bool inSection=false; - QXmlStreamReader doc(reply); + QXmlStreamReader doc(reply->actualJob()); QString id; while (!doc.atEnd()) { @@ -749,7 +748,7 @@ void ContextWidget::musicbrainzResponse() void ContextWidget::fanArtResponse() { - QNetworkReply *reply = getReply(sender()); + NetworkJob *reply = getReply(sender()); if (!reply) { return; } @@ -757,13 +756,13 @@ void ContextWidget::fanArtResponse() DBUG << "status" << reply->error() << reply->errorString(); QString url; - if (QNetworkReply::NoError==reply->error()) { + if (reply->ok()) { QJson::Parser parser; bool ok=false; - #ifdef Q_OS_WIN - QVariantMap parsed=parser.parse(reply->readAll(), &ok).toMap(); - #else - QVariantMap parsed=parser.parse(reply, &ok).toMap(); + #ifdef Q_OS_WIN + QVariantMap parsed=parser.parse(reply->readAll(), &ok).toMap(); + #else + QVariantMap parsed=parser.parse(reply->actualJob(), &ok).toMap(); #endif if (ok && !parsed.isEmpty()) { QVariantMap artist=parsed[parsed.keys().first()].toMap(); @@ -829,7 +828,7 @@ static bool matchesArtist(const QString &titleOrig, const QString &artistOrig) void ContextWidget::discoGsResponse() { - QNetworkReply *reply = getReply(sender()); + NetworkJob *reply = getReply(sender()); if (!reply) { return; } @@ -837,13 +836,13 @@ void ContextWidget::discoGsResponse() DBUG << "status" << reply->error() << reply->errorString(); QString url; - if (QNetworkReply::NoError==reply->error()) { + if (reply->ok()) { QJson::Parser parser; bool ok=false; #ifdef Q_OS_WIN QVariantMap parsed=parser.parse(reply->readAll(), &ok).toMap(); #else - QVariantMap parsed=parser.parse(reply, &ok).toMap(); + QVariantMap parsed=parser.parse(reply->actualJob(), &ok).toMap(); #endif if (ok && parsed.contains("resp")) { QVariantMap response=parsed["resp"].toMap(); @@ -878,14 +877,14 @@ void ContextWidget::discoGsResponse() void ContextWidget::downloadResponse() { - QNetworkReply *reply = getReply(sender()); + NetworkJob *reply = getReply(sender()); if (!reply) { return; } DBUG << "status" << reply->error() << reply->errorString(); - if (QNetworkReply::NoError!=reply->error()) { + if (!reply->ok()) { return; } @@ -940,9 +939,9 @@ void ContextWidget::backdropCreated(const QString &artist, const QImage &img) } } -QNetworkReply * ContextWidget::getReply(QObject *obj) +NetworkJob * ContextWidget::getReply(QObject *obj) { - QNetworkReply *reply = qobject_cast(obj); + NetworkJob *reply = qobject_cast(obj); if (!reply) { return 0; } diff --git a/context/contextwidget.h b/context/contextwidget.h index 94e40f9a1..149ab40bc 100644 --- a/context/contextwidget.h +++ b/context/contextwidget.h @@ -35,7 +35,7 @@ class ArtistView; class AlbumView; class SongView; class BackdropCreator; -class QNetworkReply; +class NetworkJob; class QStackedWidget; class QComboBox; class QImage; @@ -103,10 +103,10 @@ private: void getFanArtBackdrop(); void getDiscoGsImage(); void createBackdrop(); - QNetworkReply * getReply(QObject *obj); + NetworkJob * getReply(QObject *obj); private: - QNetworkReply *job; + NetworkJob *job; bool drawBackdrop; bool darkBackground; // bool useHtBackdrops; diff --git a/context/lastfmengine.cpp b/context/lastfmengine.cpp index 46c824bde..4d7433abe 100644 --- a/context/lastfmengine.cpp +++ b/context/lastfmengine.cpp @@ -25,7 +25,6 @@ #include "networkaccessmanager.h" #include "localize.h" #include "covers.h" -#include #if QT_VERSION >= 0x050000 #include #endif @@ -45,8 +44,6 @@ const QLatin1String LastFmEngine::constLinkPlaceholder("XXX_CONTEXT_READ_MORE_ON static const char * constModeProperty="mode"; static const char * constQuery="query"; -static const char * constRedirectsProperty="redirects"; -static const int constMaxRedirects=3; LastFmEngine::LastFmEngine(QObject *p) : ContextEngine(p) @@ -89,7 +86,6 @@ void LastFmEngine::search(const QStringList &query, Mode mode) job=NetworkAccessManager::self()->get(url); job->setProperty(constModeProperty, (int)mode); - job->setProperty(constRedirectsProperty, 0); QStringList queryString; foreach (QString q, fixedQuery) { @@ -105,24 +101,13 @@ void LastFmEngine::search(const QStringList &query, Mode mode) void LastFmEngine::parseResponse() { DBUG << __FUNCTION__; - QNetworkReply *reply = getReply(sender()); + NetworkJob *reply = getReply(sender()); if (!reply) { return; } - QVariant redirect = reply->header(QNetworkRequest::LocationHeader); - int numRirects=reply->property(constRedirectsProperty).toInt(); - if (redirect.isValid() && ++numRirectsget(redirect.toString()); - job->setProperty(constRedirectsProperty, numRirects); - job->setProperty(constModeProperty, reply->property(constModeProperty)); - DBUG << "Redirect" << redirect.toString(); - connect(job, SIGNAL(finished()), this, SLOT(parseResponse())); - return; - } - QByteArray data=reply->readAll(); - if (QNetworkReply::NoError!=reply->error() || data.isEmpty()) { + if (!reply->ok() || data.isEmpty()) { DBUG << "Empty/error"; emit searchResult(QString(), QString()); return; diff --git a/context/songview.cpp b/context/songview.cpp index 14730d5ed..2ada72326 100644 --- a/context/songview.cpp +++ b/context/songview.cpp @@ -334,13 +334,13 @@ void SongView::update(const Song &s, bool force) void SongView::downloadFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (reply) { reply->deleteLater(); - if (QNetworkReply::NoError==reply->error()) { + if (reply->ok()) { QString file=reply->property("file").toString(); if (!file.isEmpty() && file==currentSong.file) { - QTextStream str(reply); + QTextStream str(reply->actualJob()); QString lyrics=str.readAll(); if (!lyrics.isEmpty()) { text->setText(fixNewLines(lyrics)); diff --git a/context/songview.h b/context/songview.h index 079928fc4..8a8192fb8 100644 --- a/context/songview.h +++ b/context/songview.h @@ -30,7 +30,7 @@ class UltimateLyricsProvider; class QImage; class Action; -class QNetworkReply; +class NetworkJob; class SongView : public View { @@ -94,7 +94,7 @@ private: Mode mode; QString lyricsFile; QString preEdit; - QNetworkReply *job; + NetworkJob *job; }; #endif diff --git a/context/ultimatelyricsprovider.cpp b/context/ultimatelyricsprovider.cpp index 1e8dd3251..46bc8a626 100644 --- a/context/ultimatelyricsprovider.cpp +++ b/context/ultimatelyricsprovider.cpp @@ -24,11 +24,8 @@ #include "ultimatelyricsprovider.h" #include "networkaccessmanager.h" #include "song.h" -#include #include -static const int constRedirectLimit=5; - static QString extract(const QString &source, const QString &begin, const QString &end) { int beginIdx = source.indexOf(begin); @@ -128,7 +125,6 @@ static QString titleCase(const QString &text) UltimateLyricsProvider::UltimateLyricsProvider() : enabled(true) , relevance(0) - , redirectCount(0) { } @@ -161,16 +157,14 @@ void UltimateLyricsProvider::fetchInfo(int id, const Song &metadata) doUrlReplace("{a}", firstChar(artistFixed), urlText); doUrlReplace("{track}", QString::number(metadata.track), urlText); - // Fetch the URL, follow redirects - redirectCount = 0; - QNetworkReply *reply = NetworkAccessManager::self()->get(QNetworkRequest(QUrl(urlText))); + NetworkJob *reply = NetworkAccessManager::self()->get(QUrl(urlText)); requests[reply] = id; connect(reply, SIGNAL(finished()), SLOT(lyricsFetched())); } void UltimateLyricsProvider::lyricsFetched() { - QNetworkReply *reply = qobject_cast(sender()); + NetworkJob *reply = qobject_cast(sender()); if (!reply) { return; } @@ -178,45 +172,22 @@ void UltimateLyricsProvider::lyricsFetched() int id = requests.take(reply); reply->deleteLater(); - if (QNetworkReply::NoError!=reply->error()) { + if (!reply->ok()) { //emit Finished(id); emit lyricsReady(id, QString()); return; } - // Handle redirects - QVariant redirect_target = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); - if (redirect_target.isValid()) { - if (redirectCount >= constRedirectLimit) { - //emit Finished(id); - emit lyricsReady(id, QString()); - return; - } - - QUrl target = redirect_target.toUrl(); - if (target.scheme().isEmpty() || target.host().isEmpty()) { - QString path = target.path(); - target = reply->url(); - target.setPath(path); - } - - redirectCount ++; - QNetworkReply* reply = NetworkAccessManager::self()->get(QNetworkRequest(target)); - requests[reply] = id; - connect(reply, SIGNAL(finished()), SLOT(lyricsFetched())); - return; - } - #if QT_VERSION < 0x050000 const QTextCodec *codec = QTextCodec::codecForName(charset.toAscii().constData()); #else const QTextCodec *codec = QTextCodec::codecForName(charset.toLatin1().constData()); #endif - const QString original_content = codec->toUnicode(reply->readAll()); + const QString originalContent = codec->toUnicode(reply->readAll()); // Check for invalid indicators foreach (const QString &indicator, invalidIndicators) { - if (original_content.contains(indicator)) { + if (originalContent.contains(indicator)) { //emit Finished(id); emit lyricsReady(id, QString()); return; @@ -227,7 +198,7 @@ void UltimateLyricsProvider::lyricsFetched() // Apply extract rules foreach (const Rule& rule, extractRules) { - QString content = original_content; + QString content = originalContent; applyExtractRule(rule, &content); if (!content.isEmpty()) { diff --git a/context/ultimatelyricsprovider.h b/context/ultimatelyricsprovider.h index 38113b225..c0bbebd3b 100644 --- a/context/ultimatelyricsprovider.h +++ b/context/ultimatelyricsprovider.h @@ -30,7 +30,7 @@ #include struct Song; -class QNetworkReply; +class NetworkJob; class UltimateLyricsProvider : public QObject { Q_OBJECT @@ -68,7 +68,7 @@ private: private: bool enabled; - QHash requests; + QHash requests; QString name; QString title; QString url; @@ -78,7 +78,6 @@ private: QList extractRules; QList excludeRules; QStringList invalidIndicators; - int redirectCount; }; #endif // ULTIMATELYRICSPROVIDER_H diff --git a/context/wikipediaengine.cpp b/context/wikipediaengine.cpp index 13c6f8968..c87b0beb9 100644 --- a/context/wikipediaengine.cpp +++ b/context/wikipediaengine.cpp @@ -25,7 +25,6 @@ #include "networkaccessmanager.h" #include "localize.h" #include "settings.h" -#include #if QT_VERSION >= 0x050000 #include #endif @@ -41,9 +40,7 @@ void WikipediaEngine::enableDebug() } static const char * constModeProperty="mode"; -static const char * constRedirectsProperty="redirects"; static const char * constQueryProperty="query"; -static const int constMaxRedirects=3; static QString strip(const QString &string, QString open, QString close, QString inner=QString()) { @@ -334,7 +331,6 @@ void WikipediaEngine::requestTitles(const QStringList &query, Mode mode, const Q job=NetworkAccessManager::self()->get(url); job->setProperty(constModeProperty, (int)mode); - job->setProperty(constRedirectsProperty, 0); job->setProperty(constQueryProperty, query); DBUG << url.toString(); connect(job, SIGNAL(finished()), this, SLOT(parseTitles())); @@ -343,7 +339,7 @@ void WikipediaEngine::requestTitles(const QStringList &query, Mode mode, const Q void WikipediaEngine::parseTitles() { DBUG << __FUNCTION__; - QNetworkReply *reply = getReply(sender()); + NetworkJob *reply = getReply(sender()); if (!reply) { return; } @@ -351,7 +347,7 @@ void WikipediaEngine::parseTitles() QUrl url=reply->url(); QString hostLang=getLang(url); QByteArray data=reply->readAll(); - if (QNetworkReply::NoError!=reply->error() || data.isEmpty()) { + if (!reply->ok() || data.isEmpty()) { DBUG << reply->errorString(); emit searchResult(QString(), QString()); return; @@ -518,7 +514,6 @@ void WikipediaEngine::getPage(const QStringList &query, Mode mode, const QString job=NetworkAccessManager::self()->get(url); job->setProperty(constModeProperty, (int)mode); job->setProperty(constQueryProperty, query); - job->setProperty(constRedirectsProperty, 0); DBUG << url.toString(); connect(job, SIGNAL(finished()), this, SLOT(parsePage())); } @@ -526,26 +521,14 @@ void WikipediaEngine::getPage(const QStringList &query, Mode mode, const QString void WikipediaEngine::parsePage() { DBUG << __FUNCTION__; - QNetworkReply *reply = getReply(sender()); + NetworkJob *reply = getReply(sender()); if (!reply) { return; } - QVariant redirect = reply->header(QNetworkRequest::LocationHeader); - int numRirects=reply->property(constRedirectsProperty).toInt(); - if (redirect.isValid() && ++numRirectsget(redirect.toString()); - job->setProperty(constRedirectsProperty, numRirects); - job->setProperty(constModeProperty, reply->property(constModeProperty)); - job->setProperty(constQueryProperty, reply->property(constQueryProperty)); - DBUG << "Redirect" << redirect.toString(); - connect(job, SIGNAL(finished()), this, SLOT(parsePage())); - return; - } - QByteArray data=reply->readAll(); - if (QNetworkReply::NoError!=reply->error() || data.isEmpty()) { - DBUG << "Empty/error"; + if (!reply->ok() || data.isEmpty()) { + DBUG << "Empty/error"; emit searchResult(QString(), QString()); return; } diff --git a/context/wikipediasettings.cpp b/context/wikipediasettings.cpp index 1bd32caf7..06e77cc10 100644 --- a/context/wikipediasettings.cpp +++ b/context/wikipediasettings.cpp @@ -32,7 +32,6 @@ #include "utils.h" #include "action.h" #include "thread.h" -#include #if QT_VERSION >= 0x050000 #include #endif @@ -185,7 +184,7 @@ void WikipediaSettings::getLangs() void WikipediaSettings::parseLangs() { - QNetworkReply *reply = qobject_cast(sender()); + NetworkJob *reply = qobject_cast(sender()); if (!reply) { return; } diff --git a/context/wikipediasettings.h b/context/wikipediasettings.h index f25542af8..9cb6d2462 100644 --- a/context/wikipediasettings.h +++ b/context/wikipediasettings.h @@ -27,7 +27,7 @@ #include "togglelist.h" #include -class QNetworkReply; +class NetworkJob; class QShowEvent; class QListWidgetItem; class Spinner; @@ -87,7 +87,7 @@ private: private: State state; - QNetworkReply *job; + NetworkJob *job; Spinner *spinner; Action *reload; QMap prefMap; diff --git a/devices/actiondialog.cpp b/devices/actiondialog.cpp index 8d4e7dadd..661d49c2a 100644 --- a/devices/actiondialog.cpp +++ b/devices/actiondialog.cpp @@ -657,9 +657,6 @@ void ActionDialog::actionStatus(int status, bool copiedCover) case Device::FailedToUpdateTags: setPage(PAGE_SKIP, i18n("Failed to update metadata.

%1", formatSong(currentSong))); break; - case Device::TooManyRedirects: - setPage(PAGE_SKIP, i18n("Failed to download track - too many redirects encountered.

%1", formatSong(currentSong))); - break; case Device::DownloadFailed: setPage(PAGE_SKIP, i18n("Failed to download track.

%1", formatSong(currentSong))); break; diff --git a/devices/device.h b/devices/device.h index 545396e69..05331634a 100644 --- a/devices/device.h +++ b/devices/device.h @@ -82,7 +82,6 @@ public: FailedToLockDevice, // These are for online services... - TooManyRedirects, DownloadFailed }; diff --git a/dynamic/dynamic.cpp b/dynamic/dynamic.cpp index 85d0af31f..ad91bd29b 100644 --- a/dynamic/dynamic.cpp +++ b/dynamic/dynamic.cpp @@ -315,7 +315,7 @@ bool Dynamic::save(const Entry &e) QNetworkRequest req(url); req.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); - currentJob=NetworkAccessManager::self()->post(req, string.toUtf8()); + currentJob=new NetworkJob(NetworkAccessManager::self()->post(req, string.toUtf8())); connect(currentJob, SIGNAL(finished()), this, SLOT(remoteJobFinished())); currentCommand=Save; currentArgs.clear(); @@ -832,7 +832,7 @@ void Dynamic::sendCommand(Command cmd, const QStringList &args) url.setQuery(query); #endif - currentJob=NetworkAccessManager::self()->deleteResource(QNetworkRequest(url)); + currentJob=new NetworkJob(NetworkAccessManager::self()->deleteResource(QNetworkRequest(url))); } else { currentCommand=Unknown; currentArgs.clear(); @@ -856,9 +856,9 @@ void Dynamic::sendCommand(Command cmd, const QStringList &args) if (SetActive==cmd || Control==cmd) { QNetworkRequest req(url); req.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); - currentJob=NetworkAccessManager::self()->post(req, QByteArray()); + currentJob=new NetworkJob(NetworkAccessManager::self()->post(req, QByteArray())); } else { - currentJob=NetworkAccessManager::self()->get(QNetworkRequest(url)); + currentJob=NetworkAccessManager::self()->get(url); } } if (List==cmd) { @@ -949,7 +949,7 @@ void Dynamic::updateRemoteStatus() void Dynamic::remoteJobFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (!reply || reply!=currentJob) { return; } @@ -958,7 +958,7 @@ void Dynamic::remoteJobFinished() reply->deleteLater(); int httpResponse=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - bool cmdOk=QNetworkReply::NoError==reply->error() && (200==httpResponse || 201==httpResponse); + bool cmdOk=reply->ok() && (200==httpResponse || 201==httpResponse); DBUG << toString(currentCommand) << currentArgs << cmdOk; QString response; if (cmdOk) { diff --git a/dynamic/dynamic.h b/dynamic/dynamic.h index e8a62e8d7..7dd5c9bd1 100644 --- a/dynamic/dynamic.h +++ b/dynamic/dynamic.h @@ -32,7 +32,7 @@ #include "actionmodel.h" class QTimer; -class QNetworkReply; +class NetworkJob; class QUdpSocket; class MulticastReceiver : public QObject @@ -174,7 +174,7 @@ private: int statusTime; QString lastState; QString dynamicUrl; - QNetworkReply *currentJob; + NetworkJob *currentJob; Command currentCommand; QStringList currentArgs; Entry currentSave; diff --git a/gui/coverdialog.cpp b/gui/coverdialog.cpp index f96f1f910..e150d7d2f 100644 --- a/gui/coverdialog.cpp +++ b/gui/coverdialog.cpp @@ -454,41 +454,30 @@ static const char * constWidthProperty="w"; static const char * constHeightProperty="h"; static const char * constSizeProperty="sz"; static const char * constTypeProperty="type"; -static const char * constRedirectsProperty="redirects"; static const char * constLastFmHost="ws.audioscrobbler.com"; static const char * constGoogleHost="images.google.com"; static const char * constDiscogsHost="api.discogs.com"; static const char * constCoverArtArchiveHost="coverartarchive.org"; -static const int constMaxRedirects=5; - void CoverDialog::queryJobFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (!reply || !currentQuery.contains(reply)) { return; } currentQuery.remove(reply); - if(QNetworkReply::NoError==reply->error()) { + if (reply->ok()) { QString host=reply->property(constHostProperty).toString(); - QVariant redirect = reply->header(QNetworkRequest::LocationHeader); - if (redirect.isValid()) { - int rd=reply->property(constRedirectsProperty).toInt(); - if (rdreadAll(); - if (constLastFmHost==host) { - parseLstFmQueryResponse(resp); - } else if (constGoogleHost==host) { - parseGoogleQueryResponse(resp); - } else if (constDiscogsHost==host) { - parseDiscogsQueryResponse(resp); - } else if (constCoverArtArchiveHost==host) { - parseCoverArtArchiveQueryResponse(resp); - } + QByteArray resp=reply->readAll(); + if (constLastFmHost==host) { + parseLstFmQueryResponse(resp); + } else if (constGoogleHost==host) { + parseGoogleQueryResponse(resp); + } else if (constDiscogsHost==host) { + parseDiscogsQueryResponse(resp); + } else if (constCoverArtArchiveHost==host) { + parseCoverArtArchiveQueryResponse(resp); } } reply->deleteLater(); @@ -538,7 +527,7 @@ void CoverDialog::insertItem(CoverItem *item) void CoverDialog::downloadJobFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (!reply || !currentQuery.contains(reply)) { return; } @@ -550,88 +539,63 @@ void CoverDialog::downloadJobFinished() } currentQuery.remove(reply); - if(QNetworkReply::NoError==reply->error()) { + if (reply->ok()) { QString host=reply->property(constHostProperty).toString(); - QVariant redirect = reply->header(QNetworkRequest::LocationHeader); - if (redirect.isValid()) { - int rd=reply->property(constRedirectsProperty).toInt(); - if (rdsetProperty(constRedirectsProperty, rd+1); - QStringList stringProps=QStringList() << constHostProperty << constLargeProperty << constThumbProperty; - QStringList intProps=QStringList() << constWidthProperty << constHeightProperty << constSizeProperty; - foreach (const QString &prop, stringProps) { - QVariant p=reply->property(prop.toLatin1().constData()); - if (p.isValid()) { - j->setProperty(prop.toLatin1().constData(), p.toString()); - } + QString url=reply->url().toString(); + QByteArray data=reply->readAll(); + FileType fileType=url.endsWith(".jpg") || url.endsWith(".jpeg") ? FT_Jpg : (url.endsWith(".png") ? FT_Png : FT_Other); + QImage img=QImage::fromData(data, FT_Jpg==fileType ? "JPG" : (FT_Png==fileType ? "PNG" : 0)); + if (!img.isNull()) { + bool isLarge=reply->property(constThumbProperty).toString().isEmpty(); + QTemporaryFile *temp=0; + + if (isLarge || (reply->property(constThumbProperty).toString()==reply->property(constLargeProperty).toString())) { + temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+(FT_Jpg==fileType ? "jpg" : "png")); + + if (temp->open()) { + if (FT_Other==fileType) { + img.save(temp, "PNG"); + } else { + temp->write(data); } - foreach (const QString &prop, intProps) { - QVariant p=reply->property(prop.toLatin1().constData()); - if (p.isValid()) { - j->setProperty(prop.toLatin1().constData(), p.toInt()); - } + if (tempFiles.size()>=constMaxTempFiles) { + QTemporaryFile *last=tempFiles.takeLast(); + last->remove(); + delete last; } + temp->setProperty(constLargeProperty, reply->property(constLargeProperty)); + tempFiles.prepend(temp); + } else { + delete temp; + temp=0; } } - } else { - QString url=reply->url().toString(); - QByteArray data=reply->readAll(); - FileType fileType=url.endsWith(".jpg") || url.endsWith(".jpeg") ? FT_Jpg : (url.endsWith(".png") ? FT_Png : FT_Other); - QImage img=QImage::fromData(data, FT_Jpg==fileType ? "JPG" : (FT_Png==fileType ? "PNG" : 0)); - if (!img.isNull()) { - bool isLarge=reply->property(constThumbProperty).toString().isEmpty(); - QTemporaryFile *temp=0; - - if (isLarge || (reply->property(constThumbProperty).toString()==reply->property(constLargeProperty).toString())) { - temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+(FT_Jpg==fileType ? "jpg" : "png")); - - if (temp->open()) { - if (FT_Other==fileType) { - img.save(temp, "PNG"); - } else { - temp->write(data); - } - if (tempFiles.size()>=constMaxTempFiles) { - QTemporaryFile *last=tempFiles.takeLast(); - last->remove(); - delete last; - } - temp->setProperty(constLargeProperty, reply->property(constLargeProperty)); - tempFiles.prepend(temp); - } else { - delete temp; - temp=0; + if (isLarge) { + if (DL_LargePreview==dlType) { + previewDialog()->showImage(cropImage(img, isArtist), reply->property(constLargeProperty).toString()); + } else if (DL_LargeSave==dlType) { + if (!temp) { + MessageBox::error(this, i18n("Failed to set cover!\nCould not download to temporary file!")); + } else if (saveCover(temp->fileName(), img)) { + accept(); } } - if (isLarge) { - if (DL_LargePreview==dlType) { - previewDialog()->showImage(cropImage(img, isArtist), reply->property(constLargeProperty).toString()); - } else if (DL_LargeSave==dlType) { - if (!temp) { - MessageBox::error(this, i18n("Failed to set cover!\nCould not download to temporary file!")); - } else if (saveCover(temp->fileName(), img)) { - accept(); - } - } - } else { - CoverItem *item=0; - img=cropImage(img, isArtist); - if (constLastFmHost==host) { - item=new LastFmCover(reply->property(constLargeProperty).toString(), url, img, list); - } else if (constGoogleHost==host) { - item=new GoogleCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(), - reply->property(constHeightProperty).toInt(), reply->property(constSizeProperty).toInt(), list); - } else if (constDiscogsHost==host) { - item=new DiscogsCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(), - reply->property(constHeightProperty).toInt(), list); - } else if (constCoverArtArchiveHost==host) { - item=new CoverArtArchiveCover(reply->property(constLargeProperty).toString(), url, img, list); - } - if (item) { - insertItem(item); - } + } else { + CoverItem *item=0; + img=cropImage(img, isArtist); + if (constLastFmHost==host) { + item=new LastFmCover(reply->property(constLargeProperty).toString(), url, img, list); + } else if (constGoogleHost==host) { + item=new GoogleCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(), + reply->property(constHeightProperty).toInt(), reply->property(constSizeProperty).toInt(), list); + } else if (constDiscogsHost==host) { + item=new DiscogsCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(), + reply->property(constHeightProperty).toInt(), list); + } else if (constCoverArtArchiveHost==host) { + item=new CoverArtArchiveCover(reply->property(constLargeProperty).toString(), url, img, list); + } + if (item) { + insertItem(item); } } } @@ -664,7 +628,7 @@ void CoverDialog::showImage(QListWidgetItem *item) previewDialog()->showImage(((LocalCover *)cover)->image(), cover->url()); } else { previewDialog()->downloading(cover->url()); - QNetworkReply *j=downloadImage(cover->url(), DL_LargePreview); + NetworkJob *j=downloadImage(cover->url(), DL_LargePreview); if (j) { j->setProperty(constLargeProperty, cover->url()); connect(j, SIGNAL(downloadProgress(qint64, qint64)), preview, SLOT(progress(qint64, qint64))); @@ -805,7 +769,7 @@ void CoverDialog::checkStatus() void CoverDialog::cancelQuery() { - foreach (QNetworkReply *job, currentQuery) { + foreach (NetworkJob *job, currentQuery) { if (DL_Query==job->property(constTypeProperty).toInt()) { disconnect(job, SIGNAL(finished()), this, SLOT(queryJobFinished())); } else { @@ -893,17 +857,16 @@ void CoverDialog::clearTempFiles() } } -void CoverDialog::sendQueryRequest(const QUrl &url, int redirects, const QString &host) +void CoverDialog::sendQueryRequest(const QUrl &url, const QString &host) { - QNetworkReply *j=NetworkAccessManager::self()->get(QNetworkRequest(url)); + NetworkJob *j=NetworkAccessManager::self()->get(QNetworkRequest(url)); j->setProperty(constHostProperty, host.isEmpty() ? url.host() : host); j->setProperty(constTypeProperty, (int)DL_Query); - j->setProperty(constRedirectsProperty, redirects); connect(j, SIGNAL(finished()), this, SLOT(queryJobFinished())); currentQuery.insert(j); } -QNetworkReply * CoverDialog::downloadImage(const QString &url, DownloadType dlType) +NetworkJob * CoverDialog::downloadImage(const QString &url, DownloadType dlType) { if (DL_Thumbnail==dlType) { if (currentUrls.contains(url)) { @@ -937,11 +900,10 @@ QNetworkReply * CoverDialog::downloadImage(const QString &url, DownloadType dlTy saving=true; } - QNetworkReply *j=NetworkAccessManager::self()->get(QNetworkRequest(QUrl(url))); + NetworkJob *j=NetworkAccessManager::self()->get(QNetworkRequest(QUrl(url))); connect(j, SIGNAL(finished()), this, SLOT(downloadJobFinished())); currentQuery.insert(j); j->setProperty(constTypeProperty, (int)dlType); - j->setProperty(constRedirectsProperty, 0); if (saving) { previewDialog()->downloading(url); connect(j, SIGNAL(downloadProgress(qint64, qint64)), preview, SLOT(progress(qint64, qint64))); @@ -1008,7 +970,7 @@ void CoverDialog::parseLstFmQueryResponse(const QByteArray &resp) } if (!largeUrl.isEmpty() && !thumbUrl.isEmpty()) { - QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail); + NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail); if (j) { j->setProperty(constHostProperty, constLastFmHost); j->setProperty(constLargeProperty, largeUrl); @@ -1050,7 +1012,7 @@ void CoverDialog::parseGoogleQueryResponse(const QByteArray &resp) QString largeUrl=url.queryItemValue("imgurl"); QString thumbUrl=rx.cap(2); if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) { - QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail); + NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail); if (j) { j->setProperty(constHostProperty, constGoogleHost); j->setProperty(constLargeProperty, largeUrl); @@ -1102,7 +1064,7 @@ void CoverDialog::parseDiscogsQueryResponse(const QByteArray &resp) QString thumbUrl=rm["thumb"].toString(); if (thumbUrl.contains("/image/A-150-")) { QString largeUrl=thumbUrl.replace("image/A-150-", "/image/A-"); - QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail); + NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail); if (j) { j->setProperty(constHostProperty, constDiscogsHost); j->setProperty(constLargeProperty, largeUrl); @@ -1124,7 +1086,7 @@ void CoverDialog::parseDiscogsQueryResponse(const QByteArray &resp) QString thumbUrl=im["uri150"].toString(); QString largeUrl=im["uri"].toString(); if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) { - QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail); + NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail); if (j) { j->setProperty(constHostProperty, constDiscogsHost); j->setProperty(constLargeProperty, largeUrl); @@ -1159,7 +1121,7 @@ void CoverDialog::parseCoverArtArchiveQueryResponse(const QByteArray &resp) thumbUrl=thumb["large"].toString(); } if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) { - QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail); + NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail); if (j) { j->setProperty(constHostProperty, constCoverArtArchiveHost); j->setProperty(constLargeProperty, largeUrl); @@ -1183,7 +1145,7 @@ void CoverDialog::slotButtonClicked(int button) accept(); } } else if (CoverItem::Type_Existing!=cover->type()) { - QNetworkReply *j=downloadImage(cover->url(), DL_LargeSave); + NetworkJob *j=downloadImage(cover->url(), DL_LargeSave); if (j) { j->setProperty(constLargeProperty, cover->url()); } diff --git a/gui/coverdialog.h b/gui/coverdialog.h index 9332e3126..bc487d0eb 100644 --- a/gui/coverdialog.h +++ b/gui/coverdialog.h @@ -32,7 +32,7 @@ #include #include -class QNetworkReply; +class NetworkJob; class QUrl; class QTemporaryFile; class QListWidgetItem; @@ -122,9 +122,9 @@ private: void sendDiscoGsQuery(const QString &fixedQuery, int page); CoverPreview *previewDialog(); void insertItem(CoverItem *item); - QNetworkReply * downloadImage(const QString &url, DownloadType dlType); + NetworkJob * downloadImage(const QString &url, DownloadType dlType); void clearTempFiles(); - void sendQueryRequest(const QUrl &url, int redirects=0, const QString &host=QString()); + void sendQueryRequest(const QUrl &url, const QString &host=QString()); void parseLstFmQueryResponse(const QByteArray &resp); void parseGoogleQueryResponse(const QByteArray &resp); void parseDiscogsQueryResponse(const QByteArray &resp); @@ -138,7 +138,7 @@ private: Song song; ExistingCover *existing; QString currentQueryString; - QSet currentQuery; + QSet currentQuery; QSet currentUrls; QSet currentLocalCovers; QList tempFiles; diff --git a/gui/covers.cpp b/gui/covers.cpp index 1f1bb72e1..ec912aa05 100644 --- a/gui/covers.cpp +++ b/gui/covers.cpp @@ -42,7 +42,6 @@ #endif #include #include -#include #include #include #include @@ -434,7 +433,7 @@ bool CoverDownloader::downloadViaHttp(Job &job, JobType type) #endif job.type=type; - QNetworkReply *j=manager->get(QNetworkRequest(u)); + NetworkJob *j=manager->get(u); connect(j, SIGNAL(finished()), this, SLOT(jobFinished())); jobs.insert(j, job); DBUG << u.toString(); @@ -461,7 +460,7 @@ void CoverDownloader::downloadViaLastFm(Job &job) url.setQuery(query); #endif - QNetworkReply *j = manager->get(url); + NetworkJob *j = manager->get(url); connect(j, SIGNAL(finished()), this, SLOT(lastFmCallFinished())); job.type=JobLastFm; jobs.insert(j, job); @@ -470,22 +469,22 @@ void CoverDownloader::downloadViaLastFm(Job &job) void CoverDownloader::lastFmCallFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (!reply) { return; } DBUG << "status" << reply->error() << reply->errorString(); - QHash::Iterator it(jobs.find(reply)); - QHash::Iterator end(jobs.end()); + QHash::Iterator it(jobs.find(reply)); + QHash::Iterator end(jobs.end()); if (it!=end) { Job job=it.value(); jobs.erase(it); QString url; - if(QNetworkReply::NoError==reply->error()) { + if(reply->ok()) { QXmlStreamReader doc(reply->readAll()); QString largeUrl; bool inSection=false; @@ -525,7 +524,7 @@ void CoverDownloader::lastFmCallFinished() #else u=QUrl(url); #endif - QNetworkReply *j=manager->get(QNetworkRequest(u)); + NetworkJob *j=manager->get(QNetworkRequest(u)); connect(j, SIGNAL(finished()), this, SLOT(jobFinished())); DBUG << "download" << u.toString(); jobs.insert(j, job); @@ -550,18 +549,18 @@ void CoverDownloader::lastFmCallFinished() void CoverDownloader::jobFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (!reply) { return; } DBUG << "status" << reply->error() << reply->errorString(); - QHash::Iterator it(jobs.find(reply)); - QHash::Iterator end(jobs.end()); + QHash::Iterator it(jobs.find(reply)); + QHash::Iterator end(jobs.end()); if (it!=end) { - QByteArray data=QNetworkReply::NoError==reply->error() ? reply->readAll() : QByteArray(); + QByteArray data=reply->ok() ? reply->readAll() : QByteArray(); QString url=reply->url().toString(); Covers::Image img; img.img= data.isEmpty() ? QImage() : QImage::fromData(data, url.endsWith(".jpg", Qt::CaseInsensitive) || url.endsWith(".jpeg", Qt::CaseInsensitive) @@ -676,10 +675,10 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA return QString(); } -QHash::Iterator CoverDownloader::findJob(const Job &job) +QHash::Iterator CoverDownloader::findJob(const Job &job) { - QHash::Iterator it(jobs.begin()); - QHash::Iterator end(jobs.end()); + QHash::Iterator it(jobs.begin()); + QHash::Iterator end(jobs.end()); for (; it!=end; ++it) { if ((*it).isArtist==job.isArtist && (*it).song.albumArtist()==job.song.albumArtist() && (*it).song.album==job.song.album) { diff --git a/gui/covers.h b/gui/covers.h index 120f0b1d2..e38d41e86 100644 --- a/gui/covers.h +++ b/gui/covers.h @@ -37,7 +37,7 @@ class QString; class Thread; -class QNetworkReply; +class NetworkJob; class QMutex; class QTimer; #ifdef ENABLE_KDE_SUPPORT @@ -89,10 +89,10 @@ private Q_SLOTS: private: QString saveImg(const Job &job, const QImage &img, const QByteArray &raw); - QHash::Iterator findJob(const Job &job); + QHash::Iterator findJob(const Job &job); private: - QHash jobs; + QHash jobs; private: Thread *thread; diff --git a/models/onlineservicesmodel.cpp b/models/onlineservicesmodel.cpp index 1d23938dd..1b759a9b8 100644 --- a/models/onlineservicesmodel.cpp +++ b/models/onlineservicesmodel.cpp @@ -396,7 +396,7 @@ QImage OnlineServicesModel::requestImage(const QString &id, const QString &artis } if (url.endsWith(".jpg", Qt::CaseInsensitive) || url.endsWith(".jpeg", Qt::CaseInsensitive) || url.endsWith(".png", Qt::CaseInsensitive)) { // Need to download image... - NetworkJob *j=NetworkAccessManager::self()->getNew(QNetworkRequest(QUrl(url))); + NetworkJob *j=NetworkAccessManager::self()->get(QNetworkRequest(QUrl(url))); j->setProperty(constIdProperty, id); j->setProperty(constArtistProperty, artist); j->setProperty(constAlbumProperty, album); diff --git a/models/streamsearchmodel.cpp b/models/streamsearchmodel.cpp index e1ca62ba2..2e4efee14 100644 --- a/models/streamsearchmodel.cpp +++ b/models/streamsearchmodel.cpp @@ -29,7 +29,6 @@ #include "playqueuemodel.h" #include "networkaccessmanager.h" #include "stdactions.h" -#include #include #include #include @@ -192,7 +191,7 @@ void StreamSearchModel::fetchMore(const QModelIndex &index) StreamsModel::Item *item = toItem(index); if (item->isCategory() && !item->url.isEmpty()) { StreamsModel::CategoryItem *cat=static_cast(item); - QNetworkReply *job=NetworkAccessManager::self()->get(cat->url); + NetworkJob *job=NetworkAccessManager::self()->get(cat->url); if (jobs.isEmpty()) { emit loading(); } @@ -320,7 +319,7 @@ void StreamSearchModel::search(const QString &searchTerm, bool stationsOnly) #if QT_VERSION >= 0x050000 searchUrl.setQuery(query); #endif - QNetworkReply *job=NetworkAccessManager::self()->get(searchUrl); + NetworkJob *job=NetworkAccessManager::self()->get(searchUrl); if (jobs.isEmpty()) { emit loading(); } @@ -331,8 +330,8 @@ void StreamSearchModel::search(const QString &searchTerm, bool stationsOnly) void StreamSearchModel::cancelAll() { if (!jobs.isEmpty()) { - QList jobList=jobs.keys(); - foreach (QNetworkReply *j, jobList) { + QList jobList=jobs.keys(); + foreach (NetworkJob *j, jobList) { j->abort(); j->deleteLater(); disconnect(j, SIGNAL(finished()), this, SLOT(jobFinished())); @@ -353,7 +352,7 @@ void StreamSearchModel::setCat(Category c) void StreamSearchModel::jobFinished() { - QNetworkReply *job=dynamic_cast(sender()); + NetworkJob *job=dynamic_cast(sender()); if (!job) { return; @@ -366,10 +365,10 @@ void StreamSearchModel::jobFinished() jobs.remove(job); QModelIndex index=cat==root ? QModelIndex() : createIndex(cat->parent->children.indexOf(cat), 0, (void *)cat); - if (QNetworkReply::NoError==job->error()) { + if (job->ok()) { QList newItems=TuneIn==category - ? StreamsModel::parseRadioTimeResponse(job, cat, true) - : StreamsModel::parseShoutCastSearchResponse(job, cat); + ? StreamsModel::parseRadioTimeResponse(job->actualJob(), cat, true) + : StreamsModel::parseShoutCastSearchResponse(job->actualJob(), cat); if (!newItems.isEmpty()) { beginInsertRows(index, cat->children.count(), (cat->children.count()+newItems.count())-1); cat->children+=newItems; diff --git a/models/streamsearchmodel.h b/models/streamsearchmodel.h index e66f417b6..b445d9765 100644 --- a/models/streamsearchmodel.h +++ b/models/streamsearchmodel.h @@ -30,7 +30,7 @@ #include #include -class QNetworkReply; +class NetworkJob; class QXmlStreamReader; class QIODevice; @@ -86,7 +86,7 @@ private: private: Category category; - QMap jobs; + QMap jobs; StreamsModel::CategoryItem *root; QString currentSearch; diff --git a/models/streamsmodel.cpp b/models/streamsmodel.cpp index ea20027a9..2b312d7ae 100644 --- a/models/streamsmodel.cpp +++ b/models/streamsmodel.cpp @@ -747,7 +747,7 @@ void StreamsModel::fetchMore(const QModelIndex &index) } cat->addHeaders(req); - QNetworkReply *job=NetworkAccessManager::self()->get(req); + NetworkJob *job=NetworkAccessManager::self()->get(req); job->setProperty(constOrigUrlProperty, cat->url); if (jobs.isEmpty()) { emit loading(); @@ -1118,7 +1118,7 @@ bool StreamsModel::loadCache(CategoryItem *cat) void StreamsModel::jobFinished() { - QNetworkReply *job=dynamic_cast(sender()); + NetworkJob *job=dynamic_cast(sender()); if (!job) { return; @@ -1132,24 +1132,24 @@ void StreamsModel::jobFinished() jobs.remove(job); QModelIndex index=createIndex(cat->parent->children.indexOf(cat), 0, (void *)cat); - if (QNetworkReply::NoError==job->error()) { + if (job->ok()) { QList newItems; if (cat==favourites) { - newItems=favourites->loadXml(job); + newItems=favourites->loadXml(job->actualJob()); } else if (QLatin1String("http")==job->url().scheme()) { QString url=job->url().toString(); if (constRadioTimeHost==job->url().host()) { - newItems=parseRadioTimeResponse(job, cat); + newItems=parseRadioTimeResponse(job->actualJob(), cat); } else if (constIceCastUrl==url) { - newItems=parseIceCastResponse(job, cat); + newItems=parseIceCastResponse(job->actualJob(), cat); } else if (constSomaFMUrl==url) { - newItems=parseSomaFmResponse(job, cat); + newItems=parseSomaFmResponse(job->actualJob(), cat); } else if (constDiChannelListHost==job->url().host()) { - newItems=parseDigitallyImportedResponse(job, cat); + newItems=parseDigitallyImportedResponse(job->actualJob(), cat); } else if (constShoutCastHost==job->url().host()) { - newItems=parseShoutCastResponse(job, cat, job->property(constOrigUrlProperty).toString()); + newItems=parseShoutCastResponse(job->actualJob(), cat, job->property(constOrigUrlProperty).toString()); } else { - newItems=parseListenLiveResponse(job, cat); + newItems=parseListenLiveResponse(job->actualJob(), cat); } } @@ -1680,7 +1680,7 @@ QList StreamsModel::parseShoutCastResponse(QIODevice *dev, QNetworkRequest req(url); cat->addHeaders(req); - QNetworkReply *job=NetworkAccessManager::self()->get(req); + NetworkJob *job=NetworkAccessManager::self()->get(req); job->setProperty(constOrigUrlProperty, url.toString()); if (jobs.isEmpty()) { emit loading(); diff --git a/models/streamsmodel.h b/models/streamsmodel.h index 3f4604b0e..fc22f11cc 100644 --- a/models/streamsmodel.h +++ b/models/streamsmodel.h @@ -31,7 +31,7 @@ #include #include -class QNetworkReply; +class NetworkJob; class QNetworkRequest; class QXmlStreamReader; class QIODevice; @@ -264,7 +264,7 @@ private: void buildXml(); private: - QMap jobs; + QMap jobs; CategoryItem *root; CategoryItem *favourites; CategoryItem *tuneIn; diff --git a/network/networkaccessmanager.cpp b/network/networkaccessmanager.cpp index 2850616d3..1c2a503b1 100644 --- a/network/networkaccessmanager.cpp +++ b/network/networkaccessmanager.cpp @@ -66,13 +66,6 @@ void NetworkJob::jobFinished() emit finished(); } -void NetworkJob::abort() -{ - if (job) { - job->abort(); - } -} - NetworkAccessManager * NetworkAccessManager::self() { #ifdef ENABLE_KDE_SUPPORT @@ -91,9 +84,9 @@ NetworkAccessManager::NetworkAccessManager(QObject *parent) { } -QNetworkReply * NetworkAccessManager::get(const QNetworkRequest &req, int timeout) +NetworkJob * NetworkAccessManager::get(const QNetworkRequest &req, int timeout) { - QNetworkReply *reply=BASE_NETWORK_ACCESS_MANAGER::get(req); + NetworkJob *reply = new NetworkJob(BASE_NETWORK_ACCESS_MANAGER::get(req)); if (0!=timeout) { connect(reply, SIGNAL(destroyed()), SLOT(replyFinished())); @@ -103,40 +96,18 @@ QNetworkReply * NetworkAccessManager::get(const QNetworkRequest &req, int timeou return reply; } -NetworkJob * NetworkAccessManager::getNew(const QNetworkRequest &req, int timeout) -{ - NetworkJob *reply = new NetworkJob(BASE_NETWORK_ACCESS_MANAGER::get(req)); - - if (0!=timeout) { - connect(reply, SIGNAL(destroyed()), SLOT(replyFinished())); - connect(reply, SIGNAL(finished()), SLOT(replyFinished())); - newTimers[reply] = startTimer(timeout); - } - return reply; -} - void NetworkAccessManager::replyFinished() { - QNetworkReply *reply = qobject_cast(sender()); - if (timers.contains(reply)) { - killTimer(timers.take(reply)); - } - - NetworkJob *newReply = qobject_cast(sender()); - if (newTimers.contains(newReply)) { - killTimer(newTimers.take(newReply)); + NetworkJob *job = qobject_cast(sender()); + if (timers.contains(job)) { + killTimer(timers.take(job)); } } void NetworkAccessManager::timerEvent(QTimerEvent *e) { - QNetworkReply *reply = timers.key(e->timerId()); - if (reply) { - reply->abort(); - } - - NetworkJob *newReply = newTimers.key(e->timerId()); - if (newReply) { - newReply->abort(); + NetworkJob *job = timers.key(e->timerId()); + if (job) { + job->abort(); } } diff --git a/network/networkaccessmanager.h b/network/networkaccessmanager.h index 668035a14..130d3e913 100644 --- a/network/networkaccessmanager.h +++ b/network/networkaccessmanager.h @@ -48,13 +48,16 @@ public: QNetworkReply * actualJob() const { return job; } - void abort(); + void abort() { if (job) job->abort(); } + bool open(QIODevice::OpenMode mode) { return job && job->open(mode); } + void close() { if (job) job->close(); } QUrl url() const { return job ? job->url() : QUrl(); } QNetworkReply::NetworkError error() const { return job ? job->error() : QNetworkReply::NoError; } QString errorString() const { return job ? job->errorString() : QString(); } QByteArray readAll() { return job ? job->readAll() : QByteArray(); } bool ok() const { return job && QNetworkReply::NoError==job->error(); } + QVariant attribute(QNetworkRequest::Attribute code) const { return job ? job->attribute(code) : QVariant(); } Q_SIGNALS: void finished(); @@ -77,11 +80,8 @@ public: NetworkAccessManager(QObject *parent=0); virtual ~NetworkAccessManager() { } - QNetworkReply * get(const QNetworkRequest &req, int timeout=0); - QNetworkReply * get(const QUrl &url, int timeout=0) { return get(QNetworkRequest(url), timeout); } - - NetworkJob * getNew(const QNetworkRequest &req, int timeout=0); - NetworkJob * getNew(const QUrl &url, int timeout=0) { return getNew(QNetworkRequest(url), timeout); } + NetworkJob * get(const QNetworkRequest &req, int timeout=0); + NetworkJob * get(const QUrl &url, int timeout=0) { return get(QNetworkRequest(url), timeout); } protected: void timerEvent(QTimerEvent *e); @@ -90,8 +90,7 @@ private Q_SLOTS: void replyFinished(); private: - QMap timers; - QMap newTimers; + QMap timers; friend class NetworkJob; }; diff --git a/online/onlinedevice.cpp b/online/onlinedevice.cpp index c8abe9764..c58872236 100644 --- a/online/onlinedevice.cpp +++ b/online/onlinedevice.cpp @@ -27,8 +27,6 @@ #include "networkaccessmanager.h" #include -static const int constMaxRedirects=5; - void OnlineDevice::copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover) { Q_UNUSED(copyCover) @@ -42,7 +40,6 @@ void OnlineDevice::copySongTo(const Song &s, const QString &baseDir, const QStri overWrite=overWrite; lastProg=-1; - redirects=0; currentMpdDir=baseDir; currentDestFile=baseDir+musicPath; @@ -59,7 +56,7 @@ void OnlineDevice::copySongTo(const Song &s, const QString &baseDir, const QStri void OnlineDevice::downloadFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (!reply) { return; } @@ -70,29 +67,17 @@ void OnlineDevice::downloadFinished() return; } - if (QNetworkReply::NoError==reply->error()) { - QVariant redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); + if (reply->ok()) { + if (overWrite && QFile::exists(currentDestFile)) { + QFile::remove(currentDestFile); + } - if (redirect.isValid()) { - if (++redirects >= constMaxRedirects) { - emit actionStatus(TooManyRedirects); - } else { - job=NetworkAccessManager::self()->get(QUrl(redirect.toUrl())); - connect(job, SIGNAL(finished()), SLOT(downloadFinished())); - connect(job, SIGNAL(downloadProgress(qint64,qint64)), SLOT(downloadProgress(qint64,qint64))); - } + QFile f(currentDestFile); + if (f.open(QIODevice::WriteOnly)) { + f.write(reply->readAll()); + emit actionStatus(Ok); } else { - if (overWrite && QFile::exists(currentDestFile)) { - QFile::remove(currentDestFile); - } - - QFile f(currentDestFile); - if (f.open(QIODevice::WriteOnly)) { - f.write(reply->readAll()); - emit actionStatus(Ok); - } else { - emit actionStatus(WriteFailed); - } + emit actionStatus(WriteFailed); } } else { emit actionStatus(DownloadFailed); diff --git a/online/onlinedevice.h b/online/onlinedevice.h index 73b3fb510..e84abe99a 100644 --- a/online/onlinedevice.h +++ b/online/onlinedevice.h @@ -27,13 +27,13 @@ #include "device.h" #include "song.h" -class QNetworkReply; +class NetworkJob; class OnlineDevice : public Device { Q_OBJECT public: - OnlineDevice() : Device(0, QString(), QString()), lastProg(-1), redirects(0), job(0) { } + OnlineDevice() : Device(0, QString(), QString()), lastProg(-1), job(0) { } virtual ~OnlineDevice() { } bool isConnected() const { return true; } @@ -57,9 +57,8 @@ private Q_SLOTS: private: int lastProg; - int redirects; bool overWrite; - QNetworkReply *job; + NetworkJob *job; }; #endif diff --git a/online/onlineservice.cpp b/online/onlineservice.cpp index c82fc8a04..02413d80d 100644 --- a/online/onlineservice.cpp +++ b/online/onlineservice.cpp @@ -117,7 +117,7 @@ void OnlineMusicLoader::fixLibrary() void OnlineMusicLoader::downloadFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (!reply) { return; } @@ -128,9 +128,9 @@ void OnlineMusicLoader::downloadFinished() return; } - if(QNetworkReply::NoError==reply->error()) { + if (reply->ok()) { emit status(i18n("Parsing response"), -100); - QtIOCompressor comp(reply); + QtIOCompressor comp(reply->actualJob()); comp.setStreamFormat(QtIOCompressor::GzipFormat); if (comp.open(QIODevice::ReadOnly)) { QXmlStreamReader reader; diff --git a/online/onlineservice.h b/online/onlineservice.h index 09036cd21..68d9b09d7 100644 --- a/online/onlineservice.h +++ b/online/onlineservice.h @@ -34,7 +34,7 @@ class Thread; class NetworkAccessManager; class MusicModel; -class QNetworkReply; +class NetworkJob; class QXmlStreamReader; class OnlineMusicLoader : public QObject, public MusicLibraryProgressMonitor @@ -78,7 +78,7 @@ protected: QString cache; MusicLibraryItemRoot *library; NetworkAccessManager *network; - QNetworkReply *downloadJob; + NetworkJob *downloadJob; bool stopRequested; int lastProg; }; diff --git a/online/podcastservice.cpp b/online/podcastservice.cpp index 89a10774a..814662525 100644 --- a/online/podcastservice.cpp +++ b/online/podcastservice.cpp @@ -319,7 +319,7 @@ bool PodcastService::processingUrl(const QUrl &url) void PodcastService::addUrl(const QUrl &url, bool isNew) { setBusy(true); - NetworkJob *job=NetworkAccessManager::self()->getNew(QUrl(url)); + NetworkJob *job=NetworkAccessManager::self()->get(QUrl(url)); connect(job, SIGNAL(finished()), this, SLOT(jobFinished())); job->setProperty(constNewFeedProperty, isNew); jobs.append(job); diff --git a/online/soundcloudservice.cpp b/online/soundcloudservice.cpp index e8184ebe6..8fb26238f 100644 --- a/online/soundcloudservice.cpp +++ b/online/soundcloudservice.cpp @@ -103,7 +103,7 @@ void SoundCloudService::cancelAll() void SoundCloudService::jobFinished() { - QNetworkReply *j=dynamic_cast(sender()); + NetworkJob *j=dynamic_cast(sender()); if (!j || j!=job) { return; } @@ -114,7 +114,7 @@ void SoundCloudService::jobFinished() #ifdef Q_OS_WIN QVariant result = parser.parse(j->readAll()); #else - QVariant result = parser.parse(j); + QVariant result = parser.parse(j->actualJob()); #endif if (result.isValid()) { QVariantList list = result.toList(); diff --git a/online/soundcloudservice.h b/online/soundcloudservice.h index 46ac9aef9..fec75f2fd 100644 --- a/online/soundcloudservice.h +++ b/online/soundcloudservice.h @@ -27,6 +27,7 @@ #include "onlineservice.h" #include +class NetworkJob; class SoundCloudService : public OnlineService { Q_OBJECT @@ -58,7 +59,7 @@ private Q_SLOTS: void jobFinished(); private: - QNetworkReply *job; + NetworkJob *job; QString currentSearch; }; diff --git a/streams/streamfetcher.cpp b/streams/streamfetcher.cpp index dc89ec84c..a1a9c94af 100644 --- a/streams/streamfetcher.cpp +++ b/streams/streamfetcher.cpp @@ -249,7 +249,7 @@ void StreamFetcher::dataReady() data+=job->readAll(); if (data.count()>constMaxData) { - QNetworkReply *thisJob=job; + NetworkJob *thisJob=job; disconnect(thisJob, SIGNAL(readyRead()), this, SLOT(dataReady())); disconnect(thisJob, SIGNAL(finished()), this, SLOT(jobFinished())); jobFinished(thisJob); @@ -260,45 +260,34 @@ void StreamFetcher::dataReady() void StreamFetcher::jobFinished() { - QNetworkReply *reply=qobject_cast(sender()); + NetworkJob *reply=qobject_cast(sender()); if (reply) { jobFinished(reply); } } -void StreamFetcher::jobFinished(QNetworkReply *reply) +void StreamFetcher::jobFinished(NetworkJob *reply) { // We only handle 1 job at a time! if (reply==job) { bool redirected=false; if (!reply->error()) { - QVariant redirect = reply->header(QNetworkRequest::LocationHeader); - if (redirect.isValid() && ++redirectsget(current, constTimeout); + job=NetworkAccessManager::self()->get(u, constTimeout); connect(job, SIGNAL(readyRead()), this, SLOT(dataReady())); connect(job, SIGNAL(finished()), this, SLOT(jobFinished())); redirected=true; } else { - QString u=parse(data); - if (u.isEmpty() || u==current) { - DBUG << "use (empty/current)" << current; - done.append(MPDParseUtils::addStreamName(current.startsWith(StreamsModel::constPrefix) ? current.mid(StreamsModel::constPrefix.length()) : current, currentName)); - } else if (u.startsWith(QLatin1String("http://")) && ++redirectsget(u, constTimeout); - connect(job, SIGNAL(readyRead()), this, SLOT(dataReady())); - connect(job, SIGNAL(finished()), this, SLOT(jobFinished())); - redirected=true; - } else { - DBUG << "use" << u; - done.append(MPDParseUtils::addStreamName(u, currentName)); - } + DBUG << "use" << u; + done.append(MPDParseUtils::addStreamName(u, currentName)); } } else { DBUG << "error " << reply->errorString() << " - use" << current; diff --git a/streams/streamfetcher.h b/streams/streamfetcher.h index 5f39993a2..b2737dcd6 100644 --- a/streams/streamfetcher.h +++ b/streams/streamfetcher.h @@ -29,7 +29,7 @@ #include #include -class QNetworkReply; +class NetworkJob; class StreamFetcher : public QObject { @@ -58,10 +58,10 @@ private Q_SLOTS: void jobFinished(); private: - void jobFinished(QNetworkReply *reply); + void jobFinished(NetworkJob *reply); private: - QNetworkReply *job; + NetworkJob *job; QString current; QString currentName; QStringList todo;