- 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
\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
\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.
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
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
//! [3]
-QFtp ftp;
-ftp.connectToHost(url.host(), url.port(21));
+QTcpSocket sock;
+sock.connectToHost(url.host(), url.port(80));
//! [3]
broadcastsender \
fortuneclient \
fortuneserver \
- qftp \
http \
loopback \
threadedfortuneserver \
+++ /dev/null
-<!DOCTYPE RCC><RCC version="1.0">
-<qresource>
- <file>images/cdtoparent.png</file>
- <file>images/dir.png</file>
- <file>images/file.png</file>
-</qresource>
-</RCC>
+++ /dev/null
-/****************************************************************************
-**
-** 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."));
-}
-
+++ /dev/null
-/****************************************************************************
-**
-** 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
+++ /dev/null
-/****************************************************************************
-**
-** 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();
-}
+++ /dev/null
-[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
+++ /dev/null
-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
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
*/
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.
# Qt network access module
HEADERS += \
- access/qftp.h \
+ access/qftp_p.h \
access/qhttpheader_p.h \
access/qhttpnetworkheader_p.h \
access/qhttpnetworkrequest_p.h \
//#define QFTPPI_DEBUG
//#define QFTPDTP_DEBUG
-#include "qftp.h"
+#include "private/qftp_p.h"
#include "qabstractsocket.h"
#ifndef QT_NO_FTP
}
/*
+ \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.
}
/*
+ \internal
+
Process a reply from the FTP server.
Returns true if the reply was processed or false if the reply has to be
}
/*
+ \internal
+
Starts next pending command. Returns false if there are no pending commands,
otherwise it returns true.
*/
*
*********************************************************************/
/*!
+ \internal
\class QFtp
\brief The QFtp class provides an implementation of the client side of FTP protocol.
/*!
+ \internal
Constructs a QFtp object with the given \a parent.
*/
QFtp::QFtp(QObject *parent)
}
/*!
+ \internal
\enum QFtp::State
This enum defines the connection state:
\sa stateChanged() state()
*/
/*!
+ \internal
\enum QFtp::TransferMode
FTP works with two socket connections; one for commands and
data.
*/
/*!
+ \internal
\enum QFtp::TransferType
This enum identifies the data transfer type used with get and
characters will be converted to the local format.
*/
/*!
+ \internal
\enum QFtp::Error
This enum identifies the error that occurred.
*/
/*!
+ \internal
\enum QFtp::Command
This enum is used as the return value for the currentCommand() function.
*/
/*!
+ \internal
\fn void QFtp::stateChanged(int state)
This signal is emitted when the state of the connection changes.
*/
/*!
+ \internal
\fn void QFtp::listInfo(const QUrlInfo &i);
This signal is emitted for each directory entry the list() command
*/
/*!
+ \internal
\fn void QFtp::commandStarted(int id)
This signal is emitted when processing the command identified by
*/
/*!
+ \internal
\fn void QFtp::commandFinished(int id, bool error)
This signal is emitted when processing the command identified by
*/
/*!
+ \internal
\fn void QFtp::done(bool error)
This signal is emitted when the last pending command has finished;
*/
/*!
+ \internal
\fn void QFtp::readyRead()
This signal is emitted in response to a get() command when there
*/
/*!
+ \internal
\fn void QFtp::dataTransferProgress(qint64 done, qint64 total)
This signal is emitted in response to a get() or put() request to
*/
/*!
+ \internal
\fn void QFtp::rawCommandReply(int replyCode, const QString &detail);
This signal is emitted in response to the rawCommand() function.
*/
/*!
+ \internal
Connects to the FTP server \a host using port \a port.
The stateChanged() signal is emitted when the state of the
}
/*!
+ \internal
Logs in to the FTP server with the username \a user and the
password \a password.
}
/*!
+ \internal
Closes the connection to the FTP server.
The stateChanged() signal is emitted when the state of the
}
/*!
+ \internal
Sets the current FTP transfer mode to \a mode. The default is QFtp::Passive.
\sa QFtp::TransferMode
}
/*!
+ \internal
Enables use of the FTP proxy on host \a host and port \a
port. Calling this function with \a host empty disables proxying.
}
/*!
+ \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.
}
/*!
+ \internal
Changes the working directory of the server to \a dir.
The function does not block and returns immediately. The command
}
/*!
+ \internal
Downloads the file \a file from the server.
If \a dev is 0, then the readyRead() signal is emitted when there
}
/*!
+ \internal
\overload
Writes a copy of the given \a data to the file called \a file on
}
/*!
+ \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
}
/*!
+ \internal
Deletes the file called \a file from the server.
The function does not block and returns immediately. The command
}
/*!
+ \internal
Creates a directory called \a dir on the server.
The function does not block and returns immediately. The command
}
/*!
+ \internal
Removes the directory called \a dir from the server.
The function does not block and returns immediately. The command
}
/*!
+ \internal
Renames the file called \a oldname to \a newname on the server.
The function does not block and returns immediately. The command
}
/*!
+ \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
}
/*!
+ \internal
Returns the number of bytes that can be read from the data socket
at the moment.
}
/*!
+ \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.
}
/*!
+ \internal
Reads all the bytes available from the data socket and returns
them.
}
/*!
+ \internal
Aborts the current command and deletes all scheduled commands.
If there is an unfinished command (i.e. a command for which the
}
/*!
+ \internal
Returns the identifier of the FTP command that is being executed
or 0 if there is no command being executed.
}
/*!
+ \internal
Returns the command type of the FTP command being executed or \c
None if there is no command being executed.
}
/*!
+ \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.
}
/*!
+ \internal
Returns true if there are any commands scheduled that have not yet
been executed; otherwise returns false.
}
/*!
+ \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().
}
/*!
+ \internal
Returns the current state of the object. When the state changes,
the stateChanged() signal is emitted.
}
/*!
+ \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.
}
/*!
+ \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
}
/*!
+ \internal
Destructor.
*/
QFtp::~QFtp()
#include "qftp.moc"
-#include "moc_qftp.cpp"
+#include "moc_qftp_p.cpp"
#endif // QT_NO_FTP
**
****************************************************************************/
+//
+// 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
class QFtpPrivate;
-class Q_NETWORK_EXPORT QFtp : public QObject
+class Q_AUTOTEST_EXPORT QFtp : public QObject
{
Q_OBJECT
#include "qnetworkaccesscache_p.h"
#include "qnetworkrequest.h"
#include "qnetworkreply.h"
-#include "QtNetwork/qftp.h"
+#include "private/qftp_p.h"
#include "QtCore/qpointer.h"
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.
\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
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
*/
/*!
\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}
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)
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
qhttpnetworkconnection \
qnetworkreply \
qnetworkcachemetadata \
- qftp \
qhttpnetworkreply \
qabstractnetworkcache \
!contains(QT_CONFIG, private_tests): SUBDIRS -= \
qhttpnetworkconnection \
qhttpnetworkreply \
-
+ qftp \
#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>
#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>
// 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()
// 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()