From 3f760a769028233aec1834544c9e3dabb2802306 Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Sat, 4 Oct 2014 15:36:10 +0200 Subject: [PATCH] [libdanbooru/danbooruservice] Move thumbnail downloading to a lambda slot This greatly reduces complexity and prevents the ugly passing of properties along the jobs. --- src/libdanbooru/danbooruservice.cpp | 97 ++++++++++++++--------------- src/libdanbooru/danbooruservice.h | 2 +- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/libdanbooru/danbooruservice.cpp b/src/libdanbooru/danbooruservice.cpp index 7ceaf72..c806843 100644 --- a/src/libdanbooru/danbooruservice.cpp +++ b/src/libdanbooru/danbooruservice.cpp @@ -61,7 +61,7 @@ DanbooruService::DanbooruService(QUrl& boardUrl, QString username, m_username(username), m_password(password), m_maxRating(Danbooru::DanbooruPost::Safe), - m_currentPosts(0), + m_postsToFetch(0), m_cache(cache) { } @@ -318,80 +318,43 @@ void DanbooruService::processPostList(KJob* job) // How many posts do we have to fetch? - m_currentPosts = postList.length(); + m_postsToFetch = postList.length(); for (auto element : postList) { QVariantMap map = element.toMap(); - DanbooruPost* post = new DanbooruPost(map); // First check, for rating - if (post->rating() > m_maxRating) { - m_currentPosts--; - delete post; - continue; - } - - // second check, blacklist - - - bool inBlacklist = false; - for (auto tag: post->tags()) { - - if (m_blacklist.contains(tag)) { - inBlacklist = true; - break; - } - } - - if (inBlacklist) { - m_currentPosts--; + if (isPostBlacklisted(post, m_blacklist, m_maxRating)) { + m_postsToFetch--; delete post; continue; } QPixmap pix; - // QPixmap* pix = new QPixmap(); - bool result; - if (m_cache) { - result = m_cache->findPixmap(post->thumbnailUrl().url(), - &pix); - } else { - result = false; - } + if (m_cache->findPixmap(post->thumbnailUrl().url(), &pix)) { - - if (result) { post->setPixmap(pix); Q_EMIT(postDownloaded(post)); - m_currentPosts--; + m_postsToFetch--; - // Shortcut in case we have all posts in the cache or the - // last post is in the cache - - if (m_currentPosts == 0) { + if (m_postsToFetch == 0) { + qDebug() << "Post download finished"; Q_EMIT(postDownloadFinished()); - return; } } else { - - StoredTransferJob* pixmapJob = KIO::storedGet( - post->thumbnailUrl(), + StoredTransferJob* pixmapJob = KIO::storedGet(post->thumbnailUrl(), KIO::NoReload, KIO::HideProgressInfo ); - KIO::Scheduler::setJobPriority( - static_cast(job), - 1 - ); + KIO::Scheduler::setJobPriority(static_cast(job), 1); QVariant variant; - variant.setValue(post); // We don't want to overload the servers, so set some rational @@ -399,12 +362,46 @@ void DanbooruService::processPostList(KJob* job) pixmapJob->setProperty("danbooruPost", variant); - connect(pixmapJob, &StoredTransferJob::result, this, &DanbooruService::downloadThumbnail); + connect(pixmapJob, &StoredTransferJob::result, [post, this] (KJob* job) { + + if (job->error()) { + Q_EMIT(downloadError(job->errorString())); + return; + } + + QPixmap pix; + StoredTransferJob* jobResult = qobject_cast(job); + + if (!pix.loadFromData(jobResult->data())) { + Q_EMIT(downloadError(QString("Pixmap data could not be loaded"))); + return; + } + + post->setPixmap(pix); + + if (m_cache) { + //qDebug() << "Inserting item in cache"; + m_cache->insertPixmap(post->thumbnailUrl().url(), pix); + } + + m_postsToFetch--; // One less post to do + + //qDebug() << "Current posts remaining" << m_currentPosts; + Q_EMIT(postDownloaded(post)); + + if (m_postsToFetch == 0) { + qDebug() << "Post download finished"; + Q_EMIT(postDownloadFinished()); + } + + }); } } + + } void DanbooruService::processTagList(KJob* job) @@ -572,12 +569,12 @@ void DanbooruService::downloadThumbnail(KJob* job) m_cache->insertPixmap(post->thumbnailUrl().url(), pix); } - m_currentPosts--; // One less post to do + m_postsToFetch--; // One less post to do //qDebug() << "Current posts remaining" << m_currentPosts; Q_EMIT(postDownloaded(post)); - if (m_currentPosts == 0) { + if (m_postsToFetch == 0) { //qDebug() << "Post download finished"; Q_EMIT(postDownloadFinished()); } diff --git a/src/libdanbooru/danbooruservice.h b/src/libdanbooru/danbooruservice.h index 0daa66f..fc8f17b 100644 --- a/src/libdanbooru/danbooruservice.h +++ b/src/libdanbooru/danbooruservice.h @@ -96,7 +96,7 @@ namespace Danbooru { QSet m_blacklist; DanbooruPost::Ratings m_maxRating; - unsigned int m_currentPosts; // To tell when to quit + unsigned int m_postsToFetch; // To tell when to quit KImageCache* m_cache; // Pixmap cache