doc/src/examples/ftp.qdoc
branchRCL_3
changeset 7 3f74d0d4af4c
equal deleted inserted replaced
6:dee5afe5301f 7:3f74d0d4af4c
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the documentation of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 /*!
       
    43     \example network/qftp
       
    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/qftp/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/qftp/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/qftp/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/qftp/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/qftp/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/qftp/ftpwindow.cpp 3
       
   138     \dots
       
   139     \snippet examples/network/qftp/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/qftp/ftpwindow.cpp 5
       
   147 
       
   148     QFtp supports canceling the download of files.
       
   149 
       
   150     \snippet examples/network/qftp/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/qftp/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/qftp/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/qftp/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 \c addToList() slot:
       
   176 
       
   177     \snippet examples/network/qftp/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/qftp/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/qftp/ftpwindow.cpp 12
       
   192 
       
   193     \c cdToParent() is invoked when 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/qftp/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/qftp/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