File indexing completed on 2024-04-14 04:35:07

0001 /*
0002     SPDX-FileCopyrightText: 2014 Vishesh Handa <me@vhanda.in>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "filefetchjob.h"
0008 #include "filemetadatautil_p.h"
0009 #include "widgetsdebug.h"
0010 
0011 #include <Baloo/File>
0012 #include <QFileInfo>
0013 #include <QTimer>
0014 
0015 #include <KFileMetaData/UserMetaData>
0016 
0017 using namespace Baloo;
0018 
0019 FileFetchJob::FileFetchJob(const QStringList &urls, bool canEditAll, FileFetchJob::UseRealtimeIndexing useRealtime, QObject *parent)
0020     : KJob(parent)
0021     , m_urls(urls)
0022     , m_canEditAll(canEditAll)
0023     , m_useRealtime(useRealtime)
0024 {
0025 }
0026 
0027 void FileFetchJob::start()
0028 {
0029     QTimer::singleShot(0, this, SLOT(doStart()));
0030 }
0031 
0032 void FileFetchJob::doStart()
0033 {
0034     for (const QString &filePath : std::as_const(m_urls)) {
0035         bool extractorRunning = false;
0036         KFileMetaData::PropertyMultiMap fileProperties;
0037 
0038         // UseRealtimeIndexing::Fallback: try DB first, then filesystem
0039         // UseRealtimeIndexing::Disabled: DB contents only
0040         // UseRealtimeIndexing::Only:     DB disabled, use filesystem
0041         if (m_useRealtime != UseRealtimeIndexing::Only) {
0042             Baloo::File file(filePath);
0043             file.load();
0044             fileProperties = file.properties();
0045             qCDebug(WIDGETS) << filePath << "DB properties:" << fileProperties;
0046         }
0047         if (fileProperties.empty() && m_useRealtime != UseRealtimeIndexing::Disabled) {
0048             extractorRunning = true;
0049             m_extractor.process(filePath);
0050         }
0051 
0052         QVariantMap prop;
0053         KFileMetaData::UserMetaData umd(filePath);
0054 
0055         if (umd.isSupported()) {
0056             using Attribute = KFileMetaData::UserMetaData::Attribute;
0057             auto umdData = Baloo::Private::fetchUserMetaData(umd, Attribute::Tags | Attribute::Rating | Attribute::Comment | Attribute::OriginUrl);
0058             prop = Baloo::Private::convertUserMetaData(umdData);
0059         } else {
0060             m_canEditAll = false;
0061         }
0062         if (m_canEditAll) {
0063             m_canEditAll = QFileInfo(filePath).isWritable();
0064         }
0065 
0066         if (extractorRunning) {
0067             m_extractor.waitFinished();
0068             fileProperties = m_extractor.properties();
0069             qCDebug(WIDGETS) << filePath << "  properties:" << fileProperties;
0070         }
0071         prop.insert(Baloo::Private::toNamedVariantMap(fileProperties));
0072 
0073         m_data << prop;
0074     }
0075 
0076     emitResult();
0077 }
0078 
0079 QList<QVariantMap> Baloo::FileFetchJob::data() const
0080 {
0081     return m_data;
0082 }
0083 
0084 bool FileFetchJob::canEditAll() const
0085 {
0086     return m_canEditAll;
0087 }
0088 
0089 #include "moc_filefetchjob.cpp"