File indexing completed on 2024-04-21 05:26:16

0001 /*
0002  *   SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003  *
0004  *   SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #include "DiscoverExporter.h"
0008 #include <QDebug>
0009 #include <QFile>
0010 #include <QJsonArray>
0011 #include <QJsonDocument>
0012 #include <QJsonObject>
0013 #include <QMetaProperty>
0014 #include <chrono>
0015 #include <resources/AbstractResource.h>
0016 #include <resources/AbstractResourcesBackend.h>
0017 #include <resources/ResourcesModel.h>
0018 #include <resources/StoredResultsStream.h>
0019 
0020 using namespace std::chrono_literals;
0021 
0022 DiscoverExporter::DiscoverExporter()
0023     : QObject(nullptr)
0024     , m_excludedProperties({"executables", "canExecute"})
0025 {
0026     connect(ResourcesModel::global(), &ResourcesModel::backendsChanged, this, &DiscoverExporter::fetchResources);
0027 }
0028 
0029 DiscoverExporter::~DiscoverExporter() = default;
0030 
0031 void DiscoverExporter::setExportPath(const QUrl &url)
0032 {
0033     m_path = url;
0034 }
0035 
0036 QJsonObject itemDataToMap(const AbstractResource *res, const QSet<QByteArray> &excluded)
0037 {
0038     QJsonObject ret;
0039     int propsCount = res->metaObject()->propertyCount();
0040     for (int i = 0; i < propsCount; i++) {
0041         QMetaProperty prop = res->metaObject()->property(i);
0042         if (prop.userType() >= QMetaType::User || excluded.contains(prop.name()))
0043             continue;
0044 
0045         const QVariant val = prop.read(res);
0046         if (val.isNull())
0047             continue;
0048 
0049         ret.insert(QLatin1String(prop.name()), QJsonValue::fromVariant(val));
0050     }
0051     return ret;
0052 }
0053 
0054 void DiscoverExporter::fetchResources()
0055 {
0056     ResourcesModel *m = ResourcesModel::global();
0057     QSet<ResultsStream *> streams;
0058     const auto backends = m->backends();
0059     for (auto backend : backends) {
0060         streams << backend->search({});
0061     }
0062     auto stream = new StoredResultsStream(streams);
0063     connect(stream, &StoredResultsStream::finishedResources, this, &DiscoverExporter::exportResources);
0064     QTimer::singleShot(15s, stream, &AggregatedResultsStream::finished);
0065 }
0066 
0067 void DiscoverExporter::exportResources(const QVector<StreamResult> &resources)
0068 {
0069     QJsonArray data;
0070     for (auto res : resources) {
0071         data += itemDataToMap(res.resource, m_excludedProperties);
0072     }
0073 
0074     QJsonDocument doc = QJsonDocument(data);
0075     if (doc.isNull()) {
0076         qWarning() << "Could not completely export the data to " << m_path;
0077         return;
0078     }
0079 
0080     QFile f(m_path.toLocalFile());
0081     if (f.open(QIODevice::WriteOnly | QIODevice::Text)) {
0082         int w = f.write(doc.toJson(QJsonDocument::Indented));
0083         if (w <= 0)
0084             qWarning() << "Could not completely export the data to " << m_path;
0085     } else {
0086         qWarning() << "Could not write to " << m_path;
0087     }
0088     qDebug() << "exported items: " << data.count() << " to " << m_path;
0089     Q_EMIT exportDone();
0090 }
0091 
0092 #include "moc_DiscoverExporter.cpp"