on xenial help sign in
Move downloads to their own threads so they don't muck about with the parent thread's event loop. Fixes: 1240408
commitc6ca9db210e814587347827cdf2093012e81372f authorJussi Pakkanen <jussi.pakkanen@canonical.com> dateFri 21 Feb 2014, 09:05 (13 years ago) parent80b2c35b235323
2 files changed+24−22
plugins/Utils/CMakeLists.txt+1−1 plugins/Utils/albumartprovider.cpp+23−21
plugins/Utils/CMakeLists.txt+1−1
@@ -33,7 +33,7 @@ target_link_libraries(Utils-qml ${GIO_LDFLAGS})
3333# files directly in targets.
3434set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
3535
36−qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns)
36+qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Concurrent)
3737
3838# export the qmldir qmltypes and plugin files
3939export_qmlfiles(Utils Utils)
plugins/Utils/albumartprovider.cpp+23−21
@@ -33,12 +33,27 @@
3333#include <QImage>
3434#include <QUrl>
3535#include <QUrlQuery>
36+#include <QtConcurrent>
3637
3738using namespace std;
3839
3940const std::string AlbumArtProvider::DEFAULT_ALBUM_ART = "/usr/share/unity/icons/album_missing.png";
4041const std::string AlbumArtProvider::UNITY_LENS_SCHEMA = "com.canonical.Unity.Lenses";
4142
43+static QByteArray download(QString url) {
44+ QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
45+ QNetworkReply *reply = am->get(QNetworkRequest(QUrl(url)));
46+ QEventLoop loop;
47+ QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
48+ loop.exec();
49+
50+ if (reply->error() != QNetworkReply::NoError) {
51+ qWarning() << "Error downloading from the network:" << reply->errorString();
52+ return QByteArray();
53+ }
54+ return reply->readAll();
55+}
56+
4257AlbumArtProvider::AlbumArtProvider()
4358 : QQuickImageProvider(QQmlImageProviderBase::Image, QQmlImageProviderBase::ForceAsynchronousImageLoading),
4459 m_settings(nullptr)
@@ -76,20 +91,14 @@ std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
7691 QString request = QString("http://ws.audioscrobbler.com/1.0/album/%1/%2/info.xml").arg(artist)
7792 .arg(album)
7893 .toHtmlEscaped();
79− QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
80− QNetworkReply *reply = am->get(QNetworkRequest(QUrl(request)));
81− QEventLoop loop;
82− QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
83− loop.exec();
84−
85− if (reply->error() != QNetworkReply::NoError) {
86− qWarning() << "Error getting the XML:" << reply->errorString();
94+ QFuture<QByteArray> future = QtConcurrent::run(download, request);
95+ QByteArray arr = future.result();
96+ if(arr.size() == 0) {
8797 return "";
8898 }
89−
9099 QXmlQuery query;
91100 QBuffer tmp;
92− tmp.setData(reply->readAll());
101+ tmp.setData(arr);
93102 tmp.open(QIODevice::ReadOnly);
94103 query.bindVariable("reply", &tmp);
95104 query.setQuery("doc($reply)/album/coverart/large[1]/text()");
@@ -109,24 +118,17 @@ std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
109118bool AlbumArtProvider::download_and_store(const std::string &image_url, const std::string &output_file) {
110119 QString url = QString::fromStdString(image_url);
111120 QString fileName = QString::fromStdString(output_file);
112−
113− QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
114− QNetworkReply *reply = am->get(QNetworkRequest(QUrl(url)));
115− QEventLoop loop;
116− QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
117− loop.exec();
118−
119− if (reply->error() != QNetworkReply::NoError) {
120− qWarning() << "Error getting the image:" << reply->errorString();
121+ QFuture<QByteArray> future = QtConcurrent::run(download, url);
122+ QByteArray arr = future.result();
123+ if (arr.size() == 0) {
121124 return false;
122125 }
123−
124126 QFile file(fileName);
125127 if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
126128 qWarning() << "Could not open file for writing:" << file.errorString();
127129 return false;
128130 }
129− if (file.write(reply->readAll()) == -1){
131+ if (file.write(arr) == -1){
130132 qWarning() << "Could not write the image:" << file.error();
131133 return false;
132134 }