diff options
Diffstat (limited to 'examples/network/dnslookup/dnslookup.cpp')
-rw-r--r-- | examples/network/dnslookup/dnslookup.cpp | 163 |
1 files changed, 91 insertions, 72 deletions
diff --git a/examples/network/dnslookup/dnslookup.cpp b/examples/network/dnslookup/dnslookup.cpp index 91311b26b8..9e74ddcf42 100644 --- a/examples/network/dnslookup/dnslookup.cpp +++ b/examples/network/dnslookup/dnslookup.cpp @@ -11,43 +11,51 @@ #include <QCommandLineParser> #include <QCommandLineOption> -#include <stdio.h> +#include <cstdio> -static int typeFromParameter(const QString &type) +using namespace Qt::StringLiterals; + +static std::optional<QDnsLookup::Type> typeFromParameter(QStringView type) { - if (type == "a") + if (type.compare(u"a", Qt::CaseInsensitive) == 0) return QDnsLookup::A; - if (type == "aaaa") + if (type.compare(u"aaaa", Qt::CaseInsensitive) == 0) return QDnsLookup::AAAA; - if (type == "any") + if (type.compare(u"any", Qt::CaseInsensitive) == 0) return QDnsLookup::ANY; - if (type == "cname") + if (type.compare(u"cname", Qt::CaseInsensitive) == 0) return QDnsLookup::CNAME; - if (type == "mx") + if (type.compare(u"mx", Qt::CaseInsensitive) == 0) return QDnsLookup::MX; - if (type == "ns") + if (type.compare(u"ns", Qt::CaseInsensitive) == 0) return QDnsLookup::NS; - if (type == "ptr") + if (type.compare(u"ptr", Qt::CaseInsensitive) == 0) return QDnsLookup::PTR; - if (type == "srv") + if (type.compare(u"srv", Qt::CaseInsensitive) == 0) return QDnsLookup::SRV; - if (type == "txt") + if (type.compare(u"txt", Qt::CaseInsensitive) == 0) return QDnsLookup::TXT; - return -1; + return std::nullopt; } //! [0] -enum CommandLineParseResult +struct CommandLineParseResult { - CommandLineOk, - CommandLineError, - CommandLineVersionRequested, - CommandLineHelpRequested + enum class Status { + Ok, + Error, + VersionRequested, + HelpRequested + }; + Status statusCode = Status::Ok; + std::optional<QString> errorString = std::nullopt; }; -CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *query, QString *errorMessage) +CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *query) { + using Status = CommandLineParseResult::Status; + parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); const QCommandLineOption nameServerOption("n", "The name server to use.", "nameserver"); parser.addOption(nameServerOption); @@ -57,48 +65,41 @@ CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *qu const QCommandLineOption helpOption = parser.addHelpOption(); const QCommandLineOption versionOption = parser.addVersionOption(); - if (!parser.parse(QCoreApplication::arguments())) { - *errorMessage = parser.errorText(); - return CommandLineError; - } + if (!parser.parse(QCoreApplication::arguments())) + return { Status::Error, parser.errorText() }; if (parser.isSet(versionOption)) - return CommandLineVersionRequested; + return { Status::VersionRequested }; if (parser.isSet(helpOption)) - return CommandLineHelpRequested; + return { Status::HelpRequested }; 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 (query->nameServer.isNull() + || query->nameServer.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) { + return { Status::Error, + u"Bad nameserver address: %1"_s.arg(nameserver) }; } } 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; - } - query->type = static_cast<QDnsLookup::Type>(type); + if (std::optional<QDnsLookup::Type> type = typeFromParameter(typeParameter)) + query->type = *type; + else + return { Status::Error, u"Bad record type: %1"_s.arg(typeParameter) }; } 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; - } + if (positionalArguments.isEmpty()) + return { Status::Error, u"Argument 'name' missing."_s }; + if (positionalArguments.size() > 1) + return { Status::Error, u"Several 'name' arguments specified."_s }; query->name = positionalArguments.first(); - return CommandLineOk; + return { Status::Ok }; } //! [0] @@ -122,39 +123,52 @@ void DnsManager::execute() void DnsManager::showResults() { if (dns->error() != QDnsLookup::NoError) - printf("Error: %i (%s)\n", dns->error(), qPrintable(dns->errorString())); + std::printf("Error: %i (%s)\n", dns->error(), qPrintable(dns->errorString())); // CNAME records const QList<QDnsDomainNameRecord> cnameRecords = dns->canonicalNameRecords(); - for (const QDnsDomainNameRecord &record : cnameRecords) - printf("%s\t%i\tIN\tCNAME\t%s\n", qPrintable(record.name()), record.timeToLive(), qPrintable(record.value())); + for (const QDnsDomainNameRecord &record : cnameRecords) { + std::printf("%s\t%i\tIN\tCNAME\t%s\n", qPrintable(record.name()), record.timeToLive(), + qPrintable(record.value())); + } // A and AAAA records const QList<QDnsHostAddressRecord> aRecords = dns->hostAddressRecords(); for (const QDnsHostAddressRecord &record : aRecords) { - const char *type = (record.value().protocol() == QAbstractSocket::IPv6Protocol) ? "AAAA" : "A"; - printf("%s\t%i\tIN\t%s\t%s\n", qPrintable(record.name()), record.timeToLive(), type, qPrintable(record.value().toString())); + const char *type = + (record.value().protocol() == QAbstractSocket::IPv6Protocol) ? "AAAA" : "A"; + std::printf("%s\t%i\tIN\t%s\t%s\n", qPrintable(record.name()), record.timeToLive(), type, + qPrintable(record.value().toString())); } // MX records const QList<QDnsMailExchangeRecord> mxRecords = dns->mailExchangeRecords(); - for (const QDnsMailExchangeRecord &record : mxRecords) - printf("%s\t%i\tIN\tMX\t%u %s\n", qPrintable(record.name()), record.timeToLive(), record.preference(), qPrintable(record.exchange())); + for (const QDnsMailExchangeRecord &record : mxRecords) { + std::printf("%s\t%i\tIN\tMX\t%u %s\n", qPrintable(record.name()), record.timeToLive(), + record.preference(), qPrintable(record.exchange())); + } // NS records const QList<QDnsDomainNameRecord> nsRecords = dns->nameServerRecords(); - for (const QDnsDomainNameRecord &record : nsRecords) - printf("%s\t%i\tIN\tNS\t%s\n", qPrintable(record.name()), record.timeToLive(), qPrintable(record.value())); + for (const QDnsDomainNameRecord &record : nsRecords) { + std::printf("%s\t%i\tIN\tNS\t%s\n", qPrintable(record.name()), record.timeToLive(), + qPrintable(record.value())); + } // PTR records const QList<QDnsDomainNameRecord> ptrRecords = dns->pointerRecords(); - for (const QDnsDomainNameRecord &record : ptrRecords) - printf("%s\t%i\tIN\tPTR\t%s\n", qPrintable(record.name()), record.timeToLive(), qPrintable(record.value())); + for (const QDnsDomainNameRecord &record : ptrRecords) { + std::printf("%s\t%i\tIN\tPTR\t%s\n", qPrintable(record.name()), record.timeToLive(), + qPrintable(record.value())); + } // SRV records const QList<QDnsServiceRecord> srvRecords = dns->serviceRecords(); - for (const QDnsServiceRecord &record : srvRecords) - printf("%s\t%i\tIN\tSRV\t%u %u %u %s\n", qPrintable(record.name()), record.timeToLive(), record.priority(), record.weight(), record.port(), qPrintable(record.target())); + for (const QDnsServiceRecord &record : srvRecords) { + std::printf("%s\t%i\tIN\tSRV\t%u %u %u %s\n", qPrintable(record.name()), + record.timeToLive(), record.priority(), record.weight(), record.port(), + qPrintable(record.target())); + } // TXT records const QList<QDnsTextRecord> txtRecords = dns->textRecords(); @@ -163,7 +177,8 @@ void DnsManager::showResults() const QList<QByteArray> dnsRecords = record.values(); for (const QByteArray &ba : dnsRecords) values << "\"" + QString::fromLatin1(ba) + "\""; - printf("%s\t%i\tIN\tTXT\t%s\n", qPrintable(record.name()), record.timeToLive(), qPrintable(values.join(' '))); + std::printf("%s\t%i\tIN\tTXT\t%s\n", qPrintable(record.name()), record.timeToLive(), + qPrintable(values.join(' '))); } QCoreApplication::instance()->quit(); @@ -175,32 +190,36 @@ int main(int argc, char *argv[]) //! [1] QCoreApplication::setApplicationVersion(QT_VERSION_STR); - QCoreApplication::setApplicationName(QCoreApplication::translate("QDnsLookupExample", "DNS Lookup Example")); + QCoreApplication::setApplicationName(QCoreApplication::translate("QDnsLookupExample", + "DNS Lookup Example")); QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("QDnsLookupExample", "An example demonstrating the class QDnsLookup.")); + parser.setApplicationDescription(QCoreApplication::translate("QDnsLookupExample", + "An example demonstrating the " + "class QDnsLookup.")); DnsQuery query; - QString errorMessage; - switch (parseCommandLine(parser, &query, &errorMessage)) { - case CommandLineOk: + using Status = CommandLineParseResult::Status; + CommandLineParseResult parseResult = parseCommandLine(parser, &query); + switch (parseResult.statusCode) { + case Status::Ok: break; - case CommandLineError: - fputs(qPrintable(errorMessage), stderr); - fputs("\n\n", stderr); - fputs(qPrintable(parser.helpText()), stderr); + case Status::Error: + std::fputs(qPrintable(parseResult.errorString.value_or(u"Unknown error occurred"_s)), + stderr); + std::fputs("\n\n", stderr); + std::fputs(qPrintable(parser.helpText()), stderr); return 1; - case CommandLineVersionRequested: - printf("%s %s\n", qPrintable(QCoreApplication::applicationName()), - qPrintable(QCoreApplication::applicationVersion())); - return 0; - case CommandLineHelpRequested: + case Status::VersionRequested: + parser.showVersion(); + Q_UNREACHABLE_RETURN(0); + case Status::HelpRequested: parser.showHelp(); - Q_UNREACHABLE(); + Q_UNREACHABLE_RETURN(0); } //! [1] DnsManager manager; manager.setQuery(query); - QTimer::singleShot(0, &manager, SLOT(execute())); + QTimer::singleShot(0, &manager, &DnsManager::execute); return app.exec(); } |