examples/network/qftp/ftpwindow.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/network/qftp/ftpwindow.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,379 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include <QtNetwork>
+
+#include "ftpwindow.h"
+
+#ifdef Q_OS_SYMBIAN
+#include "sym_iap_util.h"
+#endif
+
+FtpWindow::FtpWindow(QWidget *parent)
+    : QDialog(parent), ftp(0)
+{
+    ftpServerLabel = new QLabel(tr("Ftp &server:"));
+    ftpServerLineEdit = new QLineEdit("ftp.qt.nokia.com");
+    ftpServerLabel->setBuddy(ftpServerLineEdit);
+
+    statusLabel = new QLabel(tr("Please enter the name of an FTP server."));
+#ifdef Q_OS_SYMBIAN
+    // Use word wrapping to fit the text on screen
+    statusLabel->setWordWrap( true );
+#endif
+
+    fileList = new QTreeWidget;
+    fileList->setEnabled(false);
+    fileList->setRootIsDecorated(false);
+    fileList->setHeaderLabels(QStringList() << tr("Name") << tr("Size") << tr("Owner") << tr("Group") << tr("Time"));
+    fileList->header()->setStretchLastSection(false);
+
+    connectButton = new QPushButton(tr("Connect"));
+    connectButton->setDefault(true);
+
+    cdToParentButton = new QPushButton;
+    cdToParentButton->setIcon(QPixmap(":/images/cdtoparent.png"));
+    cdToParentButton->setEnabled(false);
+
+    downloadButton = new QPushButton(tr("Download"));
+    downloadButton->setEnabled(false);
+
+    quitButton = new QPushButton(tr("Quit"));
+
+    buttonBox = new QDialogButtonBox;
+    buttonBox->addButton(downloadButton, QDialogButtonBox::ActionRole);
+    buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
+
+    progressDialog = new QProgressDialog(this);
+
+    connect(fileList, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
+            this, SLOT(processItem(QTreeWidgetItem *, int)));
+    connect(fileList, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
+            this, SLOT(enableDownloadButton()));
+    connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
+    connect(connectButton, SIGNAL(clicked()), this, SLOT(connectOrDisconnect()));
+    connect(cdToParentButton, SIGNAL(clicked()), this, SLOT(cdToParent()));
+    connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadFile()));
+    connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
+
+    QHBoxLayout *topLayout = new QHBoxLayout;
+    topLayout->addWidget(ftpServerLabel);
+    topLayout->addWidget(ftpServerLineEdit);
+#ifndef Q_OS_SYMBIAN
+    topLayout->addWidget(cdToParentButton);
+    topLayout->addWidget(connectButton);
+#else
+    // Make app better lookin on small screen
+    QHBoxLayout *topLayout2 = new QHBoxLayout;
+    topLayout2->addWidget(cdToParentButton);
+    topLayout2->addWidget(connectButton);
+#endif
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addLayout(topLayout);
+#ifdef Q_OS_SYMBIAN
+    // Make app better lookin on small screen
+    mainLayout->addLayout(topLayout2);
+#endif
+    mainLayout->addWidget(fileList);
+    mainLayout->addWidget(statusLabel);
+    mainLayout->addWidget(buttonBox);
+    setLayout(mainLayout);
+
+#ifdef Q_OS_SYMBIAN
+    bDefaultIapSet = false;
+#endif
+
+    setWindowTitle(tr("FTP"));
+}
+
+QSize FtpWindow::sizeHint() const
+{
+    return QSize(500, 300);
+}
+
+//![0]
+void FtpWindow::connectOrDisconnect()
+{
+#ifdef Q_OS_SYMBIAN
+   if(!bDefaultIapSet) {
+       qt_SetDefaultIap();
+       bDefaultIapSet = true;
+   }
+#endif
+    if (ftp) {
+        ftp->abort();
+        ftp->deleteLater();
+        ftp = 0;
+//![0]
+        fileList->setEnabled(false);
+        cdToParentButton->setEnabled(false);
+        downloadButton->setEnabled(false);
+        connectButton->setEnabled(true);
+        connectButton->setText(tr("Connect"));
+#ifndef QT_NO_CURSOR
+        setCursor(Qt::ArrowCursor);
+#endif
+        statusLabel->setText(tr("Please enter the name of an FTP server."));
+        return;
+    }
+
+#ifndef QT_NO_CURSOR
+    setCursor(Qt::WaitCursor);
+#endif
+
+//![1]
+    ftp = new QFtp(this);
+    connect(ftp, SIGNAL(commandFinished(int, bool)),
+            this, SLOT(ftpCommandFinished(int, bool)));
+    connect(ftp, SIGNAL(listInfo(const QUrlInfo &)),
+            this, SLOT(addToList(const QUrlInfo &)));
+    connect(ftp, SIGNAL(dataTransferProgress(qint64, qint64)),
+            this, SLOT(updateDataTransferProgress(qint64, qint64)));
+
+    fileList->clear();
+    currentPath.clear();
+    isDirectory.clear();
+//![1]
+
+//![2]
+    QUrl url(ftpServerLineEdit->text());
+    if (!url.isValid() || url.scheme().toLower() != QLatin1String("ftp")) {
+        ftp->connectToHost(ftpServerLineEdit->text(), 21);
+        ftp->login();
+    } else {
+        ftp->connectToHost(url.host(), url.port(21));
+
+        if (!url.userName().isEmpty())
+            ftp->login(QUrl::fromPercentEncoding(url.userName().toLatin1()), url.password());
+        else
+            ftp->login();
+        if (!url.path().isEmpty())
+            ftp->cd(url.path());
+    }
+//![2]
+
+    fileList->setEnabled(true);
+    connectButton->setEnabled(false);
+    connectButton->setText(tr("Disconnect"));
+    statusLabel->setText(tr("Connecting to FTP server %1...")
+                         .arg(ftpServerLineEdit->text()));
+}
+
+//![3]
+void FtpWindow::downloadFile()
+{
+    QString fileName = fileList->currentItem()->text(0);
+//![3]
+//
+    if (QFile::exists(fileName)) {
+        QMessageBox::information(this, tr("FTP"),
+                                 tr("There already exists a file called %1 in "
+                                    "the current directory.")
+                                 .arg(fileName));
+        return;
+    }
+
+//![4]
+    file = new QFile(fileName);
+    if (!file->open(QIODevice::WriteOnly)) {
+        QMessageBox::information(this, tr("FTP"),
+                                 tr("Unable to save the file %1: %2.")
+                                 .arg(fileName).arg(file->errorString()));
+        delete file;
+        return;
+    }
+
+    ftp->get(fileList->currentItem()->text(0), file);
+
+    progressDialog->setLabelText(tr("Downloading %1...").arg(fileName));
+    downloadButton->setEnabled(false);
+    progressDialog->exec();
+}
+//![4]
+
+//![5]
+void FtpWindow::cancelDownload()
+{
+    ftp->abort();
+}
+//![5]
+
+//![6]
+void FtpWindow::ftpCommandFinished(int, bool error)
+{
+#ifndef QT_NO_CURSOR
+    setCursor(Qt::ArrowCursor);
+#endif
+
+    if (ftp->currentCommand() == QFtp::ConnectToHost) {
+        if (error) {
+            QMessageBox::information(this, tr("FTP"),
+                                     tr("Unable to connect to the FTP server "
+                                        "at %1. Please check that the host "
+                                        "name is correct.")
+                                     .arg(ftpServerLineEdit->text()));
+            connectOrDisconnect();
+            return;
+        }
+        statusLabel->setText(tr("Logged onto %1.")
+                             .arg(ftpServerLineEdit->text()));
+        fileList->setFocus();
+        downloadButton->setDefault(true);
+        connectButton->setEnabled(true);
+        return;
+    }
+//![6]
+
+//![7]
+    if (ftp->currentCommand() == QFtp::Login)
+        ftp->list();
+//![7]
+
+//![8]
+    if (ftp->currentCommand() == QFtp::Get) {
+        if (error) {
+            statusLabel->setText(tr("Canceled download of %1.")
+                                 .arg(file->fileName()));
+            file->close();
+            file->remove();
+        } else {
+            statusLabel->setText(tr("Downloaded %1 to current directory.")
+                                 .arg(file->fileName()));
+            file->close();
+        }
+        delete file;
+        enableDownloadButton();
+        progressDialog->hide();
+//![8]
+//![9]
+    } else if (ftp->currentCommand() == QFtp::List) {
+        if (isDirectory.isEmpty()) {
+            fileList->addTopLevelItem(new QTreeWidgetItem(QStringList() << tr("<empty>")));
+            fileList->setEnabled(false);
+        }
+    }
+//![9]
+}
+
+//![10]
+void FtpWindow::addToList(const QUrlInfo &urlInfo)
+{
+    QTreeWidgetItem *item = new QTreeWidgetItem;
+    item->setText(0, urlInfo.name());
+    item->setText(1, QString::number(urlInfo.size()));
+    item->setText(2, urlInfo.owner());
+    item->setText(3, urlInfo.group());
+    item->setText(4, urlInfo.lastModified().toString("MMM dd yyyy"));
+
+    QPixmap pixmap(urlInfo.isDir() ? ":/images/dir.png" : ":/images/file.png");
+    item->setIcon(0, pixmap);
+
+    isDirectory[urlInfo.name()] = urlInfo.isDir();
+    fileList->addTopLevelItem(item);
+    if (!fileList->currentItem()) {
+        fileList->setCurrentItem(fileList->topLevelItem(0));
+        fileList->setEnabled(true);
+    }
+}
+//![10]
+
+//![11]
+void FtpWindow::processItem(QTreeWidgetItem *item, int /*column*/)
+{
+    QString name = item->text(0);
+    if (isDirectory.value(name)) {
+        fileList->clear();
+        isDirectory.clear();
+        currentPath += "/" + name;
+        ftp->cd(name);
+        ftp->list();
+        cdToParentButton->setEnabled(true);
+#ifndef QT_NO_CURSOR
+        setCursor(Qt::WaitCursor);
+#endif
+        return;
+    }
+}
+//![11]
+
+//![12]
+void FtpWindow::cdToParent()
+{
+#ifndef QT_NO_CURSOR
+    setCursor(Qt::WaitCursor);
+#endif
+    fileList->clear();
+    isDirectory.clear();
+    currentPath = currentPath.left(currentPath.lastIndexOf('/'));
+    if (currentPath.isEmpty()) {
+        cdToParentButton->setEnabled(false);
+        ftp->cd("/");
+    } else {
+        ftp->cd(currentPath);
+    }
+    ftp->list();
+}
+//![12]
+
+//![13]
+void FtpWindow::updateDataTransferProgress(qint64 readBytes,
+                                           qint64 totalBytes)
+{
+    progressDialog->setMaximum(totalBytes);
+    progressDialog->setValue(readBytes);
+}
+//![13]
+
+//![14]
+void FtpWindow::enableDownloadButton()
+{
+    QTreeWidgetItem *current = fileList->currentItem();
+    if (current) {
+        QString currentFile = current->text(0);
+        downloadButton->setEnabled(!isDirectory.value(currentFile));
+    } else {
+        downloadButton->setEnabled(false);
+    }
+}
+//![14]
+