00001
00002
00003 #include <QStringList>
00004 #include <QDateTime>
00005 #include <QSize>
00006 #include <QMap>
00007 #include <QString>
00008 #include <QVariant>
00009
00010 #include <stdint.h>
00011
00012 #include "mythbaseexp.h"
00013 #include "mythlogging.h"
00014 #include "referencecounter.h"
00015
00016 class MythCommandLineParser;
00017
00018 class MBASE_PUBLIC CommandLineArg : public ReferenceCounter
00019 {
00020 public:
00021 CommandLineArg(QString name, QVariant::Type type, QVariant def,
00022 QString help, QString longhelp);
00023 CommandLineArg(QString name, QVariant::Type type, QVariant def);
00024 CommandLineArg(QString name);
00025 ~CommandLineArg() {};
00026
00027 CommandLineArg* SetGroup(QString group) { m_group = group;
00028 return this; }
00029 void AddKeyword(QString keyword) { m_keywords << keyword; }
00030
00031 QString GetName(void) const { return m_name; }
00032 int GetKeywordLength(void) const;
00033 QString GetHelpString(int off, QString group = "",
00034 bool force = false) const;
00035 QString GetLongHelpString(QString keyword) const;
00036
00037 bool Set(QString opt);
00038 bool Set(QString opt, QByteArray val);
00039 void Set(QVariant val) { m_stored = val;
00040 m_given = true; }
00041
00042 CommandLineArg* SetParent(QString opt);
00043 CommandLineArg* SetParent(QStringList opts);
00044 CommandLineArg* SetParentOf(QString opt);
00045 CommandLineArg* SetParentOf(QStringList opts);
00046
00047 CommandLineArg* SetChild(QString opt);
00048 CommandLineArg* SetChild(QStringList opt);
00049 CommandLineArg* SetChildOf(QString opt);
00050 CommandLineArg* SetChildOf(QStringList opts);
00051
00052 CommandLineArg* SetRequiredChild(QString opt);
00053 CommandLineArg* SetRequiredChild(QStringList opt);
00054 CommandLineArg* SetRequiredChildOf(QString opt);
00055 CommandLineArg* SetRequiredChildOf(QStringList opt);
00056
00057 CommandLineArg* SetRequires(QString opt);
00058 CommandLineArg* SetRequires(QStringList opts);
00059 CommandLineArg* SetBlocks(QString opt);
00060 CommandLineArg* SetBlocks(QStringList opts);
00061
00062 CommandLineArg* SetDeprecated(QString depstr = "");
00063 CommandLineArg* SetRemoved(QString remstr = "", QString remver = "");
00064
00065 static void AllowOneOf(QList<CommandLineArg*> args);
00066
00067 void PrintVerbose(void) const;
00068
00069 friend class MythCommandLineParser;
00070
00071 private:
00072 QString GetKeywordString(void) const;
00073
00074 void SetParentOf(CommandLineArg *other, bool forward = true);
00075 void SetChildOf(CommandLineArg *other, bool forward = true);
00076 void SetRequires(CommandLineArg *other, bool forward = true);
00077 void SetBlocks(CommandLineArg *other, bool forward = true);
00078
00079 void Convert(void);
00080
00081 QString GetPreferredKeyword(void) const;
00082 bool TestLinks(void) const;
00083 void CleanupLinks(void);
00084
00085 void PrintRemovedWarning(QString &keyword) const;
00086 void PrintDeprecatedWarning(QString &keyword) const;
00087
00088 bool m_given;
00089 bool m_converted;
00090 QString m_name;
00091 QString m_group;
00092 QString m_deprecated;
00093 QString m_removed;
00094 QString m_removedversion;
00095 QVariant::Type m_type;
00096 QVariant m_default;
00097 QVariant m_stored;
00098
00099 QStringList m_keywords;
00100 QString m_usedKeyword;
00101
00102 QList<CommandLineArg*> m_parents;
00103 QList<CommandLineArg*> m_children;
00104 QList<CommandLineArg*> m_requires;
00105 QList<CommandLineArg*> m_requiredby;
00106 QList<CommandLineArg*> m_blocks;
00107
00108 QString m_help;
00109 QString m_longhelp;
00110 };
00111
00112 class MBASE_PUBLIC MythCommandLineParser
00113 {
00114 public:
00115 MythCommandLineParser(QString);
00116 ~MythCommandLineParser();
00117
00118 virtual void LoadArguments(void) {};
00119 void PrintVersion(void) const;
00120 void PrintHelp(void) const;
00121 QString GetHelpString(void) const;
00122 virtual QString GetHelpHeader(void) const { return ""; }
00123
00124 virtual bool Parse(int argc, const char * const * argv);
00125
00126
00127
00128 CommandLineArg* add(QString arg, QString name, bool def,
00129 QString help, QString longhelp)
00130 { return add(QStringList(arg), name, QVariant::Bool,
00131 QVariant(def), help, longhelp); }
00132
00133 CommandLineArg* add(QString arg, QString name, int def,
00134 QString help, QString longhelp)
00135 { return add(QStringList(arg), name, QVariant::Int,
00136 QVariant(def), help, longhelp); }
00137
00138 CommandLineArg* add(QString arg, QString name, uint def,
00139 QString help, QString longhelp)
00140 { return add(QStringList(arg), name, QVariant::UInt,
00141 QVariant(def), help, longhelp); }
00142
00143 CommandLineArg* add(QString arg, QString name, long long def,
00144 QString help, QString longhelp)
00145 { return add(QStringList(arg), name, QVariant::LongLong,
00146 QVariant(def), help, longhelp); }
00147
00148 CommandLineArg* add(QString arg, QString name, double def,
00149 QString help, QString longhelp)
00150 { return add(QStringList(arg), name, QVariant::Double,
00151 QVariant(def), help, longhelp); }
00152
00153 CommandLineArg* add(QString arg, QString name, const char *def,
00154 QString help, QString longhelp)
00155 { return add(QStringList(arg), name, QVariant::String,
00156 QVariant(def), help, longhelp); }
00157
00158 CommandLineArg* add(QString arg, QString name, QString def,
00159 QString help, QString longhelp)
00160 { return add(QStringList(arg), name, QVariant::String,
00161 QVariant(def), help, longhelp); }
00162
00163 CommandLineArg* add(QString arg, QString name, QSize def,
00164 QString help, QString longhelp)
00165 { return add(QStringList(arg), name, QVariant::Size,
00166 QVariant(def), help, longhelp); }
00167
00168 CommandLineArg* add(QString arg, QString name, QDateTime def,
00169 QString help, QString longhelp)
00170 { return add(QStringList(arg), name, QVariant::DateTime,
00171 QVariant(def), help, longhelp); }
00172
00173 CommandLineArg* add(QString arg, QString name, QVariant::Type type,
00174 QString help, QString longhelp)
00175 { return add(QStringList(arg), name, type,
00176 QVariant(type), help, longhelp); }
00177
00178 CommandLineArg* add(QString arg, QString name, QVariant::Type type,
00179 QVariant def, QString help, QString longhelp)
00180 { return add(QStringList(arg), name, type,
00181 def, help, longhelp); }
00182
00183
00184
00185 CommandLineArg* add(QStringList arglist, QString name, bool def,
00186 QString help, QString longhelp)
00187 { return add(arglist, name, QVariant::Bool,
00188 QVariant(def), help, longhelp); }
00189
00190 CommandLineArg* add(QStringList arglist, QString name, int def,
00191 QString help, QString longhelp)
00192 { return add(arglist, name, QVariant::Int,
00193 QVariant(def), help, longhelp); }
00194
00195 CommandLineArg* add(QStringList arglist, QString name, uint def,
00196 QString help, QString longhelp)
00197 { return add(arglist, name, QVariant::UInt,
00198 QVariant(def), help, longhelp); }
00199
00200 CommandLineArg* add(QStringList arglist, QString name, long long def,
00201 QString help, QString longhelp)
00202 { return add(arglist, name, QVariant::LongLong,
00203 QVariant(def), help, longhelp); }
00204
00205 CommandLineArg* add(QStringList arglist, QString name, double def,
00206 QString help, QString longhelp)
00207 { return add(arglist, name, QVariant::Double,
00208 QVariant(def), help, longhelp); }
00209
00210 CommandLineArg* add(QStringList arglist, QString name, const char *def,
00211 QString help, QString longhelp)
00212 { return add(arglist, name, QVariant::String,
00213 QVariant(def), help, longhelp); }
00214
00215 CommandLineArg* add(QStringList arglist, QString name, QString def,
00216 QString help, QString longhelp)
00217 { return add(arglist, name, QVariant::String,
00218 QVariant(def), help, longhelp); }
00219
00220 CommandLineArg* add(QStringList arglist, QString name, QSize def,
00221 QString help, QString longhelp)
00222 { return add(arglist, name, QVariant::Size,
00223 QVariant(def), help, longhelp); }
00224
00225 CommandLineArg* add(QStringList arglist, QString name, QDateTime def,
00226 QString help, QString longhelp)
00227 { return add(arglist, name, QVariant::DateTime,
00228 QVariant(def), help, longhelp); }
00229
00230 CommandLineArg* add(QStringList arglist, QString name, QVariant::Type type,
00231 QString help, QString longhelp)
00232 { return add(arglist, name, type,
00233 QVariant(type), help, longhelp); }
00234
00235 CommandLineArg* add(QStringList arglist, QString name, QVariant::Type type,
00236 QVariant def, QString help, QString longhelp);
00237
00238 QVariant operator[](const QString &name);
00239 QStringList GetArgs(void) const;
00240 QMap<QString,QString> GetExtra(void) const;
00241 QString GetPassthrough(void) const;
00242 QMap<QString,QString> GetSettingsOverride(void);
00243 QString GetLogFilePath(void);
00244 int GetSyslogFacility(void);
00245 LogLevel_t GetLogLevel(void);
00246
00247 bool toBool(QString key) const;
00248 int toInt(QString key) const;
00249 uint toUInt(QString key) const;
00250 long long toLongLong(QString key) const;
00251 double toDouble(QString key) const;
00252 QSize toSize(QString key) const;
00253 QString toString(QString key) const;
00254 QStringList toStringList(QString key, QString sep = "") const;
00255 QMap<QString,QString> toMap(QString key) const;
00256 QDateTime toDateTime(QString key) const;
00257
00258 bool SetValue(const QString &key, QVariant value);
00259 int ConfigureLogging(QString mask = "general",
00260 unsigned int progress = 0);
00261 void ApplySettingsOverride(void);
00262 int Daemonize(void);
00263
00264 protected:
00265 void allowArgs(bool allow=true);
00266 void allowExtras(bool allow=true);
00267 void allowPassthrough(bool allow=true);
00268
00269 void addHelp(void);
00270 void addVersion(void);
00271 void addWindowed(void);
00272 void addMouse(void);
00273 void addDaemon(void);
00274 void addSettingsOverride(void);
00275 void addRecording(void);
00276 void addGeometry(void);
00277 void addDisplay(void);
00278 void addUPnP(void);
00279 void addLogging(const QString &defaultVerbosity = "general",
00280 LogLevel_t defaultLogLevel = LOG_INFO);
00281 void addPIDFile(void);
00282 void addJob(void);
00283 void addInFile(bool addOutFile = false);
00284
00285 private:
00286 int getOpt(int argc, const char * const * argv, int &argpos,
00287 QString &opt, QByteArray &val);
00288 bool ReconcileLinks(void);
00289
00290 QString m_appname;
00291 QMap<QString,CommandLineArg*> m_optionedArgs;
00292 QMap<QString,CommandLineArg*> m_namedArgs;
00293 bool m_passthroughActive;
00294 bool m_overridesImported;
00295 bool m_verbose;
00296 };
00297