#include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); const QStringList args(a.arguments()); if (args.count() != 3) { printf("usage: %s \n", args.at(0).toStdString().c_str()); return -1; } const QString currentSrcDir(a.arguments().at(1)); const QString appsJsonFilePath(QStringLiteral("%1/%2").arg(currentSrcDir, a.arguments().at(2))); QFile f(appsJsonFilePath); if (!f.open(QFile::ReadOnly)) { printf("LtsAppDescriptorChecker: cannot open apps.json at %s: %s\n", appsJsonFilePath.toStdString().c_str(), f.errorString().toStdString().c_str()); return -2; } printf("LtsAppDescriptorChecker: checking %s\n", appsJsonFilePath.toStdString().c_str()); QStringList lastErrors; QStringList dummy1; QString dummy2; LtsAppDescriptor::AppDescriptionVector adv = LtsAppDescriptor::LtsAppDescriptor::getAppDescriptionVector(f.readAll(), lastErrors, dummy1, dummy2); if (!lastErrors.isEmpty()) { printf("LtsAppDescriptorChecker: apps.json at %s invalid:\n%s\n", appsJsonFilePath.toStdString().c_str(), lastErrors.join(QStringLiteral("\r\n\r\n")).toStdString().c_str()); return 1; } QFileInfoList guiPluginFiles; QDirIterator it(QStringLiteral("%1/../../Plugins/").arg(currentSrcDir), QDirIterator::Subdirectories); while (it.hasNext()) { QString filename(it.next()); QFileInfo file(filename); if (file.isDir()) continue; if (file.fileName().endsWith(QStringLiteral("_gui_plugin.h"), Qt::CaseInsensitive)) guiPluginFiles.append(file); } QStringList filenames; filenames.reserve(guiPluginFiles.size()); for (const QFileInfo &fi : qAsConst(guiPluginFiles)) { filenames += fi.absoluteFilePath(); } QStringList guiPluginIIDs; for (const QFileInfo &fi : qAsConst(guiPluginFiles)) { QFile f2(fi.absoluteFilePath()); if (!f2.open(QFile::ReadOnly)) continue; QTextStream ts(&f2); while (!ts.atEnd()) { QString line(ts.readLine().trimmed().simplified()); static QString iidIdentifier(QStringLiteral("Q_PLUGIN_METADATA")); if (line.contains(iidIdentifier)) { QRegularExpression re(QStringLiteral("(?<=gui:3:).*(?=\"\\))")); QRegularExpressionMatch match = re.match(line); if (match.hasMatch()) { QString matched = match.captured(0); guiPluginIIDs += matched; } break; } } } bool ok = true; for (const LtsAppDescriptor::AppDescription &appdesc : qAsConst(adv)) { for (const LtsAppDescriptor::PluginInfo &pi : qAsConst(appdesc.pluginInfos)) { if (!guiPluginIIDs.contains(pi.iid)) { printf("LtsAppDescriptorChecker: apps.json at '%s' uses unknown IID '%s'\n", appsJsonFilePath.toStdString().c_str(), pi.iid.toStdString().c_str()); ok = false; } } } return !ok; }