Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |

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

        #include <QtCore>
        #include <QtGui>
        #include <QtNetwork>

        #include "httpwindow.h"

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

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

            quitButton = new QPushButton(tr("Quit"), this);
            downloadButton = new QPushButton(tr("Download"), this);
            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(this);
            mainLayout->addLayout(topLayout);
            mainLayout->addWidget(statusLabel);
            mainLayout->addLayout(buttonLayout);

            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());
        }