/****************************************************************************
**
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtNetwork module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** 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, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.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 the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
//#define QFTPPI_DEBUG
//#define QFTPDTP_DEBUG
#include "qftp.h"
#include "qabstractsocket.h"
#ifndef QT_NO_FTP
#include "qcoreapplication.h"
#include "qtcpsocket.h"
#include "qurlinfo.h"
#include "qstringlist.h"
#include "qregexp.h"
#include "qtimer.h"
#include "qfileinfo.h"
#include "qhash.h"
#include "qtcpserver.h"
#include "qlocale.h"
QT_BEGIN_NAMESPACE
class QFtpPI;
/*
The QFtpDTP (DTP = Data Transfer Process) controls all client side
data transfer between the client and server.
*/
class QFtpDTP : public QObject
{
Q_OBJECT
public:
enum ConnectState {
CsHostFound,
CsConnected,
CsClosed,
CsHostNotFound,
CsConnectionRefused
};
QFtpDTP(QFtpPI *p, QObject *parent = 0);
void setData(QByteArray *);
void setDevice(QIODevice *);
void writeData();
void setBytesTotal(qint64 bytes);
bool hasError() const;
QString errorMessage() const;
void clearError();
void connectToHost(const QString & host, quint16 port);
int setupListener(const QHostAddress &address);
void waitForConnection();
QTcpSocket::SocketState state() const;
qint64 bytesAvailable() const;
qint64 read(char *data, qint64 maxlen);
QByteArray readAll();
void abortConnection();
static bool parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo *info);
signals:
void listInfo(const QUrlInfo&);
void readyRead();
void dataTransferProgress(qint64, qint64);
void connectState(int);
private slots:
void socketConnected();
void socketReadyRead();
void socketError(QAbstractSocket::SocketError);
void socketConnectionClosed();
void socketBytesWritten(qint64);
void setupSocket();
void dataReadyRead();
private:
void clearData();
QTcpSocket *socket;
QTcpServer listener;
QFtpPI *pi;
QString err;
qint64 bytesDone;
qint64 bytesTotal;
bool callWriteData;
// If is_ba is true, ba is used; ba is never 0.
// Otherwise dev is used; dev can be 0 or not.
union {
QByteArray *ba;
QIODevice *dev;
} data;
bool is_ba;
QByteArray bytesFromSocket;
};
/**********************************************************************
*
* QFtpPI - Protocol Interpreter
*
*********************************************************************/
class QFtpPI : public QObject
{
Q_OBJECT
public:
QFtpPI(QObject *parent = 0);
void connectToHost(const QString &host, quint16 port);
bool sendCommands(const QStringList &cmds);
bool sendCommand(const QString &cmd)
{ return sendCommands(QStringList(cmd)); }
void clearPendingCommands();
void abort();
QString currentCommand() const
{ return currentCmd; }
bool rawCommand;
bool transferConnectionExtended;
QFtpDTP dtp; // the PI has a DTP which is not the design of RFC 959, but it
// makes the design simpler this way
signals:
void connectState(int);
void finished(const QString&);
void error(int, const QString&);
void rawFtpReply(int, const QString&);
private slots:
void hostFound();
void connected();
void connectionClosed();
void delayedCloseFinished();
void readyRead();
void error(QAbstractSocket::SocketError);
void dtpConnectState(int);
private:
// the states are modelled after the generalized state diagram of RFC 959,
// page 58
enum State {
Begin,
Idle,
Waiting,
Success,
Failure
};
enum AbortState {
None,
AbortStarted,
WaitForAbortToFinish
};
bool processReply();
bool startNextCmd();
QTcpSocket commandSocket;
QString replyText;
char replyCode[3];
State state;
AbortState abortState;
QStringList pendingCommands;
QString currentCmd;
bool waitForDtpToConnect;
bool waitForDtpToClose;
QByteArray bytesFromSocket;
friend class QFtpDTP;
};
/**********************************************************************
*
* QFtpCommand implemenatation
*
*********************************************************************/
class QFtpCommand
{
public:
QFtpCommand(QFtp::Command cmd, QStringList raw, const QByteArray &ba);
QFtpCommand(QFtp::Command cmd, QStringList raw, QIODevice *dev = 0);
~QFtpCommand();
int id;
QFtp::Command command;
QStringList rawCmds;
// If is_ba is true, ba is used; ba is never 0.
// Otherwise dev is used; dev can be 0 or not.
union {
QByteArray *ba;
QIODevice *dev;
} data;
bool is_ba;
static QBasicAtomicInt idCounter;
};
QBasicAtomicInt QFtpCommand::idCounter = Q_BASIC_ATOMIC_INITIALIZER(1);
QFtpCommand::QFtpCommand(QFtp::Command cmd, QStringList raw, const QByteArray &ba)
: command(cmd), rawCmds(raw), is_ba(true)
{
id = idCounter.fetchAndAddRelaxed(1);
data.ba = new QByteArray(ba);
}
QFtpCommand::QFtpCommand(QFtp::Command cmd, QStringList raw, QIODevice *dev)
: command(cmd), rawCmds(raw), is_ba(false)
{
id = idCounter.fetchAndAddRelaxed(1);
data.dev = dev;
}
QFtpCommand::~QFtpCommand()
{
if (is_ba)
delete data.ba;
}
/**********************************************************************
*
* QFtpDTP implemenatation
*
*********************************************************************/
QFtpDTP::QFtpDTP(QFtpPI *p, QObject *parent) :
QObject(parent),
socket(0),
listener(this),
pi(p),
callWriteData(false)
{
clearData();
listener.setObjectName(QLatin1String("QFtpDTP active state server"));
connect(&listener, SIGNAL(newConnection()), SLOT(setupSocket()));
}
void QFtpDTP::setData(QByteArray *ba)
{
is_ba = true;
data.ba = ba;
}
void QFtpDTP::setDevice(QIODevice *dev)
{
is_ba = false;
data.dev = dev;
}
void QFtpDTP::setBytesTotal(qint64 bytes)
{
bytesTotal = bytes;
bytesDone = 0;
emit dataTransferProgress(bytesDone, bytesTotal);
}
void QFtpDTP::connectTo
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
《QtCreator快速入门》第3版源码 (774个子文件)
libregexpplugin.a 2KB
qftp.cpp 75KB
qftp.cpp 75KB
qurlinfo.cpp 16KB
qurlinfo.cpp 16KB
mainwindow.cpp 8KB
mainwindow.cpp 7KB
mainwindow.cpp 7KB
mywidget.cpp 6KB
mainwindow.cpp 6KB
mainwindow.cpp 6KB
main.cpp 5KB
mainwindow.cpp 5KB
mainwindow.cpp 5KB
mainwindow.cpp 5KB
stringlistmodel.cpp 5KB
mainwindow.cpp 5KB
myopenglwidget.cpp 4KB
mainwindow.cpp 4KB
client.cpp 4KB
mainwindow.cpp 4KB
mainwindow.cpp 4KB
myitem.cpp 4KB
myitem.cpp 4KB
widget.cpp 4KB
mainwindow.cpp 4KB
myopenglwidget.cpp 3KB
server.cpp 3KB
myopenglwidget.cpp 3KB
mainwindow.cpp 3KB
main.cpp 3KB
myitem.cpp 3KB
mainwindow.cpp 3KB
widget.cpp 3KB
main.cpp 3KB
myopenglwidget.cpp 3KB
mainwindow.cpp 3KB
widget.cpp 2KB
main.cpp 2KB
main.cpp 2KB
widget.cpp 2KB
main.cpp 2KB
mainwindow.cpp 2KB
dialog.cpp 2KB
mainwindow.cpp 2KB
main.cpp 2KB
widget.cpp 2KB
mainwindow.cpp 2KB
mainwindow.cpp 2KB
stringlistmodel.cpp 2KB
main.cpp 2KB
myopenglwidget.cpp 2KB
main.cpp 2KB
main.cpp 2KB
widget.cpp 2KB
myopenglwidget.cpp 2KB
main.cpp 2KB
myitem.cpp 2KB
mainwindow.cpp 2KB
mainwindow.cpp 2KB
main.cpp 2KB
mainwindow.cpp 2KB
client.cpp 2KB
mywidget.cpp 2KB
widget.cpp 2KB
widget.cpp 2KB
widget.cpp 2KB
main.cpp 2KB
mainwindow.cpp 2KB
mainwindow.cpp 2KB
main.cpp 2KB
main.cpp 2KB
mainwindow.cpp 2KB
mydesignerpluginplugin.cpp 2KB
main.cpp 2KB
widget.cpp 2KB
mysax.cpp 2KB
widget.cpp 1KB
main.cpp 1KB
spinboxdelegate.cpp 1KB
assistant.cpp 1KB
widget.cpp 1KB
server.cpp 1KB
main.cpp 1KB
stringlistmodel.cpp 1KB
main.cpp 1KB
main.cpp 1KB
mainwindow.cpp 1KB
myopenglwidget.cpp 1KB
mywidget.cpp 1KB
widget.cpp 1KB
main.cpp 1KB
mainwindow.cpp 1KB
widget.cpp 1KB
myaction.cpp 1KB
mainwindow.cpp 1KB
main.cpp 1KB
main.cpp 1KB
main.cpp 1KB
widget.cpp 1KB
共 774 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8
资源评论
- 李亚军12122018-01-15压缩文件损坏
- alpha_0072023-04-18需要继续努力。
Deng.Pan
- 粉丝: 3
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功