Make QFtp private.

All references to QFtp in documentation have been removed, QFtp's
documentaiton was marked internal. The QFtp example was removed.

Task-number: QTBUG-23199
Change-Id: Ifff83cac069fb350e8ebeae63e605850e65c0c30
Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
This commit is contained in:
Jonas M. Gastal 2012-01-11 10:48:08 -02:00 committed by Qt by Nokia
parent ad28d83f6d
commit 1453f74cc5
28 changed files with 106 additions and 710 deletions

3
dist/changes-5.0.0 vendored
View File

@ -146,6 +146,9 @@ information about a particular change.
- The QHttp, QHttpHeader, QHttpResponseHeader and QHttpRequestHeader classes have
been removed, QNetworkAccessManager should be used instead.
- The QFtp class is no longer exported, QNetworkAccessManager should be used
instead.
- QProcess
* On Windows, QProcess::ForwardedChannels will not forward the output of GUI

View File

@ -338,7 +338,7 @@
\section1 QObject Reentrancy
QObject is reentrant. Most of its non-GUI subclasses, such as
QTimer, QTcpSocket, QUdpSocket, QFtp, and QProcess, are also
QTimer, QTcpSocket, QUdpSocket and QProcess, are also
reentrant, making it possible to use these classes from multiple
threads simultaneously. Note that these classes are designed to be
created and used from within a single thread; creating an object

View File

@ -40,8 +40,7 @@
\brief An Introduction to Network Programming with Qt
The QtNetwork module offers classes that allow you to write TCP/IP clients
and servers. It offers classes such as QFtp that implement specific
application-level protocols, lower-level classes such as QTcpSocket,
and servers. It offers lower-level classes such as QTcpSocket,
QTcpServer and QUdpSocket that represent low level network concepts,
and high level classes such as QNetworkRequest, QNetworkReply and
QNetworkAccessManager to perform network operations using common protocols.
@ -92,64 +91,6 @@
Each application or library can create one or more instances of
QNetworkAccessManager to handle network communication.
\section1 Writing FTP Clients with QFtp
FTP (File Transfer Protocol) is a protocol used almost exclusively
for browsing remote directories and for transferring files.
\image httpstack.png FTP Client and Server
FTP uses two network connections, one for sending
commands and one for transferring data. The
FTP protocol has a state and requires the client to send several
commands before a file transfer takes place.
FTP clients establish a connection
and keeps it open throughout the session. In each session, multiple
transfers can occur.
The QFtp class provides client-side support for FTP.
It has the following characteristics:
\list
\o \e{Non-blocking behavior.} QFtp is asynchronous.
You can schedule a series of commands which are executed later,
when control returns to Qt's event loop.
\o \e{Command IDs.} Each command has a unique ID number that you
can use to follow the execution of the command. For example, QFtp
emits the \l{QFtp::commandStarted()}{commandStarted()} and
\l{QFtp::commandFinished()}{commandFinished()} signal with the
command ID for each command that is executed.
\o \e{Data transfer progress indicators.} QFtp emits signals
whenever data is transferred (QFtp::dataTransferProgress(),
QNetworkReply::downloadProgress(), and
QNetworkReply::uploadProgress()). You could connect these signals
to QProgressBar::setProgress() or QProgressDialog::setProgress(),
for example.
\o \e{QIODevice support.} The class supports convenient
uploading from and downloading to \l{QIODevice}s, in addition to a
QByteArray-based API.
\endlist
There are two main ways of using QFtp. The most common
approach is to keep track of the command IDs and follow the
execution of every command by connecting to the appropriate
signals. The other approach is to schedule all commands at once
and only connect to the done() signal, which is emitted when all
scheduled commands have been executed. The first approach
requires more work, but it gives you more control over the
execution of individual commands and allows you to initiate new
commands based on the result of a previous command. It also
enables you to provide detailed feedback to the user.
The \l{network/qftp}{FTP} example
illustrates how to write an FTP client.
Writing your own FTP (or HTTP) server is possible using the
lower-level classes QTcpSocket and QTcpServer.
\section1 Using TCP with QTcpSocket and QTcpServer
TCP (Transmission Control Protocol) is a low-level network
@ -172,7 +113,7 @@
will then stop immediately.
QTcpSocket works asynchronously and emits signals to report status
changes and errors, just like QNetworkAccessManager and QFtp. It
changes and errors, just like QNetworkAccessManager. It
relies on the event loop to detect incoming data and to
automatically flush outgoing data. You can write data to the
socket using QTcpSocket::write(), and read data using

View File

@ -62,8 +62,8 @@ bool checkUrl(const QUrl &url) {
//! [3]
QFtp ftp;
ftp.connectToHost(url.host(), url.port(21));
QTcpSocket sock;
sock.connectToHost(url.host(), url.port(80));
//! [3]

View File

@ -10,7 +10,6 @@ SUBDIRS = \
broadcastsender \
fortuneclient \
fortuneserver \
qftp \
http \
loopback \
threadedfortuneserver \

View File

@ -1,7 +0,0 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/cdtoparent.png</file>
<file>images/dir.png</file>
<file>images/file.png</file>
</qresource>
</RCC>

View File

@ -1,406 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2012 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:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
** the names of its contributors may be used to endorse or promote
** products derived from this software without specific prior written
** permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtWidgets>
#include <QtNetwork>
#include "ftpwindow.h"
FtpWindow::FtpWindow(QWidget *parent)
: QDialog(parent), ftp(0), networkSession(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."));
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);
topLayout->addWidget(cdToParentButton);
topLayout->addWidget(connectButton);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(topLayout);
mainLayout->addWidget(fileList);
mainLayout->addWidget(statusLabel);
mainLayout->addWidget(buttonBox);
setLayout(mainLayout);
setWindowTitle(tr("FTP"));
}
QSize FtpWindow::sizeHint() const
{
return QSize(500, 300);
}
//![0]
void FtpWindow::connectOrDisconnect()
{
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
if (!networkSession || !networkSession->isOpen()) {
if (manager.capabilities() & QNetworkConfigurationManager::NetworkSessionRequired) {
if (!networkSession) {
// Get saved network configuration
QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
settings.beginGroup(QLatin1String("QtNetwork"));
const QString id = settings.value(QLatin1String("DefaultNetworkConfiguration")).toString();
settings.endGroup();
// If the saved network configuration is not currently discovered use the system default
QNetworkConfiguration config = manager.configurationFromIdentifier(id);
if ((config.state() & QNetworkConfiguration::Discovered) !=
QNetworkConfiguration::Discovered) {
config = manager.defaultConfiguration();
}
networkSession = new QNetworkSession(config, this);
connect(networkSession, SIGNAL(opened()), this, SLOT(connectToFtp()));
connect(networkSession, SIGNAL(error(QNetworkSession::SessionError)), this, SLOT(enableConnectButton()));
}
connectButton->setEnabled(false);
statusLabel->setText(tr("Opening network session."));
networkSession->open();
return;
}
}
connectToFtp();
}
void FtpWindow::connectToFtp()
{
//![1]
ftp = new QFtp(this);
connect(ftp, SIGNAL(commandFinished(int,bool)),
this, SLOT(ftpCommandFinished(int,bool)));
connect(ftp, SIGNAL(listInfo(QUrlInfo)),
this, SLOT(addToList(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();
if (file->exists()) {
file->close();
file->remove();
}
delete file;
}
//![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 += '/';
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]
void FtpWindow::enableConnectButton()
{
// Save the used configuration
QNetworkConfiguration config = networkSession->configuration();
QString id;
if (config.type() == QNetworkConfiguration::UserChoice)
id = networkSession->sessionProperty(QLatin1String("UserChoiceConfiguration")).toString();
else
id = config.identifier();
QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
settings.beginGroup(QLatin1String("QtNetwork"));
settings.setValue(QLatin1String("DefaultNetworkConfiguration"), id);
settings.endGroup();
connectButton->setEnabled(true);
statusLabel->setText(tr("Please enter the name of an FTP server."));
}

View File

@ -1,110 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2012 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:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
** the names of its contributors may be used to endorse or promote
** products derived from this software without specific prior written
** permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef FTPWINDOW_H
#define FTPWINDOW_H
#include <QDialog>
#include <QHash>
#include <QNetworkConfigurationManager>
QT_BEGIN_NAMESPACE
class QDialogButtonBox;
class QFile;
class QFtp;
class QLabel;
class QLineEdit;
class QTreeWidget;
class QTreeWidgetItem;
class QProgressDialog;
class QPushButton;
class QUrlInfo;
class QNetworkSession;
QT_END_NAMESPACE
class FtpWindow : public QDialog
{
Q_OBJECT
public:
FtpWindow(QWidget *parent = 0);
QSize sizeHint() const;
//![0]
private slots:
void connectOrDisconnect();
void downloadFile();
void cancelDownload();
void connectToFtp();
void ftpCommandFinished(int commandId, bool error);
void addToList(const QUrlInfo &urlInfo);
void processItem(QTreeWidgetItem *item, int column);
void cdToParent();
void updateDataTransferProgress(qint64 readBytes,
qint64 totalBytes);
void enableDownloadButton();
void enableConnectButton();
//![0]
private:
QLabel *ftpServerLabel;
QLineEdit *ftpServerLineEdit;
QLabel *statusLabel;
QTreeWidget *fileList;
QPushButton *cdToParentButton;
QPushButton *connectButton;
QPushButton *downloadButton;
QPushButton *quitButton;
QDialogButtonBox *buttonBox;
QProgressDialog *progressDialog;
//![1]
QHash<QString, bool> isDirectory;
QString currentPath;
QFtp *ftp;
QFile *file;
QNetworkSession *networkSession;
QNetworkConfigurationManager manager;
//![1]
};
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 B

View File

@ -1,52 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2012 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:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
** the names of its contributors may be used to endorse or promote
** products derived from this software without specific prior written
** permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QApplication>
#include "ftpwindow.h"
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(ftp);
QApplication app(argc, argv);
FtpWindow ftpWin;
ftpWin.show();
return ftpWin.exec();
}

View File

@ -1,11 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Name=FTP
Exec=/opt/usr/bin/qftp
Icon=qftp
X-Window-Icon=
X-HildonDesk-ShowInToolbar=true
X-Osso-Type=application/x-executable

View File

@ -1,13 +0,0 @@
QT += widgets
HEADERS = ftpwindow.h
SOURCES = ftpwindow.cpp \
main.cpp
RESOURCES += ftp.qrc
QT += network
# install
target.path = $$[QT_INSTALL_EXAMPLES]/qtbase/network/qftp
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro images
sources.path = $$[QT_INSTALL_EXAMPLES]/qtbase/network/qftp
INSTALLS += target sources

View File

@ -143,12 +143,8 @@ QByteArray QBufferPrivate::peek(qint64 maxSize)
QBuffer emits readyRead() when new data has arrived in the
buffer. By connecting to this signal, you can use QBuffer to
store temporary data before processing it. For example, you can
pass the buffer to QFtp when downloading a file from an FTP
server. Whenever a new payload of data has been downloaded,
readyRead() is emitted, and you can process the data that just
arrived. QBuffer also emits bytesWritten() every time new data
has been written to the buffer.
store temporary data before processing it. QBuffer also emits
bytesWritten() every time new data has been written to the buffer.
\sa QFile, QDataStream, QTextStream, QByteArray
*/

View File

@ -471,7 +471,7 @@ void QProcessPrivate::Channel::clear()
read the standard output by calling read(), readLine(), and
getChar(). Because it inherits QIODevice, QProcess can also be
used as an input source for QXmlReader, or for generating data to
be uploaded using QFtp.
be uploaded using QNetworkAccessManager.
\note On Windows CE and Symbian, reading and writing to a process
is not supported.

View File

@ -1,7 +1,7 @@
# Qt network access module
HEADERS += \
access/qftp.h \
access/qftp_p.h \
access/qhttpheader_p.h \
access/qhttpnetworkheader_p.h \
access/qhttpnetworkrequest_p.h \

View File

@ -42,7 +42,7 @@
//#define QFTPPI_DEBUG
//#define QFTPDTP_DEBUG
#include "qftp.h"
#include "private/qftp_p.h"
#include "qabstractsocket.h"
#ifndef QT_NO_FTP
@ -825,6 +825,8 @@ void QFtpPI::connectToHost(const QString &host, quint16 port)
}
/*
\internal
Sends the sequence of commands \a cmds to the FTP server. When the commands
are all done the finished() signal is emitted. When an error occurs, the
error() signal is emitted.
@ -970,6 +972,8 @@ void QFtpPI::readyRead()
}
/*
\internal
Process a reply from the FTP server.
Returns true if the reply was processed or false if the reply has to be
@ -1150,6 +1154,8 @@ bool QFtpPI::processReply()
}
/*
\internal
Starts next pending command. Returns false if there are no pending commands,
otherwise it returns true.
*/
@ -1306,6 +1312,7 @@ int QFtpPrivate::addCommand(QFtpCommand *cmd)
*
*********************************************************************/
/*!
\internal
\class QFtp
\brief The QFtp class provides an implementation of the client side of FTP protocol.
@ -1409,6 +1416,7 @@ int QFtpPrivate::addCommand(QFtpCommand *cmd)
/*!
\internal
Constructs a QFtp object with the given \a parent.
*/
QFtp::QFtp(QObject *parent)
@ -1435,6 +1443,7 @@ QFtp::QFtp(QObject *parent)
}
/*!
\internal
\enum QFtp::State
This enum defines the connection state:
@ -1451,6 +1460,7 @@ QFtp::QFtp(QObject *parent)
\sa stateChanged() state()
*/
/*!
\internal
\enum QFtp::TransferMode
FTP works with two socket connections; one for commands and
@ -1468,6 +1478,7 @@ QFtp::QFtp(QObject *parent)
data.
*/
/*!
\internal
\enum QFtp::TransferType
This enum identifies the data transfer type used with get and
@ -1479,6 +1490,7 @@ QFtp::QFtp(QObject *parent)
characters will be converted to the local format.
*/
/*!
\internal
\enum QFtp::Error
This enum identifies the error that occurred.
@ -1495,6 +1507,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\enum QFtp::Command
This enum is used as the return value for the currentCommand() function.
@ -1524,6 +1537,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::stateChanged(int state)
This signal is emitted when the state of the connection changes.
@ -1538,6 +1552,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::listInfo(const QUrlInfo &i);
This signal is emitted for each directory entry the list() command
@ -1547,6 +1562,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::commandStarted(int id)
This signal is emitted when processing the command identified by
@ -1556,6 +1572,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::commandFinished(int id, bool error)
This signal is emitted when processing the command identified by
@ -1566,6 +1583,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::done(bool error)
This signal is emitted when the last pending command has finished;
@ -1577,6 +1595,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::readyRead()
This signal is emitted in response to a get() command when there
@ -1597,6 +1616,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::dataTransferProgress(qint64 done, qint64 total)
This signal is emitted in response to a get() or put() request to
@ -1617,6 +1637,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
\fn void QFtp::rawCommandReply(int replyCode, const QString &detail);
This signal is emitted in response to the rawCommand() function.
@ -1627,6 +1648,7 @@ QFtp::QFtp(QObject *parent)
*/
/*!
\internal
Connects to the FTP server \a host using port \a port.
The stateChanged() signal is emitted when the state of the
@ -1655,6 +1677,7 @@ int QFtp::connectToHost(const QString &host, quint16 port)
}
/*!
\internal
Logs in to the FTP server with the username \a user and the
password \a password.
@ -1681,6 +1704,7 @@ int QFtp::login(const QString &user, const QString &password)
}
/*!
\internal
Closes the connection to the FTP server.
The stateChanged() signal is emitted when the state of the
@ -1704,6 +1728,7 @@ int QFtp::close()
}
/*!
\internal
Sets the current FTP transfer mode to \a mode. The default is QFtp::Passive.
\sa QFtp::TransferMode
@ -1717,6 +1742,7 @@ int QFtp::setTransferMode(TransferMode mode)
}
/*!
\internal
Enables use of the FTP proxy on host \a host and port \a
port. Calling this function with \a host empty disables proxying.
@ -1731,6 +1757,7 @@ int QFtp::setProxy(const QString &host, quint16 port)
}
/*!
\internal
Lists the contents of directory \a dir on the FTP server. If \a
dir is empty, it lists the contents of the current directory.
@ -1760,6 +1787,7 @@ int QFtp::list(const QString &dir)
}
/*!
\internal
Changes the working directory of the server to \a dir.
The function does not block and returns immediately. The command
@ -1779,6 +1807,7 @@ int QFtp::cd(const QString &dir)
}
/*!
\internal
Downloads the file \a file from the server.
If \a dev is 0, then the readyRead() signal is emitted when there
@ -1832,6 +1861,7 @@ int QFtp::get(const QString &file, QIODevice *dev, TransferType type)
}
/*!
\internal
\overload
Writes a copy of the given \a data to the file called \a file on
@ -1869,6 +1899,7 @@ int QFtp::put(const QByteArray &data, const QString &file, TransferType type)
}
/*!
\internal
Reads the data from the IO device \a dev, and writes it to the
file called \a file on the server. The data is read in chunks from
the IO device, so this overload allows you to transmit large
@ -1897,6 +1928,7 @@ int QFtp::put(QIODevice *dev, const QString &file, TransferType type)
}
/*!
\internal
Deletes the file called \a file from the server.
The function does not block and returns immediately. The command
@ -1916,6 +1948,7 @@ int QFtp::remove(const QString &file)
}
/*!
\internal
Creates a directory called \a dir on the server.
The function does not block and returns immediately. The command
@ -1935,6 +1968,7 @@ int QFtp::mkdir(const QString &dir)
}
/*!
\internal
Removes the directory called \a dir from the server.
The function does not block and returns immediately. The command
@ -1954,6 +1988,7 @@ int QFtp::rmdir(const QString &dir)
}
/*!
\internal
Renames the file called \a oldname to \a newname on the server.
The function does not block and returns immediately. The command
@ -1976,6 +2011,7 @@ int QFtp::rename(const QString &oldname, const QString &newname)
}
/*!
\internal
Sends the raw FTP command \a command to the FTP server. This is
useful for low-level FTP access. If the operation you wish to
perform has an equivalent QFtp function, we recommend using the
@ -2000,6 +2036,7 @@ int QFtp::rawCommand(const QString &command)
}
/*!
\internal
Returns the number of bytes that can be read from the data socket
at the moment.
@ -2011,6 +2048,7 @@ qint64 QFtp::bytesAvailable() const
}
/*!
\internal
Reads \a maxlen bytes from the data socket into \a data and
returns the number of bytes read. Returns -1 if an error occurred.
@ -2022,6 +2060,7 @@ qint64 QFtp::read(char *data, qint64 maxlen)
}
/*!
\internal
Reads all the bytes available from the data socket and returns
them.
@ -2033,6 +2072,7 @@ QByteArray QFtp::readAll()
}
/*!
\internal
Aborts the current command and deletes all scheduled commands.
If there is an unfinished command (i.e. a command for which the
@ -2071,6 +2111,7 @@ void QFtp::abort()
}
/*!
\internal
Returns the identifier of the FTP command that is being executed
or 0 if there is no command being executed.
@ -2084,6 +2125,7 @@ int QFtp::currentId() const
}
/*!
\internal
Returns the command type of the FTP command being executed or \c
None if there is no command being executed.
@ -2097,6 +2139,7 @@ QFtp::Command QFtp::currentCommand() const
}
/*!
\internal
Returns the QIODevice pointer that is used by the FTP command to read data
from or store data to. If there is no current FTP command being executed or
if the command does not use an IO device, this function returns 0.
@ -2117,6 +2160,7 @@ QIODevice* QFtp::currentDevice() const
}
/*!
\internal
Returns true if there are any commands scheduled that have not yet
been executed; otherwise returns false.
@ -2131,6 +2175,7 @@ bool QFtp::hasPendingCommands() const
}
/*!
\internal
Deletes all pending commands from the list of scheduled commands.
This does not affect the command that is being executed. If you
want to stop this as well, use abort().
@ -2145,6 +2190,7 @@ void QFtp::clearPendingCommands()
}
/*!
\internal
Returns the current state of the object. When the state changes,
the stateChanged() signal is emitted.
@ -2156,6 +2202,7 @@ QFtp::State QFtp::state() const
}
/*!
\internal
Returns the last error that occurred. This is useful to find out
what went wrong when receiving a commandFinished() or a done()
signal with the \c error argument set to \c true.
@ -2168,6 +2215,7 @@ QFtp::Error QFtp::error() const
}
/*!
\internal
Returns a human-readable description of the last error that
occurred. This is useful for presenting a error message to the
user when receiving a commandFinished() or a done() signal with
@ -2385,6 +2433,7 @@ void QFtpPrivate::_q_piFtpReply(int code, const QString &text)
}
/*!
\internal
Destructor.
*/
QFtp::~QFtp()
@ -2397,6 +2446,6 @@ QT_END_NAMESPACE
#include "qftp.moc"
#include "moc_qftp.cpp"
#include "moc_qftp_p.cpp"
#endif // QT_NO_FTP

View File

@ -39,6 +39,17 @@
**
****************************************************************************/
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of the Network Access API. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
#ifndef QFTP_H
#define QFTP_H
@ -56,7 +67,7 @@ QT_MODULE(Network)
class QFtpPrivate;
class Q_NETWORK_EXPORT QFtp : public QObject
class Q_AUTOTEST_EXPORT QFtp : public QObject
{
Q_OBJECT

View File

@ -57,7 +57,7 @@
#include "qnetworkaccesscache_p.h"
#include "qnetworkrequest.h"
#include "qnetworkreply.h"
#include "QtNetwork/qftp.h"
#include "private/qftp_p.h"
#include "QtCore/qpointer.h"

View File

@ -53,8 +53,8 @@
QNetworkProxy provides the method for configuring network layer
proxy support to the Qt network classes. The currently supported
classes are QAbstractSocket, QTcpSocket, QUdpSocket, QTcpServer,
QNetworkAccessManager and QFtp. The proxy support is designed to
classes are QAbstractSocket, QTcpSocket, QUdpSocket, QTcpServer
and QNetworkAccessManager. The proxy support is designed to
be as transparent as possible. This means that existing
network-enabled applications that you have written should
automatically support network proxy using the following code.
@ -166,8 +166,7 @@
\row
\o Caching FTP
\o Implemented using an FTP proxy, it is useful only in the
context of FTP requests (see QFtp,
QNetworkAccessManager)
context of FTP requests (see QNetworkAccessManager)
\o CachingCapability, HostNameLookupCapability
\endtable

View File

@ -163,7 +163,7 @@
issue to be aware of, though: You must make sure that enough data
is available before attempting to read it using operator>>().
\sa QFtp, QNetworkAccessManager, QTcpServer
\sa QNetworkAccessManager, QTcpServer
*/
/*!

View File

@ -60,7 +60,7 @@
\bold{Note:} TCP sockets cannot be opened in QIODevice::Unbuffered mode.
\sa QTcpServer, QUdpSocket, QFtp, QNetworkAccessManager,
\sa QTcpServer, QUdpSocket, QNetworkAccessManager,
{Fortune Server Example}, {Fortune Client Example},
{Threaded Fortune Server Example}, {Blocking Fortune Client Example},
{Loopback Example}, {Torrent Example}

View File

@ -397,7 +397,6 @@ QT_CLASS_LIB(QXmlStreamStringRef, QtXml, qxmlstream.h)
QT_CLASS_LIB(QXmlStreamWriter, QtXml, qxmlstream.h)
QT_CLASS_LIB(QNetworkCacheMetaData, QtNetwork, qabstractnetworkcache.h)
QT_CLASS_LIB(QAbstractNetworkCache, QtNetwork, qabstractnetworkcache.h)
QT_CLASS_LIB(QFtp, QtNetwork, qftp.h)
QT_CLASS_LIB(QHttpHeader, QtNetwork, qhttpheader_p.h)
QT_CLASS_LIB(QHttpResponseHeader, QtNetwork, qhttpheader_p.h)
QT_CLASS_LIB(QNetworkAccessManager, QtNetwork, qnetworkaccessmanager.h)

View File

@ -192,9 +192,8 @@ bool QProgressBarPrivate::repaintRequired() const
If minimum and maximum both are set to 0, the bar shows a busy
indicator instead of a percentage of steps. This is useful, for
example, when using QFtp or QNetworkAccessManager to download
items when they are unable to determine the size of the item being
downloaded.
example, when using QNetworkAccessManager to download items when
they are unable to determine the size of the item being downloaded.
\table
\row \o \inlineimage macintosh-progressbar.png Screenshot of a Macintosh style progress bar

View File

@ -8,12 +8,11 @@ SUBDIRS=\
qhttpnetworkconnection \
qnetworkreply \
qnetworkcachemetadata \
qftp \
qhttpnetworkreply \
qabstractnetworkcache \
!contains(QT_CONFIG, private_tests): SUBDIRS -= \
qhttpnetworkconnection \
qhttpnetworkreply \
qftp \

View File

@ -45,7 +45,7 @@
#include <qcoreapplication.h>
#include <qfile.h>
#include <qbuffer.h>
#include "qftp.h"
#include "private/qftp_p.h"
#include <qmap.h>
#include <time.h>
#include <stdlib.h>

View File

@ -54,7 +54,9 @@
#include <QtNetwork/QLocalSocket>
#include <QtNetwork/QLocalServer>
#include <QtNetwork/QHostInfo>
#include <QtNetwork/QFtp>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QAbstractNetworkCache>
#include <QtNetwork/qauthenticator.h>
#include <QtNetwork/qnetworkaccessmanager.h>
@ -1849,23 +1851,22 @@ void tst_QNetworkReply::putToFtp()
// download the file again from FTP to make sure it was uploaded
// correctly
QFtp ftp;
ftp.connectToHost(url.host());
ftp.login();
ftp.get(url.path());
QNetworkAccessManager qnam;
QNetworkRequest req(url);
QNetworkReply *r = qnam.get(req);
QObject::connect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QObject::connect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(10);
QObject::disconnect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QObject::disconnect(r, SIGNAL(finished(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QByteArray uploaded = ftp.readAll();
QByteArray uploaded = r->readAll();
QCOMPARE(uploaded.size(), data.size());
QCOMPARE(uploaded, data);
ftp.close();
QObject::connect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
r->close();
QObject::connect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(10);
QObject::disconnect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QObject::disconnect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
}
void tst_QNetworkReply::putToHttp_data()
@ -3901,23 +3902,22 @@ void tst_QNetworkReply::ioPutToFtpFromFile()
// download the file again from FTP to make sure it was uploaded
// correctly
QFtp ftp;
ftp.connectToHost(url.host());
ftp.login();
ftp.get(url.path());
QNetworkAccessManager qnam;
QNetworkRequest req(url);
QNetworkReply *r = qnam.get(req);
QObject::connect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QObject::connect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(3);
QObject::disconnect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QObject::disconnect(r, SIGNAL(finished(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QByteArray uploaded = ftp.readAll();
QByteArray uploaded = r->readAll();
QCOMPARE(qint64(uploaded.size()), sourceFile.size());
QCOMPARE(uploaded, sourceFile.readAll());
ftp.close();
QObject::connect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
r->close();
QObject::connect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(10);
QObject::disconnect(&ftp, SIGNAL(done(bool)), &QTestEventLoop::instance(), SLOT(exitLoop()));
QObject::disconnect(r, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
}
void tst_QNetworkReply::ioPutToHttpFromFile_data()