diff options
Diffstat (limited to 'examples/network/dnslookup/dnslookup.cpp')
-rw-r--r-- | examples/network/dnslookup/dnslookup.cpp | 214 |
1 files changed, 93 insertions, 121 deletions
diff --git a/examples/network/dnslookup/dnslookup.cpp b/examples/network/dnslookup/dnslookup.cpp index 61f8d35a3d..9e74ddcf42 100644 --- a/examples/network/dnslookup/dnslookup.cpp +++ b/examples/network/dnslookup/dnslookup.cpp @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 Jeremy Lainé <jeremy.laine@m4x.org> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "dnslookup.h" @@ -58,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); @@ -104,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] @@ -169,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(); @@ -210,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(); @@ -222,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(); } |