Move tag downloading to a separate slot instead of a lambda
If tag downloading is still in progress when the application is closed, it will try to access the instance's pointer, leading to a crash.
This commit is contained in:
		
					parent
					
						
							
								92613218e1
							
						
					
				
			
			
				commit
				
					
						114df7aa31
					
				
			
		
					 2 changed files with 36 additions and 33 deletions
				
			
		| 
						 | 
					@ -117,40 +117,8 @@ void DanbooruService::getTagList(int limit, QString name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    KIO::StoredTransferJob *job = KIO::storedGet(danbooruUrl, KIO::NoReload,
 | 
					    KIO::StoredTransferJob *job = KIO::storedGet(danbooruUrl, KIO::NoReload,
 | 
				
			||||||
                                  KIO::HideProgressInfo);
 | 
					                                  KIO::HideProgressInfo);
 | 
				
			||||||
 | 
					    connect(job, &KIO::StoredTransferJob::result, this, &DanbooruService::processTagList);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    connect(job, &KIO::StoredTransferJob::result, [this](KJob * job) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (job->error()) {
 | 
					 | 
				
			||||||
            Q_EMIT(downloadError(job->errorString()));
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        StoredTransferJob *jobResult = qobject_cast<StoredTransferJob *>(job);
 | 
					 | 
				
			||||||
        QByteArray data = jobResult->data();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        bool ok;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Most Danbooru implementations return tags in wrong order when
 | 
					 | 
				
			||||||
        // using JSON, so we have to fall back to XML
 | 
					 | 
				
			||||||
        QList<QVariant> tagList = parseDanbooruResult(data, "tag", &ok);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!ok) {
 | 
					 | 
				
			||||||
            Q_EMIT(downloadError(QString("Unable to decode data")));
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (auto element : tagList) {
 | 
					 | 
				
			||||||
            QVariantMap map = element.toMap();
 | 
					 | 
				
			||||||
            DanbooruTag *tag = new DanbooruTag(map);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if(!tag) {
 | 
					 | 
				
			||||||
                continue;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            Q_EMIT(tagDownloaded(tag));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
           );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DanbooruService::getPool(int poolId, int page)
 | 
					void DanbooruService::getPool(int poolId, int page)
 | 
				
			||||||
| 
						 | 
					@ -381,10 +349,44 @@ void DanbooruService::reset()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_currentPage = 1;
 | 
					    m_currentPage = 1;
 | 
				
			||||||
    m_tags = QStringList();
 | 
					    m_tags = QStringList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Slots
 | 
					// Slots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DanbooruService::processTagList(KJob *job) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (job->error()) {
 | 
				
			||||||
 | 
					        Q_EMIT(downloadError(job->errorString()));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    StoredTransferJob *jobResult = qobject_cast<StoredTransferJob *>(job);
 | 
				
			||||||
 | 
					    QByteArray data = jobResult->data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool ok;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Most Danbooru implementations return tags in wrong order when
 | 
				
			||||||
 | 
					    // using JSON, so we have to fall back to XML
 | 
				
			||||||
 | 
					    QList<QVariant> tagList = parseDanbooruResult(data, "tag", &ok);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!ok) {
 | 
				
			||||||
 | 
					        Q_EMIT(downloadError(QString("Unable to decode data")));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (auto element : tagList) {
 | 
				
			||||||
 | 
					        QVariantMap map = element.toMap();
 | 
				
			||||||
 | 
					        DanbooruTag *tag = new DanbooruTag(map);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(!tag) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Q_EMIT(tagDownloaded(tag));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DanbooruService::processPostList(KJob *job)
 | 
					void DanbooruService::processPostList(KJob *job)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -283,6 +283,7 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private Q_SLOTS:
 | 
					private Q_SLOTS:
 | 
				
			||||||
    void processPostList(KJob *job);
 | 
					    void processPostList(KJob *job);
 | 
				
			||||||
 | 
					    void processTagList(KJob *job);
 | 
				
			||||||
    void downloadAllTags(KJob *job);
 | 
					    void downloadAllTags(KJob *job);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Q_SIGNALS:
 | 
					Q_SIGNALS:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue