/****************************************************************************+ −
**+ −
** 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]+ −
+ −