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 }