617 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			617 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ////////////////////////////////////////////////////////////
 | |
| //
 | |
| // SFML - Simple and Fast Multimedia Library
 | |
| // Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
 | |
| //
 | |
| // This software is provided 'as-is', without any express or implied warranty.
 | |
| // In no event will the authors be held liable for any damages arising from the use of this software.
 | |
| //
 | |
| // Permission is granted to anyone to use this software for any purpose,
 | |
| // including commercial applications, and to alter it and redistribute it freely,
 | |
| // subject to the following restrictions:
 | |
| //
 | |
| // 1. The origin of this software must not be misrepresented;
 | |
| //    you must not claim that you wrote the original software.
 | |
| //    If you use this software in a product, an acknowledgment
 | |
| //    in the product documentation would be appreciated but is not required.
 | |
| //
 | |
| // 2. Altered source versions must be plainly marked as such,
 | |
| //    and must not be misrepresented as being the original software.
 | |
| //
 | |
| // 3. This notice may not be removed or altered from any source distribution.
 | |
| //
 | |
| ////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef SFML_FTP_HPP
 | |
| #define SFML_FTP_HPP
 | |
| 
 | |
| ////////////////////////////////////////////////////////////
 | |
| // Headers
 | |
| ////////////////////////////////////////////////////////////
 | |
| #include <SFML/Network/Export.hpp>
 | |
| #include <SFML/Network/TcpSocket.hpp>
 | |
| #include <SFML/System/NonCopyable.hpp>
 | |
| #include <SFML/System/Time.hpp>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| 
 | |
| namespace sf
 | |
| {
 | |
| class IpAddress;
 | |
| 
 | |
| ////////////////////////////////////////////////////////////
 | |
| /// \brief A FTP client
 | |
| ///
 | |
| ////////////////////////////////////////////////////////////
 | |
| class SFML_NETWORK_API Ftp : NonCopyable
 | |
| {
 | |
| public:
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Enumeration of transfer modes
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     enum TransferMode
 | |
|     {
 | |
|         Binary, ///< Binary mode (file is transfered as a sequence of bytes)
 | |
|         Ascii,  ///< Text mode using ASCII encoding
 | |
|         Ebcdic  ///< Text mode using EBCDIC encoding
 | |
|     };
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Define a FTP response
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     class SFML_NETWORK_API Response
 | |
|     {
 | |
|     public:
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Status codes possibly returned by a FTP response
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         enum Status
 | |
|         {
 | |
|             // 1xx: the requested action is being initiated,
 | |
|             // expect another reply before proceeding with a new command
 | |
|             RestartMarkerReply          = 110, ///< Restart marker reply
 | |
|             ServiceReadySoon            = 120, ///< Service ready in N minutes
 | |
|             DataConnectionAlreadyOpened = 125, ///< Data connection already opened, transfer starting
 | |
|             OpeningDataConnection       = 150, ///< File status ok, about to open data connection
 | |
| 
 | |
|             // 2xx: the requested action has been successfully completed
 | |
|             Ok                    = 200, ///< Command ok
 | |
|             PointlessCommand      = 202, ///< Command not implemented
 | |
|             SystemStatus          = 211, ///< System status, or system help reply
 | |
|             DirectoryStatus       = 212, ///< Directory status
 | |
|             FileStatus            = 213, ///< File status
 | |
|             HelpMessage           = 214, ///< Help message
 | |
|             SystemType            = 215, ///< NAME system type, where NAME is an official system name from the list in the Assigned Numbers document
 | |
|             ServiceReady          = 220, ///< Service ready for new user
 | |
|             ClosingConnection     = 221, ///< Service closing control connection
 | |
|             DataConnectionOpened  = 225, ///< Data connection open, no transfer in progress
 | |
|             ClosingDataConnection = 226, ///< Closing data connection, requested file action successful
 | |
|             EnteringPassiveMode   = 227, ///< Entering passive mode
 | |
|             LoggedIn              = 230, ///< User logged in, proceed. Logged out if appropriate
 | |
|             FileActionOk          = 250, ///< Requested file action ok
 | |
|             DirectoryOk           = 257, ///< PATHNAME created
 | |
| 
 | |
|             // 3xx: the command has been accepted, but the requested action
 | |
|             // is dormant, pending receipt of further information
 | |
|             NeedPassword       = 331, ///< User name ok, need password
 | |
|             NeedAccountToLogIn = 332, ///< Need account for login
 | |
|             NeedInformation    = 350, ///< Requested file action pending further information
 | |
| 
 | |
|             // 4xx: the command was not accepted and the requested action did not take place,
 | |
|             // but the error condition is temporary and the action may be requested again
 | |
|             ServiceUnavailable        = 421, ///< Service not available, closing control connection
 | |
|             DataConnectionUnavailable = 425, ///< Can't open data connection
 | |
|             TransferAborted           = 426, ///< Connection closed, transfer aborted
 | |
|             FileActionAborted         = 450, ///< Requested file action not taken
 | |
|             LocalError                = 451, ///< Requested action aborted, local error in processing
 | |
|             InsufficientStorageSpace  = 452, ///< Requested action not taken; insufficient storage space in system, file unavailable
 | |
| 
 | |
|             // 5xx: the command was not accepted and
 | |
|             // the requested action did not take place
 | |
|             CommandUnknown          = 500, ///< Syntax error, command unrecognized
 | |
|             ParametersUnknown       = 501, ///< Syntax error in parameters or arguments
 | |
|             CommandNotImplemented   = 502, ///< Command not implemented
 | |
|             BadCommandSequence      = 503, ///< Bad sequence of commands
 | |
|             ParameterNotImplemented = 504, ///< Command not implemented for that parameter
 | |
|             NotLoggedIn             = 530, ///< Not logged in
 | |
|             NeedAccountToStore      = 532, ///< Need account for storing files
 | |
|             FileUnavailable         = 550, ///< Requested action not taken, file unavailable
 | |
|             PageTypeUnknown         = 551, ///< Requested action aborted, page type unknown
 | |
|             NotEnoughMemory         = 552, ///< Requested file action aborted, exceeded storage allocation
 | |
|             FilenameNotAllowed      = 553, ///< Requested action not taken, file name not allowed
 | |
| 
 | |
|             // 10xx: SFML custom codes
 | |
|             InvalidResponse  = 1000, ///< Not part of the FTP standard, generated by SFML when a received response cannot be parsed
 | |
|             ConnectionFailed = 1001, ///< Not part of the FTP standard, generated by SFML when the low-level socket connection with the server fails
 | |
|             ConnectionClosed = 1002, ///< Not part of the FTP standard, generated by SFML when the low-level socket connection is unexpectedly closed
 | |
|             InvalidFile      = 1003  ///< Not part of the FTP standard, generated by SFML when a local file cannot be read or written
 | |
|         };
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Default constructor
 | |
|         ///
 | |
|         /// This constructor is used by the FTP client to build
 | |
|         /// the response.
 | |
|         ///
 | |
|         /// \param code    Response status code
 | |
|         /// \param message Response message
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         explicit Response(Status code = InvalidResponse, const std::string& message = "");
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Check if the status code means a success
 | |
|         ///
 | |
|         /// This function is defined for convenience, it is
 | |
|         /// equivalent to testing if the status code is < 400.
 | |
|         ///
 | |
|         /// \return True if the status is a success, false if it is a failure
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         bool isOk() const;
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Get the status code of the response
 | |
|         ///
 | |
|         /// \return Status code
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         Status getStatus() const;
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Get the full message contained in the response
 | |
|         ///
 | |
|         /// \return The response message
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         const std::string& getMessage() const;
 | |
| 
 | |
|     private:
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         // Member data
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         Status      m_status;  ///< Status code returned from the server
 | |
|         std::string m_message; ///< Last message received from the server
 | |
|     };
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Specialization of FTP response returning a directory
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     class SFML_NETWORK_API DirectoryResponse : public Response
 | |
|     {
 | |
|     public:
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Default constructor
 | |
|         ///
 | |
|         /// \param response Source response
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         DirectoryResponse(const Response& response);
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Get the directory returned in the response
 | |
|         ///
 | |
|         /// \return Directory name
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         const std::string& getDirectory() const;
 | |
| 
 | |
|     private:
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         // Member data
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         std::string m_directory; ///< Directory extracted from the response message
 | |
|     };
 | |
| 
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Specialization of FTP response returning a
 | |
|     ///        filename listing
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     class SFML_NETWORK_API ListingResponse : public Response
 | |
|     {
 | |
|     public:
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Default constructor
 | |
|         ///
 | |
|         /// \param response  Source response
 | |
|         /// \param data      Data containing the raw listing
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         ListingResponse(const Response& response, const std::string& data);
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         /// \brief Return the array of directory/file names
 | |
|         ///
 | |
|         /// \return Array containing the requested listing
 | |
|         ///
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         const std::vector<std::string>& getListing() const;
 | |
| 
 | |
|     private:
 | |
| 
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         // Member data
 | |
|         ////////////////////////////////////////////////////////////
 | |
|         std::vector<std::string> m_listing; ///< Directory/file names extracted from the data
 | |
|     };
 | |
| 
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Destructor
 | |
|     ///
 | |
|     /// Automatically closes the connection with the server if
 | |
|     /// it is still opened.
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     ~Ftp();
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Connect to the specified FTP server
 | |
|     ///
 | |
|     /// The port has a default value of 21, which is the standard
 | |
|     /// port used by the FTP protocol. You shouldn't use a different
 | |
|     /// value, unless you really know what you do.
 | |
|     /// This function tries to connect to the server so it may take
 | |
|     /// a while to complete, especially if the server is not
 | |
|     /// reachable. To avoid blocking your application for too long,
 | |
|     /// you can use a timeout. The default value, Time::Zero, means that the
 | |
|     /// system timeout will be used (which is usually pretty long).
 | |
|     ///
 | |
|     /// \param server  Name or address of the FTP server to connect to
 | |
|     /// \param port    Port used for the connection
 | |
|     /// \param timeout Maximum time to wait
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see disconnect
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response connect(const IpAddress& server, unsigned short port = 21, Time timeout = Time::Zero);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Close the connection with the server
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see connect
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response disconnect();
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Log in using an anonymous account
 | |
|     ///
 | |
|     /// Logging in is mandatory after connecting to the server.
 | |
|     /// Users that are not logged in cannot perform any operation.
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response login();
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Log in using a username and a password
 | |
|     ///
 | |
|     /// Logging in is mandatory after connecting to the server.
 | |
|     /// Users that are not logged in cannot perform any operation.
 | |
|     ///
 | |
|     /// \param name     User name
 | |
|     /// \param password Password
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response login(const std::string& name, const std::string& password);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Send a null command to keep the connection alive
 | |
|     ///
 | |
|     /// This command is useful because the server may close the
 | |
|     /// connection automatically if no command is sent.
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response keepAlive();
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Get the current working directory
 | |
|     ///
 | |
|     /// The working directory is the root path for subsequent
 | |
|     /// operations involving directories and/or filenames.
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see getDirectoryListing, changeDirectory, parentDirectory
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     DirectoryResponse getWorkingDirectory();
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Get the contents of the given directory
 | |
|     ///
 | |
|     /// This function retrieves the sub-directories and files
 | |
|     /// contained in the given directory. It is not recursive.
 | |
|     /// The \a directory parameter is relative to the current
 | |
|     /// working directory.
 | |
|     ///
 | |
|     /// \param directory Directory to list
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see getWorkingDirectory, changeDirectory, parentDirectory
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     ListingResponse getDirectoryListing(const std::string& directory = "");
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Change the current working directory
 | |
|     ///
 | |
|     /// The new directory must be relative to the current one.
 | |
|     ///
 | |
|     /// \param directory New working directory
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see getWorkingDirectory, getDirectoryListing, parentDirectory
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response changeDirectory(const std::string& directory);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Go to the parent directory of the current one
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see getWorkingDirectory, getDirectoryListing, changeDirectory
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response parentDirectory();
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Create a new directory
 | |
|     ///
 | |
|     /// The new directory is created as a child of the current
 | |
|     /// working directory.
 | |
|     ///
 | |
|     /// \param name Name of the directory to create
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see deleteDirectory
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response createDirectory(const std::string& name);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Remove an existing directory
 | |
|     ///
 | |
|     /// The directory to remove must be relative to the
 | |
|     /// current working directory.
 | |
|     /// Use this function with caution, the directory will
 | |
|     /// be removed permanently!
 | |
|     ///
 | |
|     /// \param name Name of the directory to remove
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see createDirectory
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response deleteDirectory(const std::string& name);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Rename an existing file
 | |
|     ///
 | |
|     /// The filenames must be relative to the current working
 | |
|     /// directory.
 | |
|     ///
 | |
|     /// \param file    File to rename
 | |
|     /// \param newName New name of the file
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see deleteFile
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response renameFile(const std::string& file, const std::string& newName);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Remove an existing file
 | |
|     ///
 | |
|     /// The file name must be relative to the current working
 | |
|     /// directory.
 | |
|     /// Use this function with caution, the file will be
 | |
|     /// removed permanently!
 | |
|     ///
 | |
|     /// \param name File to remove
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see renameFile
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response deleteFile(const std::string& name);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Download a file from the server
 | |
|     ///
 | |
|     /// The filename of the distant file is relative to the
 | |
|     /// current working directory of the server, and the local
 | |
|     /// destination path is relative to the current directory
 | |
|     /// of your application.
 | |
|     /// If a file with the same filename as the distant file
 | |
|     /// already exists in the local destination path, it will
 | |
|     /// be overwritten.
 | |
|     ///
 | |
|     /// \param remoteFile Filename of the distant file to download
 | |
|     /// \param localPath  The directory in which to put the file on the local computer
 | |
|     /// \param mode       Transfer mode
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see upload
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response download(const std::string& remoteFile, const std::string& localPath, TransferMode mode = Binary);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Upload a file to the server
 | |
|     ///
 | |
|     /// The name of the local file is relative to the current
 | |
|     /// working directory of your application, and the
 | |
|     /// remote path is relative to the current directory of the
 | |
|     /// FTP server.
 | |
|     ///
 | |
|     /// The append parameter controls whether the remote file is
 | |
|     /// appended to or overwritten if it already exists.
 | |
|     ///
 | |
|     /// \param localFile  Path of the local file to upload
 | |
|     /// \param remotePath The directory in which to put the file on the server
 | |
|     /// \param mode       Transfer mode
 | |
|     /// \param append     Pass true to append to or false to overwrite the remote file if it already exists
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     /// \see download
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response upload(const std::string& localFile, const std::string& remotePath, TransferMode mode = Binary, bool append = false);
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Send a command to the FTP server
 | |
|     ///
 | |
|     /// While the most often used commands are provided as member
 | |
|     /// functions in the sf::Ftp class, this method can be used
 | |
|     /// to send any FTP command to the server. If the command
 | |
|     /// requires one or more parameters, they can be specified
 | |
|     /// in \a parameter. If the server returns information, you
 | |
|     /// can extract it from the response using Response::getMessage().
 | |
|     ///
 | |
|     /// \param command   Command to send
 | |
|     /// \param parameter Command parameter
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response sendCommand(const std::string& command, const std::string& parameter = "");
 | |
| 
 | |
| private:
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Receive a response from the server
 | |
|     ///
 | |
|     /// This function must be called after each call to
 | |
|     /// sendCommand that expects a response.
 | |
|     ///
 | |
|     /// \return Server response to the request
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     Response getResponse();
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     /// \brief Utility class for exchanging datas with the server
 | |
|     ///        on the data channel
 | |
|     ///
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     class DataChannel;
 | |
| 
 | |
|     friend class DataChannel;
 | |
| 
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     // Member data
 | |
|     ////////////////////////////////////////////////////////////
 | |
|     TcpSocket   m_commandSocket; ///< Socket holding the control connection with the server
 | |
|     std::string m_receiveBuffer; ///< Received command data that is yet to be processed
 | |
| };
 | |
| 
 | |
| } // namespace sf
 | |
| 
 | |
| 
 | |
| #endif // SFML_FTP_HPP
 | |
| 
 | |
| 
 | |
| ////////////////////////////////////////////////////////////
 | |
| /// \class sf::Ftp
 | |
| /// \ingroup network
 | |
| ///
 | |
| /// sf::Ftp is a very simple FTP client that allows you
 | |
| /// to communicate with a FTP server. The FTP protocol allows
 | |
| /// you to manipulate a remote file system (list files,
 | |
| /// upload, download, create, remove, ...).
 | |
| ///
 | |
| /// Using the FTP client consists of 4 parts:
 | |
| /// \li Connecting to the FTP server
 | |
| /// \li Logging in (either as a registered user or anonymously)
 | |
| /// \li Sending commands to the server
 | |
| /// \li Disconnecting (this part can be done implicitly by the destructor)
 | |
| ///
 | |
| /// Every command returns a FTP response, which contains the
 | |
| /// status code as well as a message from the server. Some
 | |
| /// commands such as getWorkingDirectory() and getDirectoryListing()
 | |
| /// return additional data, and use a class derived from
 | |
| /// sf::Ftp::Response to provide this data. The most often used
 | |
| /// commands are directly provided as member functions, but it is
 | |
| /// also possible to use specific commands with the sendCommand() function.
 | |
| ///
 | |
| /// Note that response statuses >= 1000 are not part of the FTP standard,
 | |
| /// they are generated by SFML when an internal error occurs.
 | |
| ///
 | |
| /// All commands, especially upload and download, may take some
 | |
| /// time to complete. This is important to know if you don't want
 | |
| /// to block your application while the server is completing
 | |
| /// the task.
 | |
| ///
 | |
| /// Usage example:
 | |
| /// \code
 | |
| /// // Create a new FTP client
 | |
| /// sf::Ftp ftp;
 | |
| ///
 | |
| /// // Connect to the server
 | |
| /// sf::Ftp::Response response = ftp.connect("ftp://ftp.myserver.com");
 | |
| /// if (response.isOk())
 | |
| ///     std::cout << "Connected" << std::endl;
 | |
| ///
 | |
| /// // Log in
 | |
| /// response = ftp.login("laurent", "dF6Zm89D");
 | |
| /// if (response.isOk())
 | |
| ///     std::cout << "Logged in" << std::endl;
 | |
| ///
 | |
| /// // Print the working directory
 | |
| /// sf::Ftp::DirectoryResponse directory = ftp.getWorkingDirectory();
 | |
| /// if (directory.isOk())
 | |
| ///     std::cout << "Working directory: " << directory.getDirectory() << std::endl;
 | |
| ///
 | |
| /// // Create a new directory
 | |
| /// response = ftp.createDirectory("files");
 | |
| /// if (response.isOk())
 | |
| ///     std::cout << "Created new directory" << std::endl;
 | |
| ///
 | |
| /// // Upload a file to this new directory
 | |
| /// response = ftp.upload("local-path/file.txt", "files", sf::Ftp::Ascii);
 | |
| /// if (response.isOk())
 | |
| ///     std::cout << "File uploaded" << std::endl;
 | |
| ///
 | |
| /// // Send specific commands (here: FEAT to list supported FTP features)
 | |
| /// response = ftp.sendCommand("FEAT");
 | |
| /// if (response.isOk())
 | |
| ///     std::cout << "Feature list:\n" << response.getMessage() << std::endl;
 | |
| ///
 | |
| /// // Disconnect from the server (optional)
 | |
| /// ftp.disconnect();
 | |
| /// \endcode
 | |
| ///
 | |
| ////////////////////////////////////////////////////////////
 |