source: trunk/doc/src/examples/ftp.qdoc@ 109

Last change on this file since 109 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 8.9 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the documentation of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \example network/ftp
44 \title FTP Example
45
46 The FTP example demonstrates a simple FTP client that can be used
47 to list the available files on an FTP server and download them.
48
49 \image ftp-example.png
50
51 The user of the example can enter the address or hostname of an
52 FTP server in the \gui {Ftp Server} line edit, and then push the
53 \gui Connect button to connect to it. A list of the server's
54 top-level directory is then presented in the \gui {File List} tree
55 view. If the selected item in the view is a file, the user can
56 download it by pushing the \gui Download button. An item
57 representing a directory can be double clicked with the mouse to
58 show the contents of that directory in the view.
59
60 The functionality required for the example is implemented in the
61 QFtp class, which provides an easy, high-level interface to the
62 file transfer protocol. FTP operations are requested through
63 \l{QFtp::Command}s. The operations are asynchronous. QFtp will
64 notify us through signals when commands are started and finished.
65
66 We have one class, \c FtpWindow, which sets up the GUI and handles
67 the FTP functionality. We will now go through its definition and
68 implementation - focusing on the code concerning FTP. The code for
69 managing the GUI is explained in other examples.
70
71 \section1 FtpWindow Class Definition
72
73 The \c FtpWindow class displays a window, in which the user can
74 connect to and browse the contents of an FTP server. The slots of
75 \c FtpWindow are connected to its widgets, and contain the
76 functionality for managing the FTP connection. We also connect to
77 signals in QFtp, which tells us when the
78 \l{QFtp::Command}{commands} we request are finished, the progress
79 of current commands, and information about files on the server.
80
81 \snippet examples/network/ftp/ftpwindow.h 0
82
83 We will look at each slot when we examine the \c FtpWindow
84 implementation in the next section. We also make use of a few
85 private variables:
86
87 \snippet examples/network/ftp/ftpwindow.h 1
88
89 The \c isDirectory hash keeps a history of all entries explored on
90 the FTP server, and registers whether an entry represents a
91 directory or a file. We use the QFile object to download files
92 from the FTP server.
93
94 \section1 FtpWindow Class Implementation
95
96 We skip the \c FtpWindow constructor as it only contains code for
97 setting up the GUI, which is explained in other examples.
98
99 We move on to the slots, starting with \c connectOrDisconnect().
100
101 \snippet examples/network/ftp/ftpwindow.cpp 0
102
103 If \c ftp is already pointing to a QFtp object, we QFtp::Close its
104 FTP connection and delete the object it points to. Note that we do
105 not delete the object using standard C++ \c delete as we need it
106 to finish its abort operation.
107
108 \dots
109 \snippet examples/network/ftp/ftpwindow.cpp 1
110
111 If we get here, \c connectOrDisconnect() was called to establish a
112 new FTP connection. We create a new QFtp for our new connection,
113 and connect its signals to slots in \c FtpWindow. The
114 \l{QFtp::}{listInfo()} signal is emitted whenever information
115 about a single file on the sever has been resolved. This signal is
116 sent when we ask QFtp to \l{QFtp::}{list()} the contents of a
117 directory. Finally, the \l{QFtp::}{dataTransferProgress()} signal
118 is emitted repeatedly during an FTP file transfer, giving us
119 progress reports.
120
121 \snippet examples/network/ftp/ftpwindow.cpp 2
122
123 The \gui {Ftp Server} line edit contains the IP address or
124 hostname of the server to which we want to connect. We first check
125 that the URL is a valid FTP sever address. If it isn't, we still
126 try to connect using the plain text in \c ftpServerLineEdit. In
127 either case, we assume that port \c 21 is used.
128
129 If the URL does not contain a user name and password, we use
130 QFtp::login(), which will attempt to log into the FTP sever as an
131 anonymous user. The QFtp object will now notify us when it has
132 connected to the FTP server; it will also send a signal if it
133 fails to connect or the username and password were rejected.
134
135 We move on to the \c downloadFile() slot:
136
137 \snippet examples/network/ftp/ftpwindow.cpp 3
138 \dots
139 \snippet examples/network/ftp/ftpwindow.cpp 4
140
141 We first fetch the name of the file, which we find in the selected
142 item of \c fileList. We then start the download by using
143 QFtp::get(). QFtp will send progress signals during the download
144 and a signal when the download is completed.
145
146 \snippet examples/network/ftp/ftpwindow.cpp 5
147
148 QFtp supports canceling the download of files.
149
150 \snippet examples/network/ftp/ftpwindow.cpp 6
151
152 The \c ftpCommandFinished() slot is called when QFtp has
153 finished a QFtp::Command. If an error occurred during the
154 command, QFtp will set \c error to one of the values in
155 the QFtp::Error enum; otherwise, \c error is zero.
156
157 \snippet examples/network/ftp/ftpwindow.cpp 7
158
159 After login, the QFtp::list() function will list the top-level
160 directory on the server. addToList() is connected to
161 QFtp::listInfo(), and will be invoked for each entry in that
162 directory.
163
164 \snippet examples/network/ftp/ftpwindow.cpp 8
165
166 When a \l{QFtp::}{Get} command is finished, a file has finished
167 downloading (or an error occurred during the download).
168
169 \snippet examples/network/ftp/ftpwindow.cpp 9
170
171 After a \l{QFtp::}{List} command is performed, we have to check if
172 no entries were found (in which case our \c addToList() function
173 would not have been called).
174
175 Let's continue with the the \c addToList() slot:
176
177 \snippet examples/network/ftp/ftpwindow.cpp 10
178
179 When a new file has been resolved during a QFtp::List command,
180 this slot is invoked with a QUrlInfo describing the file. We
181 create a separate row for the file in \c fileList. If \c fileList
182 does not have a current item, we set the new item to be the
183 current item.
184
185 \snippet examples/network/ftp/ftpwindow.cpp 11
186
187 The \c processItem() slot is called when an item is double clicked
188 in the \gui {File List}. If the item represents a directory, we
189 want to load the contents of that directory with QFtp::list().
190
191 \snippet examples/network/ftp/ftpwindow.cpp 12
192
193 \c cdToParent() is invoked when the the user requests to go to the
194 parent directory of the one displayed in the file list. After
195 changing the directory, we QFtp::List its contents.
196
197 \snippet examples/network/ftp/ftpwindow.cpp 13
198
199 The \c updateDataTransferProgress() slot is called regularly by
200 QFtp::dataTransferProgress() when a file download is in progress.
201 We use a QProgressDialog to show the download progression to the
202 user.
203
204 \snippet examples/network/ftp/ftpwindow.cpp 14
205
206 The \c enableDownloadButton() is called whenever the current item
207 in \c fileList changes. If the item represents a file, the \gui
208 {Enable Download} Button should be enabled; otherwise, it is
209 disabled.
210*/
211
Note: See TracBrowser for help on using the repository browser.