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"