|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# httpwindow.cpp Example File
network/http/httpwindow.cpp

        /****************************************************************************
        **
        ** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.
        **
        ** This file is part of the documentation of the Qt Toolkit.
        **
        ** This file may be used under the terms of the GNU General Public
        ** License version 2.0 as published by the Free Software Foundation
        ** and appearing in the file LICENSE.GPL included in the packaging of
        ** this file.  Please review the following information to ensure GNU
        ** General Public Licensing requirements will be met:
        ** http://www.trolltech.com/products/qt/opensource.html
        **
        ** If you are unsure which license is appropriate for your use, please
        ** review the following information:
        ** http://www.trolltech.com/products/qt/licensing.html or contact the
        ** sales department at sales@trolltech.com.
        **
        ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
        ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        **
        ****************************************************************************/

        #include <QtGui>
        #include <QtNetwork>

        #include "httpwindow.h"

        HttpWindow::HttpWindow(QWidget *parent)
            : QDialog(parent)
        {
            urlLineEdit = new QLineEdit("http://www.ietf.org/iesg/1rfc_index.txt");

            urlLabel = new QLabel(tr("&URL:"));
            urlLabel->setBuddy(urlLineEdit);
            statusLabel = new QLabel(tr("Please enter the URL of a file you want to "
                                        "download."));

            quitButton = new QPushButton(tr("Quit"));
            downloadButton = new QPushButton(tr("Download"));
            downloadButton->setDefault(true);

            progressDialog = new QProgressDialog(this);

            http = new QHttp(this);

            connect(urlLineEdit, SIGNAL(textChanged(const QString &)),
                    this, SLOT(enableDownloadButton()));
            connect(http, SIGNAL(requestFinished(int, bool)),
                    this, SLOT(httpRequestFinished(int, bool)));
            connect(http, SIGNAL(dataReadProgress(int, int)),
                    this, SLOT(updateDataReadProgress(int, int)));
            connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
                    this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
            connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
            connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadFile()));
            connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

            QHBoxLayout *topLayout = new QHBoxLayout;
            topLayout->addWidget(urlLabel);
            topLayout->addWidget(urlLineEdit);

            QHBoxLayout *buttonLayout = new QHBoxLayout;
            buttonLayout->addStretch(1);
            buttonLayout->addWidget(downloadButton);
            buttonLayout->addWidget(quitButton);

            QVBoxLayout *mainLayout = new QVBoxLayout;
            mainLayout->addLayout(topLayout);
            mainLayout->addWidget(statusLabel);
            mainLayout->addLayout(buttonLayout);
            setLayout(mainLayout);

            setWindowTitle(tr("HTTP"));
            urlLineEdit->setFocus();
        }

        void HttpWindow::downloadFile()
        {
            QUrl url(urlLineEdit->text());
            QFileInfo fileInfo(url.path());
            QString fileName = fileInfo.fileName();

            if (QFile::exists(fileName)) {
                QMessageBox::information(this, tr("HTTP"),
                                         tr("There already exists a file called %1 in "
                                            "the current directory.")
                                         .arg(fileName));
                return;
            }

            file = new QFile(fileName);
            if (!file->open(QIODevice::WriteOnly)) {
                QMessageBox::information(this, tr("HTTP"),
                                         tr("Unable to save the file %1: %2.")
                                         .arg(fileName).arg(file->errorString()));
                delete file;
                file = 0;
                return;
            }

            http->setHost(url.host(), url.port() != -1 ? url.port() : 80);
            if (!url.userName().isEmpty())
                http->setUser(url.userName(), url.password());

            httpRequestAborted = false;
            httpGetId = http->get(url.path(), file);

            progressDialog->setWindowTitle(tr("HTTP"));
            progressDialog->setLabelText(tr("Downloading %1.").arg(fileName));
            downloadButton->setEnabled(false);
        }

        void HttpWindow::cancelDownload()
        {
            statusLabel->setText(tr("Download canceled."));
            httpRequestAborted = true;
            http->abort();
            downloadButton->setEnabled(true);
        }

        void HttpWindow::httpRequestFinished(int requestId, bool error)
        {
            if (httpRequestAborted) {
                if (file) {
                    file->close();
                    file->remove();
                    delete file;
                    file = 0;
                }

                progressDialog->hide();
                return;
            }

            if (requestId != httpGetId)
                return;

            progressDialog->hide();
            file->close();

            if (error) {
                file->remove();
                QMessageBox::information(this, tr("HTTP"),
                                         tr("Download failed: %1.")
                                         .arg(http->errorString()));
            } else {
                QString fileName = QFileInfo(QUrl(urlLineEdit->text()).path()).fileName();
                statusLabel->setText(tr("Downloaded %1 to current directory.").arg(fileName));
            }

            downloadButton->setEnabled(true);
            delete file;
            file = 0;
        }

        void HttpWindow::readResponseHeader(const QHttpResponseHeader &responseHeader)
        {
            if (responseHeader.statusCode() != 200) {
                QMessageBox::information(this, tr("HTTP"),
                                         tr("Download failed: %1.")
                                         .arg(responseHeader.reasonPhrase()));
                httpRequestAborted = true;
                progressDialog->hide();
                http->abort();
                return;
            }
        }

        void HttpWindow::updateDataReadProgress(int bytesRead, int totalBytes)
        {
            if (httpRequestAborted)
                return;

            progressDialog->setMaximum(totalBytes);
            progressDialog->setValue(bytesRead);
        }

        void HttpWindow::enableDownloadButton()
        {
            downloadButton->setEnabled(!urlLineEdit->text().isEmpty());
        }