/****************************************************************************
**
** Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
**
** This file is part of the example classes 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 "ftpwindow.h"
FtpWindow::FtpWindow(QWidget *parent)
: QDialog(parent), ftp(0)
{
ftpServerLabel = new QLabel(tr("Ftp &server:"));
ftpServerLineEdit = new QLineEdit("ftp.trolltech.com");
ftpServerLabel->setBuddy(ftpServerLineEdit);
statusLabel = new QLabel(tr("Please enter the name of an FTP server."));
fileList = new QListWidget;
fileList->setEnabled(false);
connectButton = new QPushButton(tr("Connect"));
connectButton->setDefault(true);
downloadButton = new QPushButton(tr("Download"));
downloadButton->setEnabled(false);
cdToParentButton = new QPushButton;
cdToParentButton->setIcon(QPixmap(":/images/cdtoparent.png"));
cdToParentButton->setEnabled(false);
quitButton = new QPushButton(tr("Quit"));
progressDialog = new QProgressDialog(this);
connect(fileList, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
this, SLOT(processItem(QListWidgetItem *)));
connect(fileList, SIGNAL(itemSelectionChanged()),
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);
topLayout->addWidget(cdToParentButton);
topLayout->addWidget(connectButton);
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(downloadButton);
buttonLayout->addWidget(quitButton);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(topLayout);
mainLayout->addWidget(fileList);
mainLayout->addWidget(statusLabel);
mainLayout->addLayout(buttonLayout);
setLayout(mainLayout);
setWindowTitle(tr("FTP"));
}
void FtpWindow::connectOrDisconnect()
{
if (ftp) {
ftp->abort();
ftp->deleteLater();
fileList->setEnabled(false);
downloadButton->setEnabled(false);
connectButton->setText(tr("Connect"));
return;
}
QApplication::setOverrideCursor(Qt::WaitCursor);
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)));
ftp->connectToHost(ftpServerLineEdit->text());
ftp->login();
ftp->list();
fileList->setEnabled(true);
connectButton->setText(tr("Disconnect"));
statusLabel->setText(tr("Connecting to FTP server %1...")
.arg(ftpServerLineEdit->text()));
}
void FtpWindow::downloadFile()
{
QString fileName = fileList->currentItem()->text();
if (QFile::exists(fileName)) {
QMessageBox::information(this, tr("FTP"),
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("FTP"),
tr("Unable to save the file %1: %2.")
.arg(fileName).arg(file->errorString()));
delete file;
return;
}
ftp->get(fileList->currentItem()->text(), file);
progressDialog->setLabelText(tr("Downloading %1...").arg(fileName));
progressDialog->show();
downloadButton->setEnabled(false);
}
void FtpWindow::cancelDownload()
{
ftp->abort();
}
void FtpWindow::ftpCommandFinished(int, bool error)
{
if (ftp->currentCommand() == QFtp::ConnectToHost) {
if (error) {
QApplication::restoreOverrideCursor();
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()));
return;
}
statusLabel->setText(tr("Logged onto %1.")
.arg(ftpServerLineEdit->text()));
fileList->setFocus();
downloadButton->setDefault(true);
return;
}
if (ftp->currentCommand() == QFtp::Get) {
QApplication::restoreOverrideCursor();
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();
} else if (ftp->currentCommand() == QFtp::List) {
QApplication::restoreOverrideCursor();
if (isDirectory.isEmpty()) {
fileList->addItem(tr("<empty>"));
fileList->setEnabled(false);
}
}
}
void FtpWindow::addToList(const QUrlInfo &urlInfo)
{
QListWidgetItem *item = new QListWidgetItem;
item->setText(urlInfo.name());
QPixmap pixmap(urlInfo.isDir() ? ":/images/dir.png" : ":/images/file.png");
item->setIcon(pixmap);
isDirectory[urlInfo.name()] = urlInfo.isDir();
fileList->addItem(item);
if (!fileList->currentItem()) {
fileList->setCurrentItem(fileList->item(0));
fileList->setEnabled(true);
}
}
void FtpWindow::processItem(QListWidgetItem *item)
{
QString name = item->text();
if (isDirectory.value(name)) {
fileList->clear();
isDirectory.clear();
currentPath += "/" + name;
ftp->cd(name);
ftp->list();
cdToParentButton->setEnabled(true);
QApplication::setOverrideCursor(Qt::WaitCursor);
return;
}
}
void FtpWindow::cdToParent()
{
QApplication::setOverrideCursor(Qt::WaitCursor);
fileList->clear();
isDirectory.clear();
currentPath = currentPath.left(currentPath.lastIndexOf('/'));
if (currentPath.isEmpty()) {
cdToParentButton->