diff options
Diffstat (limited to 'examples/network/http')
-rw-r--r-- | examples/network/http/CMakeLists.txt | 61 | ||||
-rw-r--r-- | examples/network/http/http.pro | 4 | ||||
-rw-r--r-- | examples/network/http/httpwindow.cpp | 218 | ||||
-rw-r--r-- | examples/network/http/httpwindow.h | 66 | ||||
-rw-r--r-- | examples/network/http/main.cpp | 75 |
5 files changed, 131 insertions, 293 deletions
diff --git a/examples/network/http/CMakeLists.txt b/examples/network/http/CMakeLists.txt index d7ad5adaa6..705c3a0beb 100644 --- a/examples/network/http/CMakeLists.txt +++ b/examples/network/http/CMakeLists.txt @@ -1,49 +1,40 @@ -# Generated from http.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.16) project(http LANGUAGES CXX) -set(CMAKE_INCLUDE_CURRENT_DIR ON) +find_package(Qt6 REQUIRED COMPONENTS Core Gui Network Widgets) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) +qt_standard_project_setup() -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/network/http") - -find_package(Qt6 COMPONENTS Core) -find_package(Qt6 COMPONENTS Gui) -find_package(Qt6 COMPONENTS Network) -find_package(Qt6 COMPONENTS Widgets) - -add_qt_gui_executable(http +qt_add_executable(http authenticationdialog.ui httpwindow.cpp httpwindow.h main.cpp ) -target_link_libraries(http PUBLIC - Qt::Core - Qt::Gui - Qt::Network - Qt::Widgets -) -if(ANDROID AND TARGET Qt::AndroidExtras) - target_compile_definitions(http PUBLIC - REQUEST_PERMISSIONS_ON_ANDROID - ) +set_target_properties(http PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) - target_link_libraries(http PUBLIC - Qt::AndroidExtras - ) -endif() +target_link_libraries(http PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Network + Qt6::Widgets +) install(TARGETS http - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +qt_generate_deploy_app_script( + TARGET http + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR ) +install(SCRIPT ${deploy_script}) diff --git a/examples/network/http/http.pro b/examples/network/http/http.pro index f67cd01495..2f2d3b00ae 100644 --- a/examples/network/http/http.pro +++ b/examples/network/http/http.pro @@ -1,8 +1,4 @@ QT += network widgets -android: qtHaveModule(androidextras) { - QT += androidextras - DEFINES += REQUEST_PERMISSIONS_ON_ANDROID -} HEADERS += httpwindow.h SOURCES += httpwindow.cpp \ diff --git a/examples/network/http/httpwindow.cpp b/examples/network/http/httpwindow.cpp index c7bf0c0dff..72f130734b 100644 --- a/examples/network/http/httpwindow.cpp +++ b/examples/network/http/httpwindow.cpp @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** 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) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "httpwindow.h" @@ -56,6 +9,9 @@ #include <QtNetwork> #include <QUrl> +#include <algorithm> +#include <memory> + #if QT_CONFIG(ssl) const char defaultUrl[] = "https://www.qt.io/"; #else @@ -67,7 +23,6 @@ ProgressDialog::ProgressDialog(const QUrl &url, QWidget *parent) : QProgressDialog(parent) { setWindowTitle(tr("Download Progress")); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setLabelText(tr("Downloading %1.").arg(url.toDisplayString())); setMinimum(0); setValue(0); @@ -75,10 +30,6 @@ ProgressDialog::ProgressDialog(const QUrl &url, QWidget *parent) setMinimumSize(QSize(400, 75)); } -ProgressDialog::~ProgressDialog() -{ -} - void ProgressDialog::networkReplyProgress(qint64 bytesRead, qint64 totalBytes) { setMaximum(totalBytes); @@ -90,27 +41,24 @@ HttpWindow::HttpWindow(QWidget *parent) , statusLabel(new QLabel(tr("Please enter the URL of a file you want to download.\n\n"), this)) , urlLineEdit(new QLineEdit(defaultUrl)) , downloadButton(new QPushButton(tr("Download"))) - , launchCheckBox(new QCheckBox("Launch file")) + , launchCheckBox(new QCheckBox(tr("Launch file"))) , defaultFileLineEdit(new QLineEdit(defaultFileName)) , downloadDirectoryLineEdit(new QLineEdit) - , reply(nullptr) - , file(nullptr) - , httpRequestAborted(false) { - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - setWindowTitle(tr("HTTP")); + setWindowTitle(tr("HTTP Client")); + //! [qnam-auth-required-1] connect(&qnam, &QNetworkAccessManager::authenticationRequired, this, &HttpWindow::slotAuthenticationRequired); -#ifndef QT_NO_SSL - connect(&qnam, &QNetworkAccessManager::sslErrors, - this, &HttpWindow::sslErrors); + //! [qnam-auth-required-1] +#if QT_CONFIG(networkproxy) + connect(&qnam, &QNetworkAccessManager::proxyAuthenticationRequired, + this, &HttpWindow::slotProxyAuthenticationRequired); #endif QFormLayout *formLayout = new QFormLayout; urlLineEdit->setClearButtonEnabled(true); - connect(urlLineEdit, &QLineEdit::textChanged, - this, &HttpWindow::enableDownloadButton); + connect(urlLineEdit, &QLineEdit::textChanged, this, &HttpWindow::enableDownloadButton); formLayout->addRow(tr("&URL:"), urlLineEdit); QString downloadDirectory = QStandardPaths::writableLocation(QStandardPaths::TempLocation); if (downloadDirectory.isEmpty() || !QFileInfo(downloadDirectory).isDir()) @@ -141,25 +89,34 @@ HttpWindow::HttpWindow(QWidget *parent) urlLineEdit->setFocus(); } - -HttpWindow::~HttpWindow() -{ -} +HttpWindow::~HttpWindow() = default; void HttpWindow::startRequest(const QUrl &requestedUrl) { url = requestedUrl; httpRequestAborted = false; - reply = qnam.get(QNetworkRequest(url)); - connect(reply, &QNetworkReply::finished, this, &HttpWindow::httpFinished); - connect(reply, &QIODevice::readyRead, this, &HttpWindow::httpReadyRead); + //! [qnam-download] + reply.reset(qnam.get(QNetworkRequest(url))); + //! [qnam-download] + //! [connecting-reply-to-slots] + connect(reply.get(), &QNetworkReply::finished, this, &HttpWindow::httpFinished); + //! [networkreply-readyread-1] + connect(reply.get(), &QIODevice::readyRead, this, &HttpWindow::httpReadyRead); + //! [networkreply-readyread-1] +#if QT_CONFIG(ssl) + //! [sslerrors-1] + connect(reply.get(), &QNetworkReply::sslErrors, this, &HttpWindow::sslErrors); + //! [sslerrors-1] +#endif + //! [connecting-reply-to-slots] ProgressDialog *progressDialog = new ProgressDialog(url, this); progressDialog->setAttribute(Qt::WA_DeleteOnClose); connect(progressDialog, &QProgressDialog::canceled, this, &HttpWindow::cancelDownload); - connect(reply, &QNetworkReply::downloadProgress, progressDialog, &ProgressDialog::networkReplyProgress); - connect(reply, &QNetworkReply::finished, progressDialog, &ProgressDialog::hide); + connect(reply.get(), &QNetworkReply::downloadProgress, + progressDialog, &ProgressDialog::networkReplyProgress); + connect(reply.get(), &QNetworkReply::finished, progressDialog, &ProgressDialog::hide); progressDialog->show(); statusLabel->setText(tr("Downloading %1...").arg(url.toString())); @@ -187,19 +144,18 @@ void HttpWindow::downloadFile() bool useDirectory = !downloadDirectory.isEmpty() && QFileInfo(downloadDirectory).isDir(); if (useDirectory) fileName.prepend(downloadDirectory + '/'); + if (QFile::exists(fileName)) { - if (QMessageBox::question(this, tr("Overwrite Existing File"), - tr("There already exists a file called %1%2." - " Overwrite?") - .arg(fileName, - useDirectory - ? QString() - : QStringLiteral(" in the current directory")), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No) - == QMessageBox::No) { + QString alreadyExists = useDirectory + ? tr("There already exists a file called %1. Overwrite?") + : tr("There already exists a file called %1 in the current directory. " + "Overwrite?"); + QMessageBox::StandardButton response = QMessageBox::question(this, + tr("Overwrite Existing File"), + alreadyExists.arg(QDir::toNativeSeparators(fileName)), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (response == QMessageBox::No) return; - } QFile::remove(fileName); } @@ -215,7 +171,7 @@ void HttpWindow::downloadFile() std::unique_ptr<QFile> HttpWindow::openFileForWrite(const QString &fileName) { - std::unique_ptr<QFile> file(new QFile(fileName)); + std::unique_ptr<QFile> file = std::make_unique<QFile>(fileName); if (!file->open(QIODevice::WriteOnly)) { QMessageBox::information(this, tr("Error"), tr("Unable to save the file %1: %2.") @@ -243,67 +199,49 @@ void HttpWindow::httpFinished() file.reset(); } - if (httpRequestAborted) { - reply->deleteLater(); - reply = nullptr; - return; - } - - if (reply->error()) { + //! [networkreply-error-handling-1] + QNetworkReply::NetworkError error = reply->error(); + const QString &errorString = reply->errorString(); + //! [networkreply-error-handling-1] + reply.reset(); + //! [networkreply-error-handling-2] + if (error != QNetworkReply::NoError) { QFile::remove(fi.absoluteFilePath()); - statusLabel->setText(tr("Download failed:\n%1.").arg(reply->errorString())); - downloadButton->setEnabled(true); - reply->deleteLater(); - reply = nullptr; - return; - } - - const QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); - - reply->deleteLater(); - reply = nullptr; - - if (!redirectionTarget.isNull()) { - const QUrl redirectedUrl = url.resolved(redirectionTarget.toUrl()); - if (QMessageBox::question(this, tr("Redirect"), - tr("Redirect to %1 ?").arg(redirectedUrl.toString()), - QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { - QFile::remove(fi.absoluteFilePath()); + // For "request aborted" we handle the label and button in cancelDownload() + if (!httpRequestAborted) { + statusLabel->setText(tr("Download failed:\n%1.").arg(errorString)); downloadButton->setEnabled(true); - statusLabel->setText(tr("Download failed:\nRedirect rejected.")); - return; } - file = openFileForWrite(fi.absoluteFilePath()); - if (!file) { - downloadButton->setEnabled(true); - return; - } - startRequest(redirectedUrl); return; } + //! [networkreply-error-handling-2] statusLabel->setText(tr("Downloaded %1 bytes to %2\nin\n%3") - .arg(fi.size()).arg(fi.fileName(), QDir::toNativeSeparators(fi.absolutePath()))); + .arg(fi.size()) + .arg(fi.fileName(), QDir::toNativeSeparators(fi.absolutePath()))); if (launchCheckBox->isChecked()) QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absoluteFilePath())); downloadButton->setEnabled(true); } +//! [networkreply-readyread-2] void HttpWindow::httpReadyRead() { - // this slot gets called every time the QNetworkReply has new data. + // This slot gets called every time the QNetworkReply has new data. // We read all of its new data and write it into the file. // That way we use less RAM than when reading it at the finished() // signal of the QNetworkReply if (file) file->write(reply->readAll()); } +//! [networkreply-readyread-2] void HttpWindow::enableDownloadButton() { downloadButton->setEnabled(!urlLineEdit->text().isEmpty()); } +//! [qnam-auth-required-2] void HttpWindow::slotAuthenticationRequired(QNetworkReply *, QAuthenticator *authenticator) { QDialog authenticationDialog; @@ -312,7 +250,7 @@ void HttpWindow::slotAuthenticationRequired(QNetworkReply *, QAuthenticator *aut authenticationDialog.adjustSize(); ui.siteDescription->setText(tr("%1 at %2").arg(authenticator->realm(), url.host())); - // Did the URL have information? Fill the UI + // Did the URL have information? Fill the UI. // This is only relevant if the URL-supplied credentials were wrong ui.userEdit->setText(url.userName()); ui.passwordEdit->setText(url.password()); @@ -322,9 +260,11 @@ void HttpWindow::slotAuthenticationRequired(QNetworkReply *, QAuthenticator *aut authenticator->setPassword(ui.passwordEdit->text()); } } +//! [qnam-auth-required-2] -#ifndef QT_NO_SSL -void HttpWindow::sslErrors(QNetworkReply *, const QList<QSslError> &errors) +#if QT_CONFIG(ssl) +//! [sslerrors-2] +void HttpWindow::sslErrors(const QList<QSslError> &errors) { QString errorString; for (const QSslError &error : errors) { @@ -333,10 +273,34 @@ void HttpWindow::sslErrors(QNetworkReply *, const QList<QSslError> &errors) errorString += error.errorString(); } - if (QMessageBox::warning(this, tr("SSL Errors"), - tr("One or more SSL errors has occurred:\n%1").arg(errorString), - QMessageBox::Ignore | QMessageBox::Abort) == QMessageBox::Ignore) { + if (QMessageBox::warning(this, tr("TLS Errors"), + tr("One or more TLS errors has occurred:\n%1").arg(errorString), + QMessageBox::Ignore | QMessageBox::Abort) + == QMessageBox::Ignore) { reply->ignoreSslErrors(); } } +//! [sslerrors-2] +#endif + +#if QT_CONFIG(networkproxy) +void HttpWindow::slotProxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) +{ + QDialog authenticationDialog; + Ui::Dialog ui; + ui.setupUi(&authenticationDialog); + authenticationDialog.adjustSize(); + ui.siteDescription->setText(tr("A network proxy at %1 is requesting credentials for realm: %2") + .arg(proxy.hostName(), authenticator->realm())); + + // If the user passed credentials in the URL to http_proxy or similar they may be available to + // us. Otherwise this will just leave the fields empty + ui.userEdit->setText(proxy.user()); + ui.passwordEdit->setText(proxy.password()); + + if (authenticationDialog.exec() == QDialog::Accepted) { + authenticator->setUser(ui.userEdit->text()); + authenticator->setPassword(ui.passwordEdit->text()); + } +} #endif diff --git a/examples/network/http/httpwindow.h b/examples/network/http/httpwindow.h index f7bd0047de..ade0635e48 100644 --- a/examples/network/http/httpwindow.h +++ b/examples/network/http/httpwindow.h @@ -1,52 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** 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) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef HTTPWINDOW_H #define HTTPWINDOW_H @@ -66,6 +19,9 @@ class QSslError; class QAuthenticator; class QNetworkReply; class QCheckBox; +#if QT_CONFIG(networkproxy) +class QNetworkProxy; +#endif QT_END_NAMESPACE @@ -74,7 +30,6 @@ class ProgressDialog : public QProgressDialog { public: explicit ProgressDialog(const QUrl &url, QWidget *parent = nullptr); - ~ProgressDialog(); public slots: void networkReplyProgress(qint64 bytesRead, qint64 totalBytes); @@ -97,8 +52,11 @@ private slots: void httpReadyRead(); void enableDownloadButton(); void slotAuthenticationRequired(QNetworkReply *, QAuthenticator *authenticator); -#ifndef QT_NO_SSL - void sslErrors(QNetworkReply *, const QList<QSslError> &errors); +#if QT_CONFIG(ssl) + void sslErrors(const QList<QSslError> &errors); +#endif +#if QT_CONFIG(networkproxy) + void slotProxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator); #endif private: @@ -113,9 +71,9 @@ private: QUrl url; QNetworkAccessManager qnam; - QNetworkReply *reply; + QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> reply; std::unique_ptr<QFile> file; - bool httpRequestAborted; + bool httpRequestAborted = false; }; #endif diff --git a/examples/network/http/main.cpp b/examples/network/http/main.cpp index 6c86933fd6..4b0bd9e76a 100644 --- a/examples/network/http/main.cpp +++ b/examples/network/http/main.cpp @@ -1,91 +1,20 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** 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 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include <QApplication> #include <QDir> #include <QScreen> #include "httpwindow.h" -#ifdef REQUEST_PERMISSIONS_ON_ANDROID -#include <QtAndroid> - -bool requestStoragePermission() { - using namespace QtAndroid; - - QString permission = QStringLiteral("android.permission.WRITE_EXTERNAL_STORAGE"); - const QHash<QString, PermissionResult> results = requestPermissionsSync(QStringList({permission})); - if (!results.contains(permission) || results[permission] == PermissionResult::Denied) { - qWarning() << "Couldn't get permission: " << permission; - return false; - } - - return true; -} -#endif int main(int argc, char *argv[]) { QApplication app(argc, argv); -#ifdef REQUEST_PERMISSIONS_ON_ANDROID - if (!requestStoragePermission()) - return -1; -#endif HttpWindow httpWin; const QRect availableSize = httpWin.screen()->availableGeometry(); httpWin.resize(availableSize.width() / 5, availableSize.height() / 5); httpWin.move((availableSize.width() - httpWin.width()) / 2, (availableSize.height() - httpWin.height()) / 2); -#ifdef Q_OS_ANDROID - httpWin.showMaximized(); -#else httpWin.show(); -#endif return app.exec(); } |