1/////////////////////////////////////////////////////////////////////////////
2// Name:        ftp.h
3// Purpose:     FTP protocol
4// Author:      Vadim Zeitlin
5// Modified by: Mark Johnson, wxWindows@mj10777.de
6//              20000917 : RmDir, GetLastResult, GetList
7// Created:     07/07/1997
8// RCS-ID:      $Id: ftp.h 61872 2009-09-09 22:37:05Z VZ $
9// Copyright:   (c) 1997, 1998 Guilhem Lavaux
10// Licence:     wxWindows licence
11/////////////////////////////////////////////////////////////////////////////
12
13#ifndef __WX_FTP_H__
14#define __WX_FTP_H__
15
16#include "wx/defs.h"
17
18#if wxUSE_PROTOCOL_FTP
19
20#include "wx/sckaddr.h"
21#include "wx/protocol/protocol.h"
22#include "wx/url.h"
23
24class WXDLLIMPEXP_NET wxFTP : public wxProtocol
25{
26public:
27    enum TransferMode
28    {
29        NONE,       // not set by user explicitly
30        ASCII,
31        BINARY
32    };
33
34    wxFTP();
35    virtual ~wxFTP();
36
37    // Connecting and disconnecting
38    void SetUser(const wxString& user) { m_user = user; }
39    void SetPassword(const wxString& passwd) { m_passwd = passwd; }
40
41    bool Connect(wxSockAddress& addr, bool wait = true);
42    bool Connect(const wxString& host);
43
44    // disconnect
45    virtual bool Close();
46
47    // Parameters set up
48
49    // set transfer mode now
50    void SetPassive(bool pasv) { m_bPassive = pasv; }
51    void SetDefaultTimeout(wxUint32 Value);
52    bool SetBinary() { return SetTransferMode(BINARY); }
53    bool SetAscii() { return SetTransferMode(ASCII); }
54    bool SetTransferMode(TransferMode mode);
55
56    // Generic FTP interface
57
58    // the error code
59    virtual wxProtocolError GetError() { return m_lastError; }
60
61    // the last FTP server reply
62    const wxString& GetLastResult() { return m_lastResult; }
63
64    // send any FTP command (should be full FTP command line but without
65    // trailing "\r\n") and return its return code
66    char SendCommand(const wxString& command);
67
68    // check that the command returned the given code
69    bool CheckCommand(const wxString& command, char expectedReturn)
70    {
71        return SendCommand(command) == expectedReturn;
72    }
73
74    // Filesystem commands
75    bool ChDir(const wxString& dir);
76    bool MkDir(const wxString& dir);
77    bool RmDir(const wxString& dir);
78    wxString Pwd();
79    bool Rename(const wxString& src, const wxString& dst);
80    bool RmFile(const wxString& path);
81
82    // Get the size of a file in the current dir.
83    // this function tries its best to deliver the size in bytes using BINARY
84    // (the SIZE command reports different sizes depending on whether
85    // type is set to ASCII or BINARY)
86    // returns -1 if file is non-existant or size could not be found
87    int GetFileSize(const wxString& fileName);
88
89       // Check to see if a file exists in the current dir
90    bool FileExists(const wxString& fileName);
91
92    // Download methods
93    bool Abort();
94
95    virtual wxInputStream *GetInputStream(const wxString& path);
96    virtual wxOutputStream *GetOutputStream(const wxString& path);
97
98    // Directory listing
99
100    // get the list of full filenames, the format is fixed: one file name per
101    // line
102    bool GetFilesList(wxArrayString& files,
103                      const wxString& wildcard = wxEmptyString)
104    {
105        return GetList(files, wildcard, false);
106    }
107
108    // get a directory list in server dependent format - this can be shown
109    // directly to the user
110    bool GetDirList(wxArrayString& files,
111                    const wxString& wildcard = wxEmptyString)
112    {
113        return GetList(files, wildcard, true);
114    }
115
116    // equivalent to either GetFilesList() (default) or GetDirList()
117    bool GetList(wxArrayString& files,
118                 const wxString& wildcard = wxEmptyString,
119                 bool details = false);
120
121protected:
122    // this executes a simple ftp command with the given argument and returns
123    // true if it its return code starts with '2'
124    bool DoSimpleCommand(const wxChar *command,
125                         const wxString& arg = wxEmptyString);
126
127    // get the server reply, return the first character of the reply code,
128    // '1'..'5' for normal FTP replies, 0 (*not* '0') if an error occurred
129    char GetResult();
130
131    // check that the result is equal to expected value
132    bool CheckResult(char ch) { return GetResult() == ch; }
133
134    // return the socket to be used, Passive/Active versions are used only by
135    // GetPort()
136    wxSocketBase *GetPort();
137    wxSocketBase *GetPassivePort();
138    wxSocketBase *GetActivePort();
139
140    // helper for GetPort()
141    wxString GetPortCmdArgument(const wxIPV4address& Local, const wxIPV4address& New);
142
143    // accept connection from server in active mode, returns the same socket as
144    // passed in in passive mode
145    wxSocketBase *AcceptIfActive(wxSocketBase *sock);
146
147
148    wxString m_user,
149             m_passwd;
150
151    wxString m_lastResult;
152    wxProtocolError m_lastError;
153
154    // true if there is an FTP transfer going on
155    bool m_streaming;
156
157    // although this should be set to ASCII by default according to STD9,
158    // we will use BINARY transfer mode by default for backwards compatibility
159    TransferMode m_currentTransfermode;
160
161    friend class wxInputFTPStream;
162    friend class wxOutputFTPStream;
163
164    bool            m_bPassive;
165    wxUint32        m_uiDefaultTimeout;
166
167    // following is true when  a read or write times out, we then assume
168    // the connection is dead and abort. we avoid additional delays this way
169    bool            m_bEncounteredError;
170
171
172    DECLARE_DYNAMIC_CLASS_NO_COPY(wxFTP)
173    DECLARE_PROTOCOL(wxFTP)
174};
175
176// the trace mask used by assorted wxLogTrace() in ftp code, do
177// wxLog::AddTraceMask(FTP_TRACE_MASK) to see them in output
178#define FTP_TRACE_MASK wxT("ftp")
179
180#endif // wxUSE_PROTOCOL_FTP
181
182#endif // __WX_FTP_H__
183