diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 76524cb7f..a2c23b984 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,7 +47,7 @@ set(SOURCES core/gnomeglobalshortcutbackend.cpp core/mergedproxymodel.cpp core/musicstorage.cpp - core/networkaccessmanager.cpp + core/network.cpp core/organise.cpp core/organiseformat.cpp core/player.cpp @@ -211,7 +211,7 @@ set(HEADERS core/globalshortcuts.h core/gnomeglobalshortcutbackend.h core/mergedproxymodel.h - core/networkaccessmanager.h + core/network.h core/organise.h core/player.h core/songloader.h diff --git a/src/core/albumcoverfetcher.cpp b/src/core/albumcoverfetcher.cpp index 6f79316c9..88badf77b 100644 --- a/src/core/albumcoverfetcher.cpp +++ b/src/core/albumcoverfetcher.cpp @@ -15,7 +15,7 @@ */ #include "albumcoverfetcher.h" -#include "networkaccessmanager.h" +#include "network.h" #include #include @@ -26,9 +26,9 @@ const int AlbumCoverFetcher::kMaxConcurrentRequests = 5; -AlbumCoverFetcher::AlbumCoverFetcher(NetworkAccessManager* network, QObject* parent) +AlbumCoverFetcher::AlbumCoverFetcher(QObject* parent) : QObject(parent), - network_(network->network()), + network_(new NetworkAccessManager(this)), next_id_(0), request_starter_(new QTimer(this)) { diff --git a/src/core/albumcoverfetcher.h b/src/core/albumcoverfetcher.h index a960195f3..0fdd2f371 100644 --- a/src/core/albumcoverfetcher.h +++ b/src/core/albumcoverfetcher.h @@ -30,13 +30,11 @@ class QNetworkReply; class QString; -class NetworkAccessManager; - class AlbumCoverFetcher : public QObject { Q_OBJECT public: - AlbumCoverFetcher(NetworkAccessManager* network, QObject* parent = 0); + AlbumCoverFetcher(QObject* parent = 0); virtual ~AlbumCoverFetcher() {} struct SearchResult { diff --git a/src/core/albumcoverloader.cpp b/src/core/albumcoverloader.cpp index d51a63606..2eb947206 100644 --- a/src/core/albumcoverloader.cpp +++ b/src/core/albumcoverloader.cpp @@ -15,7 +15,7 @@ */ #include "albumcoverloader.h" -#include "networkaccessmanager.h" +#include "network.h" #include #include @@ -37,7 +37,7 @@ AlbumCoverLoader::AlbumCoverLoader(QObject* parent) height_(120), padding_(true), next_id_(0), - network_(NULL) + network_(new NetworkAccessManager(this)) { } @@ -137,9 +137,10 @@ AlbumCoverLoader::TryLoadResult AlbumCoverLoader::TryLoadImage( } if (filename.toLower().startsWith("http://")) { - network_->Get(QUrl(filename), this, "RemoteFetchFinished", task.id, true); + QNetworkReply* reply = network_->get(QNetworkRequest(filename)); + connect(reply, SIGNAL(finished()), SLOT(RemoteFetchFinished())); - remote_tasks_.insert(task.id, task); + remote_tasks_.insert(reply, task); return TryLoadResult(true, false, QImage()); } @@ -171,8 +172,12 @@ QImage AlbumCoverLoader::LoadFromTaglib(const QString& filename) const { return ret; } -void AlbumCoverLoader::RemoteFetchFinished(quint64 id, QNetworkReply* reply) { - Task task = remote_tasks_.take(id); +void AlbumCoverLoader::RemoteFetchFinished() { + QNetworkReply* reply = qobject_cast(sender()); + if (!reply) + return; + + Task task = remote_tasks_.take(reply); if (reply->error() == QNetworkReply::NoError) { // Try to load the image diff --git a/src/core/albumcoverloader.h b/src/core/albumcoverloader.h index 76116feef..13135c645 100644 --- a/src/core/albumcoverloader.h +++ b/src/core/albumcoverloader.h @@ -34,7 +34,6 @@ class AlbumCoverLoader : public QObject { public: AlbumCoverLoader(QObject* parent = 0); - void SetNetwork(NetworkAccessManager* network) { network_ = network; } void Stop() { stop_requested_ = true; } @@ -63,7 +62,7 @@ class AlbumCoverLoader : public QObject { private slots: void ProcessTasks(); - void RemoteFetchFinished(quint64 id, QNetworkReply* reply); + void RemoteFetchFinished(); private: enum State { @@ -103,7 +102,7 @@ class AlbumCoverLoader : public QObject { QMutex mutex_; QQueue tasks_; - QMap remote_tasks_; + QMap remote_tasks_; quint64 next_id_; NetworkAccessManager* network_; diff --git a/src/core/network.cpp b/src/core/network.cpp new file mode 100644 index 000000000..1a3b6a727 --- /dev/null +++ b/src/core/network.cpp @@ -0,0 +1,94 @@ +/* This file is part of Clementine. + + Clementine is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Clementine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Clementine. If not, see . +*/ + +#include "network.h" + +#include +#include +#include +#include + +QMutex ThreadSafeNetworkDiskCache::sMutex; +QNetworkDiskCache* ThreadSafeNetworkDiskCache::sCache = NULL; + + +ThreadSafeNetworkDiskCache::ThreadSafeNetworkDiskCache(QObject* parent) { + QMutexLocker l(&sMutex); + if (!sCache) { + sCache = new QNetworkDiskCache; + sCache->setCacheDirectory(QString("%1/.config/%2/networkcache/") + .arg(QDir::homePath(), QCoreApplication::organizationName())); + } +} + +qint64 ThreadSafeNetworkDiskCache::cacheSize() const { + QMutexLocker l(&sMutex); + return sCache->cacheSize(); +} + +QIODevice* ThreadSafeNetworkDiskCache::data(const QUrl& url) { + QMutexLocker l(&sMutex); + return sCache->data(url); +} + +void ThreadSafeNetworkDiskCache::insert(QIODevice* device) { + QMutexLocker l(&sMutex); + sCache->insert(device); +} + +QNetworkCacheMetaData ThreadSafeNetworkDiskCache::metaData(const QUrl& url) { + QMutexLocker l(&sMutex); + return sCache->metaData(url); +} + +QIODevice* ThreadSafeNetworkDiskCache::prepare(const QNetworkCacheMetaData& metaData) { + QMutexLocker l(&sMutex); + return sCache->prepare(metaData); +} + +bool ThreadSafeNetworkDiskCache::remove(const QUrl& url) { + QMutexLocker l(&sMutex); + return sCache->remove(url); +} + +void ThreadSafeNetworkDiskCache::updateMetaData(const QNetworkCacheMetaData& metaData) { + QMutexLocker l(&sMutex); + sCache->updateMetaData(metaData); +} + +void ThreadSafeNetworkDiskCache::clear() { + QMutexLocker l(&sMutex); + sCache->clear(); +} + + +NetworkAccessManager::NetworkAccessManager(QObject* parent) + : QNetworkAccessManager(parent) +{ + setCache(new ThreadSafeNetworkDiskCache(this)); +} + +QNetworkReply* NetworkAccessManager::createRequest( + Operation op, const QNetworkRequest& request, QIODevice* outgoingData) { + QNetworkRequest new_request(request); + new_request.setRawHeader("User-Agent", QString("%1 %2").arg( + QCoreApplication::applicationName(), + QCoreApplication::applicationVersion()).toUtf8()); + new_request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, + QNetworkRequest::PreferCache); + + return QNetworkAccessManager::createRequest(op, new_request, outgoingData); +} diff --git a/src/core/network.h b/src/core/network.h new file mode 100644 index 000000000..ce32c05ee --- /dev/null +++ b/src/core/network.h @@ -0,0 +1,56 @@ +/* This file is part of Clementine. + + Clementine is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Clementine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Clementine. If not, see . +*/ + +#ifndef NETWORK_H +#define NETWORK_H + +#include +#include +#include + +class QNetworkDiskCache; + +class ThreadSafeNetworkDiskCache : public QAbstractNetworkCache { +public: + ThreadSafeNetworkDiskCache(QObject* parent); + + qint64 cacheSize() const; + QIODevice* data(const QUrl& url); + void insert(QIODevice* device); + QNetworkCacheMetaData metaData(const QUrl& url); + QIODevice* prepare(const QNetworkCacheMetaData& metaData); + bool remove(const QUrl& url); + void updateMetaData(const QNetworkCacheMetaData& metaData); + + void clear(); + +private: + static QMutex sMutex; + static QNetworkDiskCache* sCache; +}; + +class NetworkAccessManager : public QNetworkAccessManager { + Q_OBJECT + +public: + NetworkAccessManager(QObject* parent = 0); + +protected: + QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, + QIODevice* outgoingData); +}; + +#endif // NETWORK_H diff --git a/src/core/networkaccessmanager.cpp b/src/core/networkaccessmanager.cpp deleted file mode 100644 index 34f4bcea9..000000000 --- a/src/core/networkaccessmanager.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "networkaccessmanager.h" - -#include -#include -#include -#include -#include -#include - -#include - -NetworkAccessManager::NetworkAccessManager(QObject* parent, - QNetworkAccessManager* injected) - : QObject(parent), - network_(injected ? injected : new QNetworkAccessManager(this)), - cache_(new QNetworkDiskCache(this)) -{ - cache_->setCacheDirectory(QString("%1/.config/%2/networkcache/") - .arg(QDir::homePath(), QCoreApplication::organizationName())); - network_->setCache(cache_); -} - -void NetworkAccessManager::Get(const QUrl &url, QObject *receiver, - const char *slot, quint64 id, bool force_cache) { - connect(receiver, SIGNAL(destroyed(QObject*)), SLOT(ReceiverDestroyed(QObject*))); - QMetaObject::invokeMethod( - this, "RunGet", Qt::QueuedConnection, - Q_ARG(QUrl, url), Q_ARG(QObject*, receiver), - Q_ARG(const char*, slot), - Q_ARG(quint64, id), Q_ARG(bool, force_cache)); -} - -void NetworkAccessManager::RunGet(const QUrl &url, QObject *receiver, - const char *slot, quint64 id, bool force_cache) { - QNetworkRequest req = CreateRequest(url, force_cache); - QNetworkReply* reply = network_->get(req); - connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); - - Receiver r; - r.receiver = receiver; - r.slot = slot; - r.id = id; - - pending_replies_.insert(reply, r); -} - -void NetworkAccessManager::ReceiverDestroyed(QObject* receiver) { - foreach (QNetworkReply* key, pending_replies_.keys()) { - if (pending_replies_[key].receiver == receiver) - pending_replies_[key].receiver = NULL; - } -} - -QNetworkRequest NetworkAccessManager::CreateRequest(const QUrl& url, bool force_cache) { - QNetworkRequest req(url); - req.setRawHeader("User-Agent", QString("%1 %2").arg( - QCoreApplication::applicationName(), - QCoreApplication::applicationVersion()).toUtf8()); - - if (force_cache) { - req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, - QNetworkRequest::PreferCache); - } - return req; -} - -void NetworkAccessManager::RequestFinished() { - QNetworkReply* reply = static_cast(sender()); - Receiver r = pending_replies_.take(reply); - - if (!r.receiver) - return; - - QMetaObject::invokeMethod(r.receiver, r.slot, - Q_ARG(quint64, r.id), - Q_ARG(QNetworkReply*, reply)); -} diff --git a/src/core/networkaccessmanager.h b/src/core/networkaccessmanager.h deleted file mode 100644 index c214842a6..000000000 --- a/src/core/networkaccessmanager.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef NETWORKACCESSMANAGER_H -#define NETWORKACCESSMANAGER_H - -#include -#include - -class QNetworkAccessManager; -class QNetworkDiskCache; -class QNetworkReply; -class QNetworkRequest; -class QUrl; - -// It's like QNetworkAccessManager, but threadsafe, and sets our User-Agent -// on all requests -class NetworkAccessManager : public QObject { - Q_OBJECT - - public: - NetworkAccessManager(QObject* parent = 0, QNetworkAccessManager* injected = 0); - - // Only use this from the main thread - QNetworkAccessManager* network() const { return network_; } - - // Thread-safe. slot should take (quint64, QNetworkReply*) - void Get(const QUrl& url, QObject* receiver, const char* slot, - quint64 id, bool force_cache = false); - - private slots: - void RunGet(const QUrl& url, QObject* receiver, const char* slot, - quint64 id, bool force_cache); - void RequestFinished(); - void ReceiverDestroyed(QObject* receiver); - - private: - QNetworkRequest CreateRequest(const QUrl& url, bool force_cache); - - QNetworkAccessManager* network_; - QNetworkDiskCache* cache_; - - struct Receiver { - QObject* receiver; - const char* slot; - quint64 id; - }; - - QMap pending_replies_; -}; - -#endif // NETWORKACCESSMANAGER_H diff --git a/src/main.cpp b/src/main.cpp index fc15546d2..e7462160f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,7 +24,7 @@ #include "core/commandlineoptions.h" #include "core/encoding.h" #include "core/mac_startup.h" -#include "core/networkaccessmanager.h" +#include "core/network.h" #include "core/player.h" #include "core/potranslator.h" #include "core/song.h" @@ -198,10 +198,8 @@ int main(int argc, char *argv[]) { // Icons IconLoader::Init(); - NetworkAccessManager network; - Echonest::Config::instance()->setAPIKey("DFLFLJBUF4EGTXHIG"); - Echonest::Config::instance()->setNetworkAccessManager(network.network()); + Echonest::Config::instance()->setNetworkAccessManager(new NetworkAccessManager); // MPRIS DBus interface. #ifdef Q_WS_X11 @@ -216,7 +214,7 @@ int main(int argc, char *argv[]) { srand(time(NULL)); // Window - MainWindow w(&network, options.engine()); + MainWindow w(options.engine()); QObject::connect(&a, SIGNAL(messageReceived(QByteArray)), &w, SLOT(CommandlineOptionsReceived(QByteArray))); w.CommandlineOptionsReceived(options); diff --git a/src/radio/lastfmservice.cpp b/src/radio/lastfmservice.cpp index 2857850de..000f3027c 100644 --- a/src/radio/lastfmservice.cpp +++ b/src/radio/lastfmservice.cpp @@ -19,7 +19,6 @@ #include "lastfmstationdialog.h" #include "radiomodel.h" #include "radioplaylistitem.h" -#include "core/networkaccessmanager.h" #include "core/song.h" #include "core/taskmanager.h" #include "ui/iconloader.h" @@ -63,8 +62,7 @@ LastFMService::LastFMService(RadioModel* parent) tag_list_(NULL), custom_list_(NULL), friends_list_(NULL), - neighbours_list_(NULL), - network_(parent->network()->network()) + neighbours_list_(NULL) { ReloadSettings(); diff --git a/src/radio/lastfmservice.h b/src/radio/lastfmservice.h index 1ed867092..b37aeae2f 100644 --- a/src/radio/lastfmservice.h +++ b/src/radio/lastfmservice.h @@ -185,7 +185,6 @@ class LastFMService : public RadioService { RadioItem* friends_list_; RadioItem* neighbours_list_; - QNetworkAccessManager* network_; QHash art_urls_; }; diff --git a/src/radio/magnatunedownloaddialog.cpp b/src/radio/magnatunedownloaddialog.cpp index 5bd2579e9..3295c9402 100644 --- a/src/radio/magnatunedownloaddialog.cpp +++ b/src/radio/magnatunedownloaddialog.cpp @@ -18,7 +18,7 @@ #include "magnatuneservice.h" #include "radiomodel.h" #include "ui_magnatunedownloaddialog.h" -#include "core/networkaccessmanager.h" +#include "core/network.h" #include "widgets/progressitemdelegate.h" #include @@ -37,7 +37,7 @@ MagnatuneDownloadDialog::MagnatuneDownloadDialog(MagnatuneService* service, : QDialog(parent), ui_(new Ui_MagnatuneDownloadDialog), service_(service), - network_(service_->model()->network()->network()), + network_(new NetworkAccessManager(this)), current_reply_(NULL), next_row_(0) { @@ -122,8 +122,7 @@ void MagnatuneDownloadDialog::DownloadNext() { url.addQueryItem("id", MagnatuneService::kPartnerId); url.addQueryItem("sku", sku); - QNetworkRequest req(url); - current_reply_ = network_->get(req); + current_reply_ = network_->get(QNetworkRequest(url)); connect(current_reply_, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(Error(QNetworkReply::NetworkError))); connect(current_reply_, SIGNAL(finished()), SLOT(MetadataFinished())); @@ -183,8 +182,7 @@ void MagnatuneDownloadDialog::MetadataFinished() { url.setPassword(service_->password()); // Start the actual download - QNetworkRequest req(url); - current_reply_ = network_->get(req); + current_reply_ = network_->get(QNetworkRequest(url)); connect(current_reply_, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(Error(QNetworkReply::NetworkError))); connect(current_reply_, SIGNAL(finished()), SLOT(DownloadFinished())); @@ -212,8 +210,7 @@ void MagnatuneDownloadDialog::DownloadFinished() { redirect.setUserName(service_->username()); redirect.setPassword(service_->password()); - QNetworkRequest req(redirect); - current_reply_ = network_->get(req); + current_reply_ = network_->get(QNetworkRequest(redirect)); connect(current_reply_, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(Error(QNetworkReply::NetworkError))); connect(current_reply_, SIGNAL(finished()), SLOT(DownloadFinished())); diff --git a/src/radio/magnatuneservice.cpp b/src/radio/magnatuneservice.cpp index df6156600..e975ea457 100644 --- a/src/radio/magnatuneservice.cpp +++ b/src/radio/magnatuneservice.cpp @@ -19,7 +19,7 @@ #include "magnatuneservice.h" #include "radiomodel.h" #include "core/mergedproxymodel.h" -#include "core/networkaccessmanager.h" +#include "core/network.h" #include "core/song.h" #include "core/taskmanager.h" #include "library/librarymodel.h" @@ -69,7 +69,7 @@ MagnatuneService::MagnatuneService(RadioModel* parent) membership_(Membership_None), format_(Format_Ogg), total_song_count_(0), - network_(parent->network()->network()) + network_(new NetworkAccessManager(this)) { ReloadSettings(); diff --git a/src/radio/radiomodel.cpp b/src/radio/radiomodel.cpp index 718b2a4c6..a7bb6da4a 100644 --- a/src/radio/radiomodel.cpp +++ b/src/radio/radiomodel.cpp @@ -29,12 +29,10 @@ QMap RadioModel::sServices; RadioModel::RadioModel(BackgroundThread* db_thread, - NetworkAccessManager* network, TaskManager* task_manager, - QObject* parent) + TaskManager* task_manager, QObject* parent) : SimpleTreeModel(new RadioItem(this), parent), db_thread_(db_thread), merged_model_(new MergedProxyModel(this)), - network_(network), task_manager_(task_manager) { Q_ASSERT(sServices.isEmpty()); diff --git a/src/radio/radiomodel.h b/src/radio/radiomodel.h index 9788102d4..e75d3d9db 100644 --- a/src/radio/radiomodel.h +++ b/src/radio/radiomodel.h @@ -28,7 +28,6 @@ class Database; class LastFMService; class MergedProxyModel; -class NetworkAccessManager; class RadioService; class SettingsDialog; class TaskManager; @@ -37,8 +36,7 @@ class RadioModel : public SimpleTreeModel { Q_OBJECT public: - RadioModel(BackgroundThread* db_thread, - NetworkAccessManager* network, TaskManager* task_manager, + RadioModel(BackgroundThread* db_thread, TaskManager* task_manager, QObject* parent = 0); enum { @@ -73,7 +71,6 @@ class RadioModel : public SimpleTreeModel { BackgroundThread* db_thread() const { return db_thread_; } MergedProxyModel* merged_model() const { return merged_model_; } - NetworkAccessManager* network() const { return network_; } TaskManager* task_manager() const { return task_manager_; } signals: @@ -96,7 +93,6 @@ class RadioModel : public SimpleTreeModel { static QMap sServices; BackgroundThread* db_thread_; MergedProxyModel* merged_model_; - NetworkAccessManager* network_; TaskManager* task_manager_; }; diff --git a/src/radio/somafmservice.cpp b/src/radio/somafmservice.cpp index bda276c68..0e362b656 100644 --- a/src/radio/somafmservice.cpp +++ b/src/radio/somafmservice.cpp @@ -16,11 +16,10 @@ #include "somafmservice.h" #include "radiomodel.h" -#include "core/networkaccessmanager.h" +#include "core/network.h" #include "core/taskmanager.h" #include "ui/iconloader.h" -#include #include #include #include @@ -41,7 +40,7 @@ SomaFMService::SomaFMService(RadioModel* parent) context_menu_(NULL), get_channels_task_id_(0), get_stream_task_id_(0), - network_(parent->network()->network()) + network_(new NetworkAccessManager(this)) { } diff --git a/src/songinfo/artistinfoview.cpp b/src/songinfo/artistinfoview.cpp index 9e14c9c1a..a0844eab4 100644 --- a/src/songinfo/artistinfoview.cpp +++ b/src/songinfo/artistinfoview.cpp @@ -22,8 +22,8 @@ #include "songinfofetcher.h" #include "widgets/prettyimageview.h" -ArtistInfoView::ArtistInfoView(NetworkAccessManager* network, QWidget *parent) - : SongInfoBase(network, parent) +ArtistInfoView::ArtistInfoView(QWidget *parent) + : SongInfoBase(parent) { fetcher_->AddProvider(new EchoNestBiographies); fetcher_->AddProvider(new EchoNestImages); @@ -48,7 +48,7 @@ void ArtistInfoView::ResultReady(int id, const SongInfoFetcher::Result& result) Clear(); // Image view goes at the top - PrettyImageView* image_view = new PrettyImageView(network_); + PrettyImageView* image_view = new PrettyImageView(this); AddWidget(image_view); foreach (const QUrl& url, result.images_) { diff --git a/src/songinfo/artistinfoview.h b/src/songinfo/artistinfoview.h index dd8a9d5e4..75ef329c9 100644 --- a/src/songinfo/artistinfoview.h +++ b/src/songinfo/artistinfoview.h @@ -32,7 +32,7 @@ class ArtistInfoView : public SongInfoBase { Q_OBJECT public: - ArtistInfoView(NetworkAccessManager* network, QWidget* parent = 0); + ArtistInfoView(QWidget* parent = 0); ~ArtistInfoView(); protected: diff --git a/src/songinfo/songinfobase.cpp b/src/songinfo/songinfobase.cpp index b5f7578cc..4904350e3 100644 --- a/src/songinfo/songinfobase.cpp +++ b/src/songinfo/songinfobase.cpp @@ -25,9 +25,8 @@ const char* SongInfoBase::kSettingsGroup = "SongInfo"; -SongInfoBase::SongInfoBase(NetworkAccessManager* network, QWidget* parent) +SongInfoBase::SongInfoBase(QWidget* parent) : QWidget(parent), - network_(network), fetcher_(new SongInfoFetcher(this)), current_request_id_(-1), scroll_area_(new QScrollArea), diff --git a/src/songinfo/songinfobase.h b/src/songinfo/songinfobase.h index bdd128b90..b313267b4 100644 --- a/src/songinfo/songinfobase.h +++ b/src/songinfo/songinfobase.h @@ -26,7 +26,6 @@ #include "widgets/widgetfadehelper.h" class CollapsibleInfoPane; -class NetworkAccessManager; class WidgetFadeHelper; class QScrollArea; @@ -36,7 +35,7 @@ class SongInfoBase : public QWidget { Q_OBJECT public: - SongInfoBase(NetworkAccessManager* network, QWidget* parent = 0); + SongInfoBase(QWidget* parent = 0); static const char* kSettingsGroup; @@ -64,7 +63,6 @@ protected slots: virtual void ResultReady(int id, const SongInfoFetcher::Result& result); protected: - NetworkAccessManager* network_; SongInfoFetcher* fetcher_; int current_request_id_; diff --git a/src/songinfo/songinfoview.cpp b/src/songinfo/songinfoview.cpp index 94d5b9252..80e193355 100644 --- a/src/songinfo/songinfoview.cpp +++ b/src/songinfo/songinfoview.cpp @@ -29,9 +29,9 @@ const char* SongInfoView::kSettingsGroup = "SongInfo"; typedef QList ProviderList; -SongInfoView::SongInfoView(NetworkAccessManager* network, QWidget* parent) - : SongInfoBase(network, parent), - ultimate_reader_(new UltimateLyricsReader(network)) +SongInfoView::SongInfoView(QWidget* parent) + : SongInfoBase(parent), + ultimate_reader_(new UltimateLyricsReader(this)) { // Parse the ultimate lyrics xml file in the background QFuture future = QtConcurrent::run( diff --git a/src/songinfo/songinfoview.h b/src/songinfo/songinfoview.h index 1b65ea649..6b6da8a48 100644 --- a/src/songinfo/songinfoview.h +++ b/src/songinfo/songinfoview.h @@ -28,7 +28,7 @@ class SongInfoView : public SongInfoBase { Q_OBJECT public: - SongInfoView(NetworkAccessManager* network, QWidget* parent = 0); + SongInfoView(QWidget* parent = 0); ~SongInfoView(); static const char* kSettingsGroup; diff --git a/src/songinfo/ultimatelyricsprovider.cpp b/src/songinfo/ultimatelyricsprovider.cpp index b973afffb..f191920c0 100644 --- a/src/songinfo/ultimatelyricsprovider.cpp +++ b/src/songinfo/ultimatelyricsprovider.cpp @@ -16,7 +16,7 @@ #include "songinfotextview.h" #include "ultimatelyricsprovider.h" -#include "core/networkaccessmanager.h" +#include "core/network.h" #include #include @@ -26,8 +26,8 @@ const int UltimateLyricsProvider::kRedirectLimit = 5; -UltimateLyricsProvider::UltimateLyricsProvider(NetworkAccessManager* network) - : network_(network), +UltimateLyricsProvider::UltimateLyricsProvider() + : network_(new NetworkAccessManager(this)), relevance_(0), redirect_count_(0) { @@ -57,10 +57,17 @@ void UltimateLyricsProvider::FetchInfo(int id, const Song& metadata) { // Fetch the URL, follow redirects redirect_count_ = 0; - network_->Get(url, this, "LyricsFetched", id); + QNetworkReply* reply = network_->get(QNetworkRequest(url)); + requests_[reply] = id; + connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); } -void UltimateLyricsProvider::LyricsFetched(quint64 id, QNetworkReply* reply) { +void UltimateLyricsProvider::LyricsFetched() { + QNetworkReply* reply = qobject_cast(sender()); + if (!reply) + return; + + int id = requests_.take(reply); reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { @@ -84,7 +91,9 @@ void UltimateLyricsProvider::LyricsFetched(quint64 id, QNetworkReply* reply) { } redirect_count_ ++; - network_->Get(target, this, "LyricsFetched", id); + QNetworkReply* reply = network_->get(QNetworkRequest(target)); + requests_[reply] = id; + connect(reply, SIGNAL(finished()), SLOT(LyricsFetched())); return; } diff --git a/src/songinfo/ultimatelyricsprovider.h b/src/songinfo/ultimatelyricsprovider.h index 1c45659bc..f3c0b524a 100644 --- a/src/songinfo/ultimatelyricsprovider.h +++ b/src/songinfo/ultimatelyricsprovider.h @@ -31,7 +31,7 @@ class UltimateLyricsProvider : public SongInfoProvider { Q_OBJECT public: - UltimateLyricsProvider(NetworkAccessManager* network); + UltimateLyricsProvider(); static const int kRedirectLimit; @@ -58,7 +58,7 @@ public: void FetchInfo(int id, const Song& metadata); private slots: - void LyricsFetched(quint64 id, QNetworkReply* reply); + void LyricsFetched(); private: void ApplyExtractRule(const Rule& rule, QString* content) const; @@ -74,6 +74,7 @@ private: private: NetworkAccessManager* network_; + QMap requests_; QString name_; QString title_; diff --git a/src/songinfo/ultimatelyricsreader.cpp b/src/songinfo/ultimatelyricsreader.cpp index fdb255c9f..227214b49 100644 --- a/src/songinfo/ultimatelyricsreader.cpp +++ b/src/songinfo/ultimatelyricsreader.cpp @@ -21,9 +21,8 @@ #include #include -UltimateLyricsReader::UltimateLyricsReader(NetworkAccessManager* network, QObject* parent) - : QObject(parent), - network_(network) +UltimateLyricsReader::UltimateLyricsReader(QObject* parent) + : QObject(parent) { } @@ -59,7 +58,7 @@ QList UltimateLyricsReader::ParseDevice(QIODevice* device) co SongInfoProvider* UltimateLyricsReader::ParseProvider(QXmlStreamReader* reader) const { QXmlStreamAttributes attributes = reader->attributes(); - UltimateLyricsProvider* scraper = new UltimateLyricsProvider(network_); + UltimateLyricsProvider* scraper = new UltimateLyricsProvider; scraper->set_name(attributes.value("name").toString()); scraper->set_title(attributes.value("title").toString()); scraper->set_charset(attributes.value("charset").toString()); diff --git a/src/songinfo/ultimatelyricsreader.h b/src/songinfo/ultimatelyricsreader.h index d7685dcd7..d82121d72 100644 --- a/src/songinfo/ultimatelyricsreader.h +++ b/src/songinfo/ultimatelyricsreader.h @@ -28,7 +28,7 @@ class UltimateLyricsReader : public QObject { Q_OBJECT public: - UltimateLyricsReader(NetworkAccessManager* network, QObject* parent = 0); + UltimateLyricsReader(QObject* parent = 0); QList Parse(const QString& filename) const; QList ParseDevice(QIODevice* device) const; @@ -37,9 +37,6 @@ private: SongInfoProvider* ParseProvider(QXmlStreamReader* reader) const; UltimateLyricsProvider::Rule ParseRule(QXmlStreamReader* reader) const; QString ParseInvalidIndicator(QXmlStreamReader* reader) const; - -private: - NetworkAccessManager* network_; }; #endif // ULTIMATELYRICSREADER_H diff --git a/src/ui/albumcovermanager.cpp b/src/ui/albumcovermanager.cpp index 20dcce9d2..9c11d7037 100644 --- a/src/ui/albumcovermanager.cpp +++ b/src/ui/albumcovermanager.cpp @@ -41,15 +41,13 @@ const char* AlbumCoverManager::kSettingsGroup = "CoverManager"; -AlbumCoverManager::AlbumCoverManager(NetworkAccessManager* network, - LibraryBackend* backend, QWidget *parent) +AlbumCoverManager::AlbumCoverManager(LibraryBackend* backend, QWidget *parent) : QMainWindow(parent), constructed_(false), ui_(new Ui_CoverManager), backend_(backend), - network_(network), cover_loader_(new BackgroundThreadImplementation(this)), - cover_fetcher_(new AlbumCoverFetcher(network, this)), + cover_fetcher_(new AlbumCoverFetcher(this)), cover_searcher_(new AlbumCoverSearcher(this)), artist_icon_(IconLoader::Load("x-clementine-artist")), all_artists_icon_(IconLoader::Load("x-clementine-album")), @@ -158,7 +156,6 @@ void AlbumCoverManager::Init() { } void AlbumCoverManager::CoverLoaderInitialised() { - cover_loader_->Worker()->SetNetwork(network_); cover_loader_->Worker()->SetDefaultOutputImage(QImage(":nocover.png")); connect(cover_loader_->Worker().get(), SIGNAL(ImageLoaded(quint64,QImage)), SLOT(CoverImageLoaded(quint64,QImage))); diff --git a/src/ui/albumcovermanager.h b/src/ui/albumcovermanager.h index 76952e410..08a3e2da6 100644 --- a/src/ui/albumcovermanager.h +++ b/src/ui/albumcovermanager.h @@ -30,7 +30,6 @@ class LibraryBackend; class AlbumCoverFetcher; class AlbumCoverSearcher; -class NetworkAccessManager; class Ui_CoverManager; class QListWidgetItem; @@ -40,8 +39,7 @@ class QProgressBar; class AlbumCoverManager : public QMainWindow { Q_OBJECT public: - AlbumCoverManager(NetworkAccessManager* network, LibraryBackend* backend, - QWidget *parent = 0); + AlbumCoverManager(LibraryBackend* backend, QWidget *parent = 0); ~AlbumCoverManager(); static const char* kSettingsGroup; @@ -125,7 +123,6 @@ class AlbumCoverManager : public QMainWindow { QAction* filter_with_covers_; QAction* filter_without_covers_; - NetworkAccessManager* network_; BackgroundThread* cover_loader_; QMap cover_loading_tasks_; diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index be9bc92e4..93415104e 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -121,12 +121,11 @@ const char* MainWindow::kMusicFilterSpec = const char* MainWindow::kAllFilesFilterSpec = QT_TR_NOOP("All Files (*)"); -MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidget *parent) +MainWindow::MainWindow(Engine::Type engine, QWidget *parent) : QMainWindow(parent), ui_(new Ui_MainWindow), - network_(network), tray_icon_(SystemTrayIcon::CreateSystemTrayIcon(this)), - osd_(new OSD(tray_icon_, network, this)), + osd_(new OSD(tray_icon_, this)), task_manager_(new TaskManager(this)), database_(new BackgroundThreadImplementation(this)), radio_model_(NULL), @@ -141,8 +140,8 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg file_view_(new FileView(this)), radio_view_(new RadioViewContainer(this)), device_view_(new DeviceView(this)), - song_info_view_(new SongInfoView(network, this)), - artist_info_view_(new ArtistInfoView(network, this)), + song_info_view_(new SongInfoView(this)), + artist_info_view_(new ArtistInfoView(this)), settings_dialog_(NULL), cover_manager_(NULL), equalizer_(new Equalizer), @@ -169,7 +168,7 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg playlist_backend_->SetDatabase(database_->Worker()); // Create stuff that needs the database - radio_model_ = new RadioModel(database_, network, task_manager_, this); + radio_model_ = new RadioModel(database_, task_manager_, this); player_ = new Player(playlists_, radio_model_->GetLastFMService(), engine, this); library_ = new Library(database_, task_manager_, this); devices_ = new DeviceManager(database_, task_manager_, this); @@ -519,7 +518,6 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg connect(ui_->multi_loading_indicator, SIGNAL(TaskCountChange(int)), SLOT(TaskCountChanged(int))); // Now playing widget - ui_->now_playing->set_network(network); ui_->now_playing->set_ideal_height(ui_->status_bar->sizeHint().height() + ui_->player_controls->sizeHint().height() + 1); // Don't question the 1 @@ -1477,7 +1475,7 @@ void MainWindow::PlaylistCopyToDevice() { void MainWindow::ShowCoverManager() { if (!cover_manager_) { - cover_manager_.reset(new AlbumCoverManager(network_, library_->backend())); + cover_manager_.reset(new AlbumCoverManager(library_->backend())); cover_manager_->Init(); // Cover manager connections diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 324f8321e..53c3df170 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -47,7 +47,6 @@ class GroupByDialog; class Library; class LibraryViewContainer; class MultiLoadingIndicator; -class NetworkAccessManager; class OrganiseDialog; class OSD; class Player; @@ -74,7 +73,7 @@ class MainWindow : public QMainWindow, public PlatformInterface { Q_OBJECT public: - MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidget *parent = 0); + MainWindow(Engine::Type engine, QWidget *parent = 0); ~MainWindow(); static const char* kSettingsGroup; @@ -203,7 +202,6 @@ class MainWindow : public QMainWindow, public PlatformInterface { private: Ui_MainWindow* ui_; - NetworkAccessManager* network_; SystemTrayIcon* tray_icon_; OSD* osd_; diff --git a/src/widgets/nowplayingwidget.cpp b/src/widgets/nowplayingwidget.cpp index a8304928f..41b94f3cd 100644 --- a/src/widgets/nowplayingwidget.cpp +++ b/src/widgets/nowplayingwidget.cpp @@ -16,7 +16,6 @@ #include "nowplayingwidget.h" #include "core/albumcoverloader.h" -#include "core/networkaccessmanager.h" #include #include @@ -52,7 +51,6 @@ const int NowPlayingWidget::kTopBorder = 4; NowPlayingWidget::NowPlayingWidget(QWidget *parent) : QWidget(parent), cover_loader_(new BackgroundThreadImplementation(this)), - network_(NULL), mode_(SmallSongDetails), menu_(new QMenu(this)), above_statusbar_action_(NULL), @@ -118,7 +116,6 @@ QSize NowPlayingWidget::sizeHint() const { void NowPlayingWidget::CoverLoaderInitialised() { UpdateHeight(); - cover_loader_->Worker()->SetNetwork(network_); cover_loader_->Worker()->SetPadOutputImage(true); connect(cover_loader_->Worker().get(), SIGNAL(ImageLoaded(quint64,QImage)), SLOT(AlbumArtLoaded(quint64,QImage))); diff --git a/src/widgets/nowplayingwidget.h b/src/widgets/nowplayingwidget.h index 36b27cc29..6b25d2b71 100644 --- a/src/widgets/nowplayingwidget.h +++ b/src/widgets/nowplayingwidget.h @@ -23,7 +23,6 @@ #include class AlbumCoverLoader; -class NetworkAccessManager; class QActionGroup; class QMenu; @@ -52,7 +51,6 @@ public: LargeSongDetails = 1, }; - void set_network(NetworkAccessManager* network) { network_ = network; } void set_ideal_height(int height); bool show_above_status_bar() const; @@ -93,7 +91,6 @@ private: private: BackgroundThread* cover_loader_; - NetworkAccessManager* network_; Mode mode_; diff --git a/src/widgets/osd.cpp b/src/widgets/osd.cpp index cfef14abb..46887c602 100644 --- a/src/widgets/osd.cpp +++ b/src/widgets/osd.cpp @@ -28,7 +28,7 @@ const char* OSD::kSettingsGroup = "OSD"; -OSD::OSD(SystemTrayIcon* tray_icon, NetworkAccessManager* network, QObject* parent) +OSD::OSD(SystemTrayIcon* tray_icon, QObject* parent) : QObject(parent), tray_icon_(tray_icon), timeout_msec_(5000), @@ -38,7 +38,6 @@ OSD::OSD(SystemTrayIcon* tray_icon, NetworkAccessManager* network, QObject* pare force_show_next_(false), ignore_next_stopped_(false), pretty_popup_(new OSDPretty(OSDPretty::Mode_Popup)), - network_(network), cover_loader_(new BackgroundThreadImplementation(this)) { cover_loader_->Start(); @@ -54,7 +53,6 @@ OSD::~OSD() { } void OSD::CoverLoaderInitialised() { - cover_loader_->Worker()->SetNetwork(network_); cover_loader_->Worker()->SetPadOutputImage(false); cover_loader_->Worker()->SetDefaultOutputImage(QImage(":nocover.png")); connect(cover_loader_->Worker().get(), SIGNAL(ImageLoaded(quint64,QImage)), diff --git a/src/widgets/osd.h b/src/widgets/osd.h index 39dd87554..2ec78e4d7 100644 --- a/src/widgets/osd.h +++ b/src/widgets/osd.h @@ -26,7 +26,6 @@ #include "core/backgroundthread.h" #include "core/song.h" -class NetworkAccessManager; class OrgFreedesktopNotificationsInterface; class OSDPretty; class SystemTrayIcon; @@ -45,7 +44,7 @@ class OSD : public QObject { Q_OBJECT public: - OSD(SystemTrayIcon* tray_icon, NetworkAccessManager* network, QObject* parent = 0); + OSD(SystemTrayIcon* tray_icon, QObject* parent = 0); ~OSD(); static const char* kSettingsGroup; @@ -118,7 +117,6 @@ class OSD : public QObject { OSDPretty* pretty_popup_; - NetworkAccessManager* network_; BackgroundThread* cover_loader_; QMap waiting_for_album_art_; diff --git a/src/widgets/prettyimage.cpp b/src/widgets/prettyimage.cpp index 600182c71..90100b668 100644 --- a/src/widgets/prettyimage.cpp +++ b/src/widgets/prettyimage.cpp @@ -15,7 +15,7 @@ */ #include "prettyimage.h" -#include "core/networkaccessmanager.h" +#include "core/network.h" #include "ui/iconloader.h" #include @@ -39,9 +39,9 @@ const int PrettyImage::kMaxImageWidth = 400; const char* PrettyImage::kSettingsGroup = "PrettyImageView"; -PrettyImage::PrettyImage(const QUrl& url, NetworkAccessManager* network, QWidget* parent) +PrettyImage::PrettyImage(const QUrl& url, QWidget* parent) : QWidget(parent), - network_(network), + network_(new NetworkAccessManager(this)), state_(State_WaitingForLazyLoad), url_(url), menu_(NULL) @@ -56,7 +56,8 @@ void PrettyImage::LazyLoad() { return; // Start fetching the image - network_->Get(url_, this, "ImageFetched", 0); + QNetworkReply* reply = network_->get(QNetworkRequest(url_)); + connect(reply, SIGNAL(finished()), SLOT(ImageFetched())); state_ = State_Loading; } @@ -73,7 +74,8 @@ QSize PrettyImage::sizeHint() const { return QSize(image_size().width(), kTotalHeight); } -void PrettyImage::ImageFetched(quint64 id, QNetworkReply* reply) { +void PrettyImage::ImageFetched() { + QNetworkReply* reply = qobject_cast(sender()); reply->deleteLater(); QImage image = QImage::fromData(reply->readAll()); diff --git a/src/widgets/prettyimage.h b/src/widgets/prettyimage.h index bcffa0169..4e721f14d 100644 --- a/src/widgets/prettyimage.h +++ b/src/widgets/prettyimage.h @@ -29,7 +29,7 @@ class PrettyImage : public QWidget { Q_OBJECT public: - PrettyImage(const QUrl& url, NetworkAccessManager* network, QWidget* parent = 0); + PrettyImage(const QUrl& url, QWidget* parent = 0); static const int kTotalHeight; static const int kReflectionHeight; @@ -55,7 +55,7 @@ protected: void paintEvent(QPaintEvent*); private slots: - void ImageFetched(quint64 id, QNetworkReply* reply); + void ImageFetched(); private: enum State { diff --git a/src/widgets/prettyimageview.cpp b/src/widgets/prettyimageview.cpp index 31ae1998f..f81fe48bf 100644 --- a/src/widgets/prettyimageview.cpp +++ b/src/widgets/prettyimageview.cpp @@ -24,9 +24,8 @@ #include #include -PrettyImageView::PrettyImageView(NetworkAccessManager* network, QWidget* parent) +PrettyImageView::PrettyImageView(QWidget* parent) : QScrollArea(parent), - network_(network), container_(new QWidget(this)), layout_(new QHBoxLayout(container_)), current_index_(-1), @@ -54,7 +53,7 @@ PrettyImageView::PrettyImageView(NetworkAccessManager* network, QWidget* parent) } void PrettyImageView::AddImage(const QUrl& url) { - PrettyImage* image = new PrettyImage(url, network_, container_); + PrettyImage* image = new PrettyImage(url, container_); connect(image, SIGNAL(destroyed()), SLOT(ScrollToCurrent())); connect(image, SIGNAL(Loaded()), SLOT(ScrollToCurrent())); diff --git a/src/widgets/prettyimageview.h b/src/widgets/prettyimageview.h index 8f1e6bd06..5d2c556e9 100644 --- a/src/widgets/prettyimageview.h +++ b/src/widgets/prettyimageview.h @@ -21,8 +21,6 @@ #include #include -class NetworkAccessManager; - class QHBoxLayout; class QMenu; class QNetworkReply; @@ -33,7 +31,7 @@ class PrettyImageView : public QScrollArea { Q_OBJECT public: - PrettyImageView(NetworkAccessManager* network, QWidget* parent = 0); + PrettyImageView(QWidget* parent = 0); static const char* kSettingsGroup; @@ -51,8 +49,6 @@ private slots: void ScrollToCurrent(); private: - NetworkAccessManager* network_; - QWidget* container_; QHBoxLayout* layout_;