File indexing completed on 2024-04-28 03:52:08

0001 /*
0002  * BluezQt - Asynchronous BlueZ wrapper library
0003  *
0004  * SPDX-FileCopyrightText: 2019 Manuel Weichselbaumer <mincequi@web.de>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #include <QCommandLineParser>
0010 #include <QCoreApplication>
0011 #include <QDebug>
0012 #include <QFile>
0013 #include <QFileInfo>
0014 #include <QTextStream>
0015 
0016 #include "BluezApiParser.h"
0017 #include "CppGenerator.h"
0018 #include "XmlGenerator.h"
0019 
0020 int main(int argc, char *argv[])
0021 {
0022     QCoreApplication a(argc, argv);
0023     QCoreApplication::setApplicationName(QStringLiteral("bluezapi2qt"));
0024     QCoreApplication::setApplicationVersion(QStringLiteral("0.1"));
0025 
0026     // Add command line parsing
0027     QCommandLineParser parser;
0028     parser.setApplicationDescription(
0029         QStringLiteral("Generates D-BUS object introspection XML files out of BlueZ D-Bus API\n"
0030                        "description files (*-api.txt)."));
0031     parser.addHelpOption();
0032     parser.addVersionOption();
0033     parser.addPositionalArgument(QStringLiteral("<bluez>-api.txt"), QStringLiteral("BlueZ D-Bus API description file to use."));
0034     QCommandLineOption deprecatedOption(QStringList() << QStringLiteral("d") << QStringLiteral("deprecated"),
0035                                         QStringLiteral("Generate deprecated methods/properties"));
0036     parser.addOption(deprecatedOption);
0037     QCommandLineOption experimentalOption(QStringList() << QStringLiteral("e") << QStringLiteral("experimental"),
0038                                           QStringLiteral("Generate experimental methods/properties"));
0039     parser.addOption(experimentalOption);
0040     QCommandLineOption optionalOption(QStringList() << QStringLiteral("o") << QStringLiteral("optional"),
0041                                       QStringLiteral("Generate optional methods/properties"));
0042     parser.addOption(optionalOption);
0043     QCommandLineOption xmlOption(QStringList() << QStringLiteral("x") << QStringLiteral("xml"),
0044                                  QStringLiteral("Generate D-Bus object introspection XML files"));
0045     parser.addOption(xmlOption);
0046     QCommandLineOption cppOption(QStringList() << QStringLiteral("c") << QStringLiteral("cpp"), QStringLiteral("Generate D-Bus interface adaptor C++ files"));
0047     parser.addOption(cppOption);
0048     QCommandLineOption authorOption(QStringList() << QStringLiteral("a") << QStringLiteral("author"),
0049                                     QStringLiteral("Author for copyright header in C++ files"),
0050                                     QStringLiteral("author"));
0051     parser.addOption(authorOption);
0052     QCommandLineOption yearOption(QStringList() << QStringLiteral("y") << QStringLiteral("year"),
0053                                   QStringLiteral("Year for copyright header in C++ files"),
0054                                   QStringLiteral("year"));
0055     parser.addOption(yearOption);
0056     parser.process(a);
0057 
0058     // Open file
0059     auto positionalArgs = parser.positionalArguments();
0060     if (positionalArgs.isEmpty()) {
0061         fputs(qPrintable(parser.helpText()), stderr);
0062         return 1;
0063     }
0064     auto fileName = positionalArgs.takeFirst();
0065     QFileInfo inputInfo(fileName);
0066     if (!inputInfo.exists() || !inputInfo.isFile() || !inputInfo.isReadable()) {
0067         qCritical() << "Cannot open file" << fileName;
0068         return 1;
0069     }
0070 
0071     QFile file(fileName);
0072     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
0073         qCritical() << "Cannot open file" << file.fileName();
0074         return 1;
0075     }
0076     QTextStream stream(&file);
0077 
0078     // Parse file
0079     BluezApiParser bluezParser;
0080     if (!bluezParser.parse(stream)) {
0081         qCritical() << "Error parsing file" << file.fileName();
0082         return 1;
0083     }
0084     if (!bluezParser.finalize()) {
0085         qCritical() << "Error parsing file" << file.fileName();
0086         return 1;
0087     }
0088 
0089     if (parser.isSet(xmlOption)) {
0090         XmlGenerator::Config xmlConfig;
0091         xmlConfig.useOptional = parser.isSet(optionalOption);
0092         xmlConfig.useDeprecated = parser.isSet(deprecatedOption);
0093         xmlConfig.useExperimental = parser.isSet(experimentalOption);
0094         XmlGenerator xmlGenerator(xmlConfig);
0095         if (!xmlGenerator.generate(bluezParser)) {
0096             qCritical() << "Error generating xml";
0097             return 1;
0098         }
0099     }
0100 
0101     if (parser.isSet(cppOption)) {
0102         CppGenerator::Config cppConfig;
0103         cppConfig.author = parser.value(authorOption);
0104         cppConfig.year = parser.value(yearOption);
0105         CppGenerator cppGenerator(cppConfig);
0106         if (!cppGenerator.generate(bluezParser)) {
0107             qCritical() << "Error generating C++ files";
0108             return 1;
0109         }
0110     }
0111 
0112     return 0;
0113 }