import project files
[codereview/qmlplugins/commandlineoptions.git] / commandlineoptions.cpp
1 /* Copyright (c) 2014 Tasuku Suzuki
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of the Tasuku Suzuki nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED. IN NO EVENT SHALL TASUKU SUZUKI BE LIABLE FOR ANY
19  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 #include "commandlineoptions.h"
27
28 #include <QtCore/QDebug>
29 #include <QtCore/QMetaProperty>
30 #include <QtCore/QCoreApplication>
31 #include <QtCore/QCommandLineParser>
32
33 CommandLineOptions::CommandLineOptions(QObject *parent)
34     : QObject(parent)
35     , propertyCount(metaObject()->propertyCount())
36     , helpOption(false)
37 {
38 }
39
40 CommandLineOptions::~CommandLineOptions()
41 {
42 }
43
44 void CommandLineOptions::classBegin()
45 {
46 }
47
48 void CommandLineOptions::componentComplete()
49 {
50     const QMetaObject *mo = metaObject();
51     QCommandLineParser parser;
52     if (helpOption)
53         parser.addHelpOption();
54
55     QByteArray defaultPropertyName;
56     for (int i = propertyCount; i < mo->propertyCount(); i++) {
57         QMetaProperty property = mo->property(i);
58         QString optionName = QString::fromUtf8(property.name()).replace(QChar('_'), QChar('-'));
59         switch (property.type()) {
60         case QVariant::Bool:
61             parser.addOption(QCommandLineOption(optionName));
62             break;
63         case QVariant::String:
64             parser.addOption(QCommandLineOption(optionName, QString(), optionName, property.read(this).toString()));
65             break;
66         case QMetaType::QVariant:
67             if (defaultPropertyName.isNull()) {
68                 int classInfoIndex = mo->indexOfClassInfo("DefaultProperty");
69                 if (classInfoIndex > -1) {
70                     QMetaClassInfo classInfo = mo->classInfo(classInfoIndex);
71                     defaultPropertyName = QByteArray(classInfo.value());
72                     parser.addPositionalArgument(QString::fromUtf8(defaultPropertyName), QString());
73                 }
74             }
75             break;
76         default:
77             qWarning() << "type" << property.type() << "not supported yet.";
78             break;
79         }
80     }
81
82     QStringList args = QCoreApplication::arguments();
83     args.removeFirst();
84     parser.process(args);
85
86     for (int i = propertyCount; i < mo->propertyCount(); i++) {
87         QMetaProperty property = mo->property(i);
88         QString optionName = QString::fromUtf8(property.name()).replace(QChar('_'), QChar('-'));
89         if (defaultPropertyName == property.name()) {
90             property.write(this, parser.positionalArguments());
91         } else if (parser.isSet(optionName)) {
92             switch (property.type()) {
93             case QVariant::Bool:
94                 property.write(this, true);
95                 break;
96             case QVariant::String:
97                 property.write(this, parser.value(optionName));
98                 break;
99             default:
100                 break;
101             }
102         }
103     }
104 }