File: main.cpp

package info (click to toggle)
bluez-qt 5.116.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,932 kB
  • sloc: cpp: 16,676; xml: 554; ansic: 337; sh: 13; makefile: 8
file content (113 lines) | stat: -rw-r--r-- 4,659 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
 * BluezQt - Asynchronous BlueZ wrapper library
 *
 * SPDX-FileCopyrightText: 2019 Manuel Weichselbaumer <mincequi@web.de>
 *
 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
 */

#include <QCommandLineParser>
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QTextStream>

#include "BluezApiParser.h"
#include "CppGenerator.h"
#include "XmlGenerator.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QCoreApplication::setApplicationName(QStringLiteral("bluezapi2qt"));
    QCoreApplication::setApplicationVersion(QStringLiteral("0.1"));

    // Add command line parsing
    QCommandLineParser parser;
    parser.setApplicationDescription(
        QStringLiteral("Generates D-BUS object introspection XML files out of BlueZ D-Bus API\n"
                       "description files (*-api.txt)."));
    parser.addHelpOption();
    parser.addVersionOption();
    parser.addPositionalArgument(QStringLiteral("<bluez>-api.txt"), QStringLiteral("BlueZ D-Bus API description file to use."));
    QCommandLineOption deprecatedOption(QStringList() << QStringLiteral("d") << QStringLiteral("deprecated"),
                                        QStringLiteral("Generate deprecated methods/properties"));
    parser.addOption(deprecatedOption);
    QCommandLineOption experimentalOption(QStringList() << QStringLiteral("e") << QStringLiteral("experimental"),
                                          QStringLiteral("Generate experimental methods/properties"));
    parser.addOption(experimentalOption);
    QCommandLineOption optionalOption(QStringList() << QStringLiteral("o") << QStringLiteral("optional"),
                                      QStringLiteral("Generate optional methods/properties"));
    parser.addOption(optionalOption);
    QCommandLineOption xmlOption(QStringList() << QStringLiteral("x") << QStringLiteral("xml"),
                                 QStringLiteral("Generate D-Bus object introspection XML files"));
    parser.addOption(xmlOption);
    QCommandLineOption cppOption(QStringList() << QStringLiteral("c") << QStringLiteral("cpp"), QStringLiteral("Generate D-Bus interface adaptor C++ files"));
    parser.addOption(cppOption);
    QCommandLineOption authorOption(QStringList() << QStringLiteral("a") << QStringLiteral("author"),
                                    QStringLiteral("Author for copyright header in C++ files"),
                                    QStringLiteral("author"));
    parser.addOption(authorOption);
    QCommandLineOption yearOption(QStringList() << QStringLiteral("y") << QStringLiteral("year"),
                                  QStringLiteral("Year for copyright header in C++ files"),
                                  QStringLiteral("year"));
    parser.addOption(yearOption);
    parser.process(a);

    // Open file
    auto positionalArgs = parser.positionalArguments();
    if (positionalArgs.isEmpty()) {
        fputs(qPrintable(parser.helpText()), stderr);
        return 1;
    }
    auto fileName = positionalArgs.takeFirst();
    QFileInfo inputInfo(fileName);
    if (!inputInfo.exists() || !inputInfo.isFile() || !inputInfo.isReadable()) {
        qCritical() << "Cannot open file" << fileName;
        return 1;
    }

    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qCritical() << "Cannot open file" << file.fileName();
        return 1;
    }
    QTextStream stream(&file);

    // Parse file
    BluezApiParser bluezParser;
    if (!bluezParser.parse(stream)) {
        qCritical() << "Error parsing file" << file.fileName();
        return 1;
    }
    if (!bluezParser.finalize()) {
        qCritical() << "Error parsing file" << file.fileName();
        return 1;
    }

    if (parser.isSet(xmlOption)) {
        XmlGenerator::Config xmlConfig;
        xmlConfig.useOptional = parser.isSet(optionalOption);
        xmlConfig.useDeprecated = parser.isSet(deprecatedOption);
        xmlConfig.useExperimental = parser.isSet(experimentalOption);
        XmlGenerator xmlGenerator(xmlConfig);
        if (!xmlGenerator.generate(bluezParser)) {
            qCritical() << "Error generating xml";
            return 1;
        }
    }

    if (parser.isSet(cppOption)) {
        CppGenerator::Config cppConfig;
        cppConfig.author = parser.value(authorOption);
        cppConfig.year = parser.value(yearOption);
        CppGenerator cppGenerator(cppConfig);
        if (!cppGenerator.generate(bluezParser)) {
            qCritical() << "Error generating C++ files";
            return 1;
        }
    }

    return 0;
}