MythTV master
mythcommandlineparser.h
Go to the documentation of this file.
1#ifndef MYTHCOMMANDLINEPARSER_H
2#define MYTHCOMMANDLINEPARSER_H
3
4#include <cstdint> // for uint64_t
5#include <utility>
6
7#include <QStringList>
8#include <QDateTime>
9#include <QSize>
10#include <QMap>
11#include <QString>
12#include <QVariant>
13
14#include "mythbaseexp.h"
15#include "referencecounter.h"
16#include "verbosedefs.h"
17
19class TestCommandLineParser;
20
22{
23 public:
24 CommandLineArg(const QString& name, QMetaType::Type type, QVariant def,
25 QString help, QString longhelp);
26 CommandLineArg(const QString& name, QMetaType::Type type, QVariant def);
27 explicit CommandLineArg(const QString& name);
28 ~CommandLineArg() override = default;
29
30 CommandLineArg* SetGroup(const QString &group) { m_group = group;
31 return this; }
32 void AddKeyword(const QString &keyword) { m_keywords << keyword; }
33
34 QString GetName(void) const { return m_name; }
35 QString GetUsedKeyword(void) const { return m_usedKeyword; }
36 int GetKeywordLength(void) const;
37 QString GetHelpString(int off, const QString& group = "",
38 bool force = false) const;
39 QString GetLongHelpString(QString keyword) const;
40
41 bool Set(const QString& opt);
42 bool Set(const QString& opt, const QByteArray& val);
43 void Set(const QVariant& val) { m_stored = val;
44 m_given = true; }
45
46 CommandLineArg* SetParent(const QString &opt);
47 CommandLineArg* SetParent(const QStringList& opts);
48 CommandLineArg* SetParentOf(const QString &opt);
49 CommandLineArg* SetParentOf(const QStringList& opts);
50
51 CommandLineArg* SetChild(const QString& opt);
52 CommandLineArg* SetChild(const QStringList& opt);
53 CommandLineArg* SetChildOf(const QString& opt);
54 CommandLineArg* SetChildOf(const QStringList& opts);
55
56 CommandLineArg* SetRequiredChild(const QString& opt);
57 CommandLineArg* SetRequiredChild(const QStringList& opt);
58 CommandLineArg* SetRequiredChildOf(const QString& opt);
59 CommandLineArg* SetRequiredChildOf(const QStringList& opt);
60
61 CommandLineArg* SetRequires(const QString &opt);
62 CommandLineArg* SetRequires(const QStringList& opts);
63 CommandLineArg* SetBlocks(const QString &opt);
64 CommandLineArg* SetBlocks(const QStringList& opts);
65
66 CommandLineArg* SetDeprecated(QString depstr = "");
67 CommandLineArg* SetRemoved(QString remstr = "", QString remver = "");
68
69 static void AllowOneOf(const QList<CommandLineArg*>& args);
70
71 void PrintVerbose(void) const;
72
74
75 private:
76 QString GetKeywordString(void) const;
77
78 void SetParentOf(CommandLineArg *other, bool forward = true);
79 void SetChildOf(CommandLineArg *other, bool forward = true);
80 void SetRequires(CommandLineArg *other, bool forward = true);
81 void SetBlocks(CommandLineArg *other, bool forward = true);
82
83 void Convert(void);
84
85 QString GetPreferredKeyword(void) const;
86 bool TestLinks(void) const;
87 void CleanupLinks(void);
88
89 void PrintRemovedWarning(QString &keyword) const;
90 void PrintDeprecatedWarning(QString &keyword) const;
91
92 bool m_given {false};
93 bool m_converted {false};
94 QString m_name;
95 QString m_group;
96 QString m_deprecated;
97 QString m_removed;
99 QMetaType::Type m_type {QMetaType::UnknownType};
100 QVariant m_default;
101 QVariant m_stored;
102
103 QStringList m_keywords;
105
106 QList<CommandLineArg*> m_parents;
107 QList<CommandLineArg*> m_children;
108 QList<CommandLineArg*> m_requires;
109 QList<CommandLineArg*> m_requiredby;
110 QList<CommandLineArg*> m_blocks;
111
112 QString m_help;
113 QString m_longhelp;
114};
115
117{
118 public:
120
121 enum class Result : std::uint8_t {
122 kEnd = 0,
123 kEmpty = 1,
124 kOptOnly = 2,
125 kOptVal = 3,
126 kCombOptVal = 4,
127 kArg = 5,
128 kPassthrough = 6,
129 kInvalid = 7
130 };
131
132 static QStringList MythSplitCommandString(const QString &line); // used in MythExternRecApp
133
134 explicit MythCommandLineParser(QString appname);
135 virtual ~MythCommandLineParser();
136
137 virtual void LoadArguments(void) {}
138 static void PrintVersion(void) ;
139 void PrintHelp(void) const;
140 QString GetHelpString(void) const;
141
142 static const char* NamedOptType(Result type);
143 virtual bool Parse(int argc, const char * const * argv);
144
145// overloaded add constructors for single string options
146 // bool with default
147 CommandLineArg* add(const QString& arg, const QString& name, bool def,
148 QString help, QString longhelp);
149 // int
150 CommandLineArg* add(const QString& arg, const QString& name, int def,
151 QString help, QString longhelp);
152 // uint
153 CommandLineArg* add(const QString& arg, const QString& name, uint def,
154 QString help, QString longhelp);
155 // long long
156 CommandLineArg* add(const QString& arg, const QString& name, long long def,
157 QString help, QString longhelp);
158 // double
159 CommandLineArg* add(const QString& arg, const QString& name, double def,
160 QString help, QString longhelp);
161 // const char *
162 CommandLineArg* add(const QString& arg, const QString& name, const char *def,
163 QString help, QString longhelp);
164 // QString
165 CommandLineArg* add(const QString& arg, const QString& name, const QString& def,
166 QString help, QString longhelp);
167 // QSize
168 CommandLineArg* add(const QString& arg, const QString& name, QSize def,
169 QString help, QString longhelp);
170 // QDateTime
171 CommandLineArg* add(const QString& arg, const QString& name, const QDateTime& def,
172 QString help, QString longhelp);
173 // anything else
174 CommandLineArg* add(const QString& arg, const QString& name, QMetaType::Type type,
175 QString help, QString longhelp);
176 // anything else with default
177 CommandLineArg* add(const QString& arg, const QString& name, QMetaType::Type type,
178 QVariant def, QString help, QString longhelp);
179
180// overloaded add constructors for multi-string options
181 // bool with default
182 CommandLineArg* add(QStringList arglist, const QString& name, bool def,
183 QString help, QString longhelp);
184 // int
185 CommandLineArg* add(QStringList arglist, const QString& name, int def,
186 QString help, QString longhelp);
187 // uint
188 CommandLineArg* add(QStringList arglist, const QString& name, uint def,
189 QString help, QString longhelp);
190 // long long
191 CommandLineArg* add(QStringList arglist, const QString& name, long long def,
192 QString help, QString longhelp);
193 // float
194 CommandLineArg* add(QStringList arglist, const QString& name, double def,
195 QString help, QString longhelp);
196 // const char *
197 CommandLineArg* add(QStringList arglist, const QString& name, const char *def,
198 QString help, QString longhelp);
199 // QString
200 CommandLineArg* add(QStringList arglist, const QString& name, const QString& def,
201 QString help, QString longhelp);
202 // QSize
203 CommandLineArg* add(QStringList arglist, const QString& name, QSize def,
204 QString help, QString longhelp);
205 // QDateTime
206 CommandLineArg* add(QStringList arglist, const QString& name, const QDateTime& def,
207 QString help, QString longhelp);
208 // anything else
209 CommandLineArg* add(QStringList arglist, const QString& name, QMetaType::Type type,
210 QString help, QString longhelp);
211 // anything else with default
212 CommandLineArg* add(QStringList arglist, const QString& name, QMetaType::Type type,
213 QVariant def, QString help, QString longhelp);
214
215 QVariant operator[](const QString &name);
216 QStringList GetArgs(void) const;
217 QMap<QString,QString> GetExtra(void) const;
218 QString GetPassthrough(void) const;
219 QMap<QString,QString> GetSettingsOverride(void);
220 QString GetLogFilePath(void);
221 int GetSyslogFacility(void) const;
222 LogLevel_t GetLogLevel(void) const;
223 QString GetAppName(void) const { return m_appname; }
224
225 bool toBool(const QString& key) const;
226 int toInt(const QString& key) const;
227 uint toUInt(const QString& key) const;
228 long long toLongLong(const QString& key) const;
229 double toDouble(const QString& key) const;
230 QSize toSize(const QString& key) const;
231 QString toString(const QString& key) const;
232 QStringList toStringList(const QString& key, const QString& sep = "") const;
233 QMap<QString,QString> toMap(const QString& key) const;
234 QDateTime toDateTime(const QString& key) const;
235
236 bool SetValue(const QString &key, const QVariant& value);
237 int ConfigureLogging(const QString& mask = "general",
238 bool progress = false);
239 void ApplySettingsOverride(void);
240 int Daemonize(void) const;
241
242 protected:
243 void allowArgs(bool allow=true);
244 void allowExtras(bool allow=true);
245 void allowPassthrough(bool allow=true);
246
247 void addHelp(void);
248 void addVersion(void);
249 void addWindowed(void);
250 void addMouse(void);
251 void addDaemon(void);
252 void addSettingsOverride(void);
253 void addRecording(void);
254 void addGeometry(void);
255 void addDisplay(void);
256 void addUPnP(void);
257 void addDVBv3(void);
258 void addLogging(const QString &defaultVerbosity = "general",
259 LogLevel_t defaultLogLevel = LOG_INFO);
260 void addPIDFile(void);
261 void addJob(void);
262 void addInFile(bool addOutFile = false);
263 void addPlatform(void);
264
265 virtual QString GetHelpHeader(void) const { return ""; }
266
267 private:
268 Result getOpt(int argc, const char * const * argv, int &argpos,
269 QString &opt, QByteArray &val);
270 bool ReconcileLinks(void);
271
272 QString m_appname;
273 QMap<QString,CommandLineArg*> m_optionedArgs;
274 QMap<QString,CommandLineArg*> m_namedArgs;
275 bool m_passthroughActive {false};
276 bool m_overridesImported {false};
277 bool m_verbose {false};
278};
279
281
282#endif
Definition for a single command line option.
QList< CommandLineArg * > m_requiredby
void Set(const QVariant &val)
QString GetUsedKeyword(void) const
CommandLineArg * SetGroup(const QString &group)
QList< CommandLineArg * > m_children
QList< CommandLineArg * > m_blocks
QList< CommandLineArg * > m_requires
~CommandLineArg() override=default
QString GetName(void) const
void AddKeyword(const QString &keyword)
QList< CommandLineArg * > m_parents
Parent class for defining application command line parsers.
QMap< QString, CommandLineArg * > m_optionedArgs
QMap< QString, CommandLineArg * > m_namedArgs
QString GetAppName(void) const
virtual QString GetHelpHeader(void) const
virtual void LoadArguments(void)
General purpose reference counter.
unsigned int uint
Definition: compat.h:60
#define MBASE_PUBLIC
Definition: mythbaseexp.h:8
Q_DECLARE_METATYPE(std::chrono::seconds)
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:93