From f8b59e78b5d8a182ed5b00ae4f0b26237bbc9bd9 Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Thu, 5 Feb 2015 23:47:29 +0100 Subject: [PATCH] Clean up DanbooruService Remove multi_get for now (broken in kio_http) Add a default constructor (needed for QML) Explicitly delete posts --- src/libdanbooru/danbooruservice.cpp | 41 +++++++++++++++++++++++++++-- src/libdanbooru/danbooruservice.h | 8 ++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/libdanbooru/danbooruservice.cpp b/src/libdanbooru/danbooruservice.cpp index 6958ba1..242ae35 100644 --- a/src/libdanbooru/danbooruservice.cpp +++ b/src/libdanbooru/danbooruservice.cpp @@ -20,6 +20,10 @@ * */ +// STL + +#include + // Qt #include @@ -31,6 +35,7 @@ #include #include #include +#include // Own @@ -44,6 +49,7 @@ namespace Danbooru { using KIO::StoredTransferJob; +using KIO::MultiGetJob; const QString DanbooruService::POST_URL = "post/index.json" ; const QString DanbooruService::TAG_URL = "tag/index.xml"; @@ -52,6 +58,16 @@ const QString DanbooruService::ARTIST_URL = "artist/index.json"; const QString DanbooruService::POOL_DATA_URL = "pool/show.xml"; const QString DanbooruService::RELATED_TAG_URL = "tag/related.json"; +DanbooruService::DanbooruService(QObject *parent): + QObject(parent), + m_url(QUrl()), + m_username(QString()), + m_password(QString()), + m_maxRating(DanbooruPost::Safe), + m_postsToFetch(0), + m_cache(0){ +} + DanbooruService::DanbooruService(QUrl &boardUrl, QString username, QString password, KImageCache *cache, QObject *parent): @@ -67,7 +83,8 @@ DanbooruService::DanbooruService(QUrl &boardUrl, QString username, DanbooruService::~DanbooruService() { - + qDeleteAll(m_posts); + m_posts.clear(); } void DanbooruService::getPostList(int page, QStringList tags, int limit) @@ -384,6 +401,10 @@ void DanbooruService::processPostList(KJob *job) // qDebug() << "Got post data OK"; + if (!m_posts.isEmpty()) { + m_posts.clear(); + } + if (job->error()) { Q_EMIT(downloadError(job->errorString())); } @@ -419,6 +440,21 @@ void DanbooruService::processPostList(KJob *job) m_postsToFetch = postList.length(); + int postId = 0; + + for (auto element: postList) { + QVariantMap map = element.toMap(); + DanbooruPost *post = new DanbooruPost(map); + if (isPostBlacklisted(post, m_blacklist, m_maxRating)) { + m_postsToFetch--; + delete post; + continue; + } + m_posts.insert(postId, post); + postId++; + + } + for (auto element : postList) { QVariantMap map = element.toMap(); @@ -434,9 +470,10 @@ void DanbooruService::processPostList(KJob *job) QPixmap pix; + // Usare QHash per KIO::multi_get! + if (m_cache->findPixmap(post->thumbnailUrl().url(), &pix)) { - qDebug() << "in cache"; post->setPixmap(pix); Q_EMIT(postDownloaded(post)); m_postsToFetch--; diff --git a/src/libdanbooru/danbooruservice.h b/src/libdanbooru/danbooruservice.h index f3625af..dd506e7 100644 --- a/src/libdanbooru/danbooruservice.h +++ b/src/libdanbooru/danbooruservice.h @@ -95,6 +95,7 @@ private: QString m_password; QSet m_blacklist; DanbooruPost::Ratings m_maxRating; + QHash m_posts; unsigned int m_postsToFetch; // To tell when to quit @@ -102,6 +103,9 @@ private: public: + + DanbooruService(QObject *parent = 0); + /** * @brief Construct a default instance of the service. * @@ -130,8 +134,8 @@ public: * @param limit The number of posts to fetch (maximum 100) * **/ - void getPostList(int page = 1, QStringList tags = QStringList(), - int limit = 100); + Q_INVOKABLE void getPostList(int page = 1, QStringList tags = QStringList(), + int limit = 100); /** * @brief Get a list of pools from the board.