From 51e5378113ac185ce9b3f64417416243050f6335 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 11 Mar 2014 09:35:35 +0100 Subject: Use QCommandLineParser in example dnslookup. Show how use QCommandLineParser with additional parameter checking for custom options and positional arguments. Also explain how to display help in GUI applications. Change-Id: I03513e09b7dd5b150259593da0af2ef2a281cab2 Reviewed-by: David Faure --- examples/network/dnslookup/dnslookup.cpp | 171 ++++++++++++++++++++++--------- examples/network/dnslookup/dnslookup.h | 20 +++- 2 files changed, 136 insertions(+), 55 deletions(-) (limited to 'examples') diff --git a/examples/network/dnslookup/dnslookup.cpp b/examples/network/dnslookup/dnslookup.cpp index 202a5f9580..003a3e3028 100644 --- a/examples/network/dnslookup/dnslookup.cpp +++ b/examples/network/dnslookup/dnslookup.cpp @@ -45,71 +45,114 @@ #include #include #include +#include +#include #include -static void usage() { - printf("Qt DNS example - performs DNS lookups\n" - "Usage: dnslookup [-t ] [-s nameserver] name\n\n"); +static int typeFromParameter(const QString &type) +{ + if (type == "a") + return QDnsLookup::A; + if (type == "aaaa") + return QDnsLookup::AAAA; + if (type == "any") + return QDnsLookup::ANY; + if (type == "cname") + return QDnsLookup::CNAME; + if (type == "mx") + return QDnsLookup::MX; + if (type == "ns") + return QDnsLookup::NS; + if (type == "ptr") + return QDnsLookup::PTR; + if (type == "srv") + return QDnsLookup::SRV; + if (type == "txt") + return QDnsLookup::TXT; + return -1; } -DnsManager::DnsManager() +//! [0] + +enum CommandLineParseResult { - dns = new QDnsLookup(this); - connect(dns, SIGNAL(finished()), this, SLOT(showResults())); -} + CommandLineOk, + CommandLineError, + CommandLineVersionRequested, + CommandLineHelpRequested +}; -void DnsManager::execute() +CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *query, QString *errorMessage) { - QStringList args = QCoreApplication::instance()->arguments(); - args.takeFirst(); + parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); + const QCommandLineOption nameServerOption("n", "The name server to use.", "nameserver"); + parser.addOption(nameServerOption); + const QCommandLineOption typeOption("t", "The lookup type.", "type"); + parser.addOption(typeOption); + parser.addPositionalArgument("name", "The name to look up."); + const QCommandLineOption helpOption = parser.addHelpOption(); + const QCommandLineOption versionOption = parser.addVersionOption(); + + if (!parser.parse(QCoreApplication::arguments())) { + *errorMessage = parser.errorText(); + return CommandLineError; + } - // lookup type - dns->setType(QDnsLookup::A); - if (args.size() > 1 && args.first() == "-t") { - args.takeFirst(); - const QString type = args.takeFirst().toLower(); - if (type == "a") - dns->setType(QDnsLookup::A); - else if (type == "aaaa") - dns->setType(QDnsLookup::AAAA); - else if (type == "any") - dns->setType(QDnsLookup::ANY); - else if (type == "cname") - dns->setType(QDnsLookup::CNAME); - else if (type == "mx") - dns->setType(QDnsLookup::MX); - else if (type == "ns") - dns->setType(QDnsLookup::NS); - else if (type == "ptr") - dns->setType(QDnsLookup::PTR); - else if (type == "srv") - dns->setType(QDnsLookup::SRV); - else if (type == "txt") - dns->setType(QDnsLookup::TXT); - else { - printf("Bad record type: %s\n", qPrintable(type)); - QCoreApplication::instance()->quit(); - return; + if (parser.isSet(versionOption)) + return CommandLineVersionRequested; + + if (parser.isSet(helpOption)) + return CommandLineHelpRequested; + + if (parser.isSet(nameServerOption)) { + const QString nameserver = parser.value(nameServerOption); + query->nameServer = QHostAddress(nameserver); + if (query->nameServer.isNull() || query->nameServer.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) { + *errorMessage = "Bad nameserver address: " + nameserver; + return CommandLineError; } } - if (args.size() > 1 && args.first() == "-s") { - args.takeFirst(); - const QString ns = args.takeFirst(); - QHostAddress nameserver(ns); - if (nameserver.isNull() || nameserver.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) { - printf("Bad nameserver address: %s\n", qPrintable(ns)); - QCoreApplication::instance()->quit(); - return; + + if (parser.isSet(typeOption)) { + const QString typeParameter = parser.value(typeOption); + const int type = typeFromParameter(typeParameter.toLower()); + if (type < 0) { + *errorMessage = "Bad record type: " + typeParameter; + return CommandLineError; } - dns->setNameserver(nameserver); + query->type = static_cast(type); } - if (args.isEmpty()) { - usage(); - QCoreApplication::instance()->quit(); - return; + + const QStringList positionalArguments = parser.positionalArguments(); + if (positionalArguments.isEmpty()) { + *errorMessage = "Argument 'name' missing."; + return CommandLineError; + } + if (positionalArguments.size() > 1) { + *errorMessage = "Several 'name' arguments specified."; + return CommandLineError; } - dns->setName(args.takeFirst()); + query->name = positionalArguments.first(); + + return CommandLineOk; +} + +//! [0] + +DnsManager::DnsManager() +{ + dns = new QDnsLookup(this); + connect(dns, SIGNAL(finished()), this, SLOT(showResults())); +} + +void DnsManager::execute() +{ + // lookup type + dns->setType(query.type); + if (!query.nameServer.isNull()) + dns->setNameserver(query.nameServer); + dns->setName(query.name); dns->lookup(); } @@ -159,7 +202,33 @@ int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); +//! [1] + QCoreApplication::setApplicationVersion(QT_VERSION_STR); + QCoreApplication::setApplicationName(QCoreApplication::translate("QDnsLookupExample", "DNS Lookup Example")); + QCommandLineParser parser; + parser.setApplicationDescription(QCoreApplication::translate("QDnsLookupExample", "An example demonstrating the class QDnsLookup.")); + DnsQuery query; + QString errorMessage; + switch (parseCommandLine(parser, &query, &errorMessage)) { + case CommandLineOk: + break; + case CommandLineError: + fputs(qPrintable(errorMessage), stderr); + fputs("\n\n", stderr); + fputs(qPrintable(parser.helpText()), stderr); + return 1; + case CommandLineVersionRequested: + printf("%s %s\n", qPrintable(QCoreApplication::applicationName()), + qPrintable(QCoreApplication::applicationVersion())); + return 0; + case CommandLineHelpRequested: + parser.showHelp(); + Q_UNREACHABLE(); + } +//! [1] + DnsManager manager; + manager.setQuery(query); QTimer::singleShot(0, &manager, SLOT(execute())); return app.exec(); diff --git a/examples/network/dnslookup/dnslookup.h b/examples/network/dnslookup/dnslookup.h index d76756bad0..4d0232be8a 100644 --- a/examples/network/dnslookup/dnslookup.h +++ b/examples/network/dnslookup/dnslookup.h @@ -38,11 +38,21 @@ ** ****************************************************************************/ -#include +#include +#include -QT_BEGIN_NAMESPACE -class QDnsLookup; -QT_END_NAMESPACE +//! [0] + +struct DnsQuery +{ + DnsQuery() : type(QDnsLookup::A) {} + + QDnsLookup::Type type; + QHostAddress nameServer; + QString name; +}; + +//! [0] class DnsManager : public QObject { @@ -50,6 +60,7 @@ class DnsManager : public QObject public: DnsManager(); + void setQuery(const DnsQuery &q) { query = q; } public slots: void execute(); @@ -57,5 +68,6 @@ public slots: private: QDnsLookup *dns; + DnsQuery query; }; -- cgit v1.2.3