KVIrc 5.2.6
Developer APIs
qftp.h
Go to the documentation of this file.
1/****************************************************************************
2**
3** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the QtNetwork module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Digia. For licensing terms and
14** conditions see http://qt.digia.com/licensing. For further information
15** use the contact form at http://qt.digia.com/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
25** In addition, as a special exception, Digia gives you certain additional
26** rights. These rights are described in the Digia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file. Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
37**
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QFTP_H
43#define QFTP_H
44
45#include <qstring.h>
46#include <qobject.h>
47#include <qurlinfo.h>
48#include <qtcpsocket.h>
49#include <qtcpserver.h>
50#include <qstringlist.h>
51#include <qbytearray.h>
52
53QT_BEGIN_NAMESPACE
54
55class QFtpPrivate;
56
57class QFtp : public QObject
58{
59 Q_OBJECT
60
61public:
62 explicit QFtp(QObject * parent = 0);
63 virtual ~QFtp();
64
110
111 int setProxy(const QString & host, quint16 port);
112 int connectToHost(const QString & host, quint16 port = 21);
113 int login(const QString & user = QString(), const QString & password = QString());
114 int close();
116 int list(const QString & dir = QString());
117 int cd(const QString & dir);
118 int get(const QString & file, QIODevice * dev = 0, TransferType type = Binary);
119 int put(const QByteArray & data, const QString & file, TransferType type = Binary);
120 int put(QIODevice * dev, const QString & file, TransferType type = Binary);
121 int remove(const QString & file);
122 int mkdir(const QString & dir);
123 int rmdir(const QString & dir);
124 int rename(const QString & oldname, const QString & newname);
125
126 int rawCommand(const QString & command);
127
128 qint64 bytesAvailable() const;
129 qint64 read(char * data, qint64 maxlen);
130 QByteArray readAll();
131
132 int currentId() const;
133 QIODevice * currentDevice() const;
134 Command currentCommand() const;
135 bool hasPendingCommands() const;
137
138 State state() const;
139
140 Error error() const;
141 QString errorString() const;
142
143public Q_SLOTS:
144 void abort();
145
146Q_SIGNALS:
147 void stateChanged(int);
148 void listInfo(const QUrlInfo &);
149 void readyRead();
150 void dataTransferProgress(qint64, qint64);
151 void rawCommandReply(int, const QString &);
152
153 void commandStarted(int);
154 void commandFinished(int, bool);
155 void done(bool);
156
157private:
158 Q_DISABLE_COPY(QFtp)
159 QScopedPointer<QFtpPrivate> d;
160
161 void _q_startNextCommand();
162 void _q_piFinished(const QString &);
163 void _q_piError(int, const QString &);
164 void _q_piConnectState(int);
165 void _q_piFtpReply(int, const QString &);
166};
167
168class QFtpPI;
169
170/*
171 The QFtpDTP (DTP = Data Transfer Process) controls all client side
172 data transfer between the client and server.
173*/
174class QFtpDTP : public QObject
175{
176 Q_OBJECT
177
178public:
187
188 QFtpDTP(QFtpPI * p, QObject * parent = 0);
189
190 void setData(QByteArray *);
191 void setDevice(QIODevice *);
192 void writeData();
193 void setBytesTotal(qint64 bytes);
194
195 bool hasError() const;
196 QString errorMessage() const;
197 void clearError();
198
199 void connectToHost(const QString & host, quint16 port);
200 int setupListener(const QHostAddress & address);
201 void waitForConnection();
202
203 QTcpSocket::SocketState state() const;
204 qint64 bytesAvailable() const;
205 qint64 read(char * data, qint64 maxlen);
206 QByteArray readAll();
207
208 void abortConnection();
209
210 static bool parseDir(const QByteArray & buffer, const QString & userName, QUrlInfo * info);
211
212signals:
213 void listInfo(const QUrlInfo &);
214 void readyRead();
215 void dataTransferProgress(qint64, qint64);
216
217 void connectState(int);
218
219private slots:
220 void socketConnected();
221 void socketReadyRead();
222 void socketError(QAbstractSocket::SocketError);
223 void socketConnectionClosed();
224 void socketBytesWritten(qint64);
225 void setupSocket();
226
227 void dataReadyRead();
228
229private:
230 void clearData();
231
232 QTcpSocket * socket;
233 QTcpServer listener;
234
236 QString err;
237 qint64 bytesDone;
240
241 // If is_ba is true, ba is used; ba is never 0.
242 // Otherwise dev is used; dev can be 0 or not.
243 union {
244 QByteArray * ba;
245 QIODevice * dev;
246 } data;
247 bool is_ba;
248
249 QByteArray bytesFromSocket;
250};
251
252/**********************************************************************
253 *
254 * QFtpPI - Protocol Interpreter
255 *
256 *********************************************************************/
257
258class QFtpPI : public QObject
259{
260 Q_OBJECT
261
262public:
263 QFtpPI(QObject * parent = 0);
264
265 void connectToHost(const QString & host, quint16 port);
266
267 bool sendCommands(const QStringList & cmds);
268 bool sendCommand(const QString & cmd)
269 {
270 return sendCommands(QStringList(cmd));
271 }
272
273 void clearPendingCommands();
274 void abort();
275
276 QString currentCommand() const
277 {
278 return currentCmd;
279 }
280
283
284 QFtpDTP dtp; // the PI has a DTP which is not the design of RFC 959, but it
285 // makes the design simpler this way
286signals:
287 void connectState(int);
288 void finished(const QString &);
289 void error(int, const QString &);
290 void rawFtpReply(int, const QString &);
291
292private slots:
293 void hostFound();
294 void connected();
295 void connectionClosed();
296 void delayedCloseFinished();
297 void readyRead();
298 void error(QAbstractSocket::SocketError);
299
300 void dtpConnectState(int);
301
302private:
303 // the states are modelled after the generalized state diagram of RFC 959,
304 // page 58
305 enum State
306 {
311 Failure
312 };
313
315 {
318 WaitForAbortToFinish
319 };
320
321 bool processReply();
322 bool startNextCmd();
323
324 QTcpSocket commandSocket;
325 QString replyText;
326 char replyCode[3];
329 QStringList pendingCommands;
330 QString currentCmd;
331
334
335 QByteArray bytesFromSocket;
336
337 friend class QFtpDTP;
338};
339
340QT_END_NAMESPACE
341
342#endif // QFTP_H
State
Definition NotifierSettings.h:62
Definition qftp.h:175
bool is_ba
Definition qftp.h:247
void dataTransferProgress(qint64, qint64)
void readyRead()
void connectState(int)
QFtpPI * pi
Definition qftp.h:235
QByteArray * ba
Definition qftp.h:244
bool callWriteData
Definition qftp.h:239
QString err
Definition qftp.h:236
qint64 bytesTotal
Definition qftp.h:238
QTcpSocket * socket
Definition qftp.h:232
qint64 bytesDone
Definition qftp.h:237
QIODevice * dev
Definition qftp.h:245
QByteArray bytesFromSocket
Definition qftp.h:249
void listInfo(const QUrlInfo &)
QTcpServer listener
Definition qftp.h:233
ConnectState
Definition qftp.h:180
@ CsHostNotFound
Definition qftp.h:184
@ CsHostFound
Definition qftp.h:181
@ CsClosed
Definition qftp.h:183
@ CsConnected
Definition qftp.h:182
Definition qftp.h:259
QStringList pendingCommands
Definition qftp.h:329
QString replyText
Definition qftp.h:325
AbortState abortState
Definition qftp.h:328
void finished(const QString &)
void error(int, const QString &)
QByteArray bytesFromSocket
Definition qftp.h:335
bool sendCommand(const QString &cmd)
Definition qftp.h:268
QString currentCommand() const
Definition qftp.h:276
bool rawCommand
Definition qftp.h:281
QString currentCmd
Definition qftp.h:330
bool transferConnectionExtended
Definition qftp.h:282
bool waitForDtpToConnect
Definition qftp.h:332
void connectState(int)
bool waitForDtpToClose
Definition qftp.h:333
State state
Definition qftp.h:327
QTcpSocket commandSocket
Definition qftp.h:324
State
Definition qftp.h:306
@ Idle
Definition qftp.h:308
@ Waiting
Definition qftp.h:309
@ Success
Definition qftp.h:310
@ Begin
Definition qftp.h:307
void rawFtpReply(int, const QString &)
QFtpDTP dtp
Definition qftp.h:284
AbortState
Definition qftp.h:315
@ None
Definition qftp.h:316
@ AbortStarted
Definition qftp.h:317
Definition qftp.cpp:1194
The QFtp class provides an implementation of the client side of FTP protocol.
Definition qftp.h:58
qint64 read(char *data, qint64 maxlen)
Definition qftp.cpp:1984
TransferType
Definition qftp.h:106
@ Ascii
Definition qftp.h:108
@ Binary
Definition qftp.h:107
void readyRead()
Error
Definition qftp.h:75
@ UnknownError
Definition qftp.h:77
@ ConnectionRefused
Definition qftp.h:79
@ NotConnected
Definition qftp.h:80
@ HostNotFound
Definition qftp.h:78
@ NoError
Definition qftp.h:76
void stateChanged(int)
Command currentCommand() const
Definition qftp.cpp:2057
int get(const QString &file, QIODevice *dev=0, TransferType type=Binary)
Definition qftp.cpp:1781
int rmdir(const QString &dir)
Definition qftp.cpp:1911
State
Definition qftp.h:66
@ Connecting
Definition qftp.h:69
@ LoggedIn
Definition qftp.h:71
@ Unconnected
Definition qftp.h:67
@ Closing
Definition qftp.h:72
@ Connected
Definition qftp.h:70
@ HostLookup
Definition qftp.h:68
bool hasPendingCommands() const
Definition qftp.cpp:2093
void _q_piFinished(const QString &)
Definition qftp.cpp:1380
void dataTransferProgress(qint64, qint64)
int rawCommand(const QString &command)
Definition qftp.cpp:1956
void _q_piFtpReply(int, const QString &)
Definition qftp.cpp:1392
int setTransferMode(TransferMode mode)
Definition qftp.cpp:1671
QFtp(QObject *parent=0)
Definition qftp.cpp:1354
int list(const QString &dir=QString())
Definition qftp.cpp:1710
Command
Definition qftp.h:83
@ Put
Definition qftp.h:93
@ List
Definition qftp.h:90
@ Cd
Definition qftp.h:91
@ Remove
Definition qftp.h:94
@ Get
Definition qftp.h:92
@ Login
Definition qftp.h:88
@ Rename
Definition qftp.h:97
@ SetProxy
Definition qftp.h:86
@ ConnectToHost
Definition qftp.h:87
@ Rmdir
Definition qftp.h:96
@ Close
Definition qftp.h:89
@ None
Definition qftp.h:84
@ Mkdir
Definition qftp.h:95
@ RawCommand
Definition qftp.h:98
@ SetTransferMode
Definition qftp.h:85
TransferMode
Definition qftp.h:101
@ Passive
Definition qftp.h:103
@ Active
Definition qftp.h:102
void done(bool)
QString errorString() const
Definition qftp.cpp:2146
virtual ~QFtp()
Definition qftp.cpp:2390
void listInfo(const QUrlInfo &)
void clearPendingCommands()
Definition qftp.cpp:2105
int setProxy(const QString &host, quint16 port)
Definition qftp.cpp:1686
int mkdir(const QString &dir)
Definition qftp.cpp:1892
Error error() const
Definition qftp.cpp:2130
int connectToHost(const QString &host, quint16 port=21)
Definition qftp.cpp:1607
void _q_startNextCommand()
Definition qftp.cpp:1376
QByteArray readAll()
Definition qftp.cpp:1995
int close()
Definition qftp.cpp:1661
void _q_piError(int, const QString &)
Definition qftp.cpp:1384
QScopedPointer< QFtpPrivate > d
Definition qftp.h:159
int login(const QString &user=QString(), const QString &password=QString())
Definition qftp.cpp:1635
int rename(const QString &oldname, const QString &newname)
Definition qftp.cpp:1930
QIODevice * currentDevice() const
Definition qftp.cpp:2074
void commandStarted(int)
void _q_piConnectState(int)
Definition qftp.cpp:1388
void commandFinished(int, bool)
State state() const
Definition qftp.cpp:2118
int currentId() const
Definition qftp.cpp:2044
int remove(const QString &file)
Definition qftp.cpp:1873
void rawCommandReply(int, const QString &)
void abort()
Definition qftp.cpp:2029
int cd(const QString &dir)
Definition qftp.cpp:1736
qint64 bytesAvailable() const
Definition qftp.cpp:1968
int put(const QByteArray &data, const QString &file, TransferType type=Binary)
Definition qftp.cpp:1818
The QUrlInfo class stores information about URLs.
Definition qurlinfo.h:55
#define p
Definition detector.cpp:81