diff --git a/src/filefetchjob.h b/src/filefetchjob.h --- a/src/filefetchjob.h +++ b/src/filefetchjob.h @@ -23,14 +23,21 @@ #include #include +#include "ondemandextractor.h" namespace Baloo { class FileFetchJob : public KJob { Q_OBJECT public: - explicit FileFetchJob(const QStringList& urls, bool canEditAll, QObject* parent = nullptr); + enum class UseRealtimeIndexing : char { + Disabled = 0, + Only, + Fallback + }; + explicit FileFetchJob(const QStringList& urls, bool canEditAll, + UseRealtimeIndexing useRealtime, QObject* parent = nullptr); QList data() const; bool canEditAll() const; @@ -44,6 +51,8 @@ QStringList m_urls; QList m_data; bool m_canEditAll; + UseRealtimeIndexing m_useRealtime; + Private::OnDemandExtractor m_extractor; }; } diff --git a/src/filefetchjob.cpp b/src/filefetchjob.cpp --- a/src/filefetchjob.cpp +++ b/src/filefetchjob.cpp @@ -20,6 +20,7 @@ #include "filefetchjob.h" #include "filemetadatautil_p.h" +#include "widgetsdebug.h" #include #include @@ -29,10 +30,12 @@ using namespace Baloo; -FileFetchJob::FileFetchJob(const QStringList& urls, bool canEditAll, QObject* parent) +FileFetchJob::FileFetchJob(const QStringList& urls, bool canEditAll, + FileFetchJob::UseRealtimeIndexing useRealtime, QObject* parent) : KJob(parent) , m_urls(urls) , m_canEditAll(canEditAll) + , m_useRealtime(useRealtime) { } @@ -44,24 +47,43 @@ void FileFetchJob::doStart() { for (const QString& filePath : m_urls) { - Baloo::File file(filePath); - file.load(); - QVariantMap prop = Baloo::Private::toNamedVariantMap(file.properties()); + bool extractorRunning = false; + KFileMetaData::PropertyMap fileProperties; + + // UseRealtimeIndexing::Fallback: try DB first, then filesystem + // UseRealtimeIndexing::Disabled: DB contents only + // UseRealtimeIndexing::Only: DB disabled, use filesystem + if (m_useRealtime != UseRealtimeIndexing::Only) { + Baloo::File file(filePath); + file.load(); + fileProperties = file.properties(); + qCDebug(WIDGETS) << filePath << "DB properties:" << fileProperties; + } + if (fileProperties.empty() && m_useRealtime != UseRealtimeIndexing::Disabled) { + extractorRunning = true; + m_extractor.process(filePath); + } + + QVariantMap prop; KFileMetaData::UserMetaData umd(filePath); if (umd.isSupported()) { - // FIXME - check writable - - QVariantMap attributes = Baloo::Private::convertUserMetaData(umd); - prop.unite(attributes); + prop = Baloo::Private::convertUserMetaData(umd); } else { m_canEditAll = false; } if (m_canEditAll) { m_canEditAll = QFileInfo(filePath).isWritable(); } + if (extractorRunning) { + m_extractor.waitFinished(); + fileProperties = m_extractor.properties(); + qCDebug(WIDGETS) << filePath << " properties:" << fileProperties; + } + prop.unite(Baloo::Private::toNamedVariantMap(fileProperties)); + m_data << prop; } diff --git a/src/filemetadataprovider.cpp b/src/filemetadataprovider.cpp --- a/src/filemetadataprovider.cpp +++ b/src/filemetadataprovider.cpp @@ -343,22 +343,24 @@ return; } - // Not indexed or only basic file indexing (no content) const QString filePath = url.toLocalFile(); + FileFetchJob* job; + + // Not indexed or only basic file indexing (no content) if (!m_config.fileIndexingEnabled() || !m_config.shouldBeIndexed(filePath) || m_config.onlyBasicIndexing()) { m_realTimeIndexing = true; - IndexedDataRetriever *ret = new IndexedDataRetriever(filePath, this); - connect(ret, &IndexedDataRetriever::finished, this, &FileMetaDataProvider::slotLoadingFinished); - ret->start(); + job = new FileFetchJob(QStringList{filePath}, true, + FileFetchJob::UseRealtimeIndexing::Only, this); // Fully indexed by Baloo } else { - FileFetchJob* job = new FileFetchJob(QStringList{filePath}, true, this); - connect(job, &FileFetchJob::finished, this, &FileMetaDataProvider::slotFileFetchFinished); - job->start(); + job = new FileFetchJob(QStringList{filePath}, true, + FileFetchJob::UseRealtimeIndexing::Fallback, this); } + connect(job, &FileFetchJob::finished, this, &FileMetaDataProvider::slotFileFetchFinished); + job->start(); } void FileMetaDataProvider::setFileItems() @@ -383,7 +385,8 @@ // Editing only if all URLs are local bool canEdit = (urls.size() == m_fileItems.size()); - FileFetchJob* job = new FileFetchJob(urls, canEdit, this); + FileFetchJob* job = new FileFetchJob(urls, canEdit, + FileFetchJob::UseRealtimeIndexing::Disabled, this); connect(job, &FileFetchJob::finished, this, &FileMetaDataProvider::slotFileFetchFinished); job->start(); diff --git a/src/ondemandextractor.h b/src/ondemandextractor.h --- a/src/ondemandextractor.h +++ b/src/ondemandextractor.h @@ -37,6 +37,7 @@ void process(const QString& filePath); + bool waitFinished(); KFileMetaData::PropertyMap properties() const; Q_SIGNALS: diff --git a/src/ondemandextractor.cpp b/src/ondemandextractor.cpp --- a/src/ondemandextractor.cpp +++ b/src/ondemandextractor.cpp @@ -62,6 +62,11 @@ emit fileFinished(QProcess::NormalExit); } +bool OnDemandExtractor::waitFinished() +{ + return m_process.waitForFinished(); +} + KFileMetaData::PropertyMap OnDemandExtractor::properties() const { return m_properties;