Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cClientFTP.h
Go to the documentation of this file.
1 //
4 //
5 #ifndef _INC_cClientFTP_H
6 #define _INC_cClientFTP_H
7 #ifndef NO_PRAGMA_ONCE
8 #pragma once
9 #endif
10 
11 #include "cClientFTPData.h"
12 #ifdef USE_PING_TEST
14 #endif
16 #ifdef USE_SSL
17 #include "GrayLib/include/SSL/CSSLChannel.h"
18 #endif
19 
20 namespace GrayFTP
21 {
22  class cFTPAccount;
23  typedef cRefPtr<cFTPAccount> cFTPAccountPtr;
24  enum FTP_PRIV_TYPE_;
25 
27  {
32 
33  // Not really supported yet.
39  };
40 
42  {
49  };
50 
52  {
58  };
59 
60  enum CF_TYPE_
61  {
64  CF_AUTHENTICATE = 0x01,
65  CF_PARM_NEED = 0x02,
67  CF_PARM_HIDE = 0x08,
68  CF_FEAT = 0x10,
69  CF_MAJOR = 0x20,
70  };
71 
72  typedef void (cClientFTP::* FTP_CMD_FUNC)(const char* pszParam); // a method in cClientFTP
73 
74  struct CFTPCmd
75  {
78  const char* m_pszCmd;
80  const char* m_pszSyntax;
81  DWORD m_dwFlags;
83  };
84 
85  class cClientFTP : public cClientFTPBase
86  {
90 
91  typedef cClientFTPBase SUPER_t;
92 
93  private:
94  static const CFTPCmd k_CmdArray[];
95  static const CFTPCmd k_SiteCmdArray[];
96 
97  public:
99 #ifdef USE_PING_TEST
101 #endif
102 #ifdef USE_SSL
104 #endif
105  // Current command.
107  const CFTPCmd* m_pCmd;
108 
109  // User logged in.
113 
114  // Data connection params.
115  bool m_bUTF8;
121 
122  // Session Environment
126 
127  // Current path.
131 
132  protected:
133  static const CFTPCmd* FindCmd(const CFTPCmd* pCmds, const char* pszCmd);
134 
135  void Cmd_Pasv_Start(const char* pszParam, bool bExt);
136 
137  public:
138  cClientFTP(cFTPFactory* pFactory, IUnkObject* pServerConnection, cStreamInput* pStreamInp, cStreamOutput* pStreamOut);
139  virtual ~cClientFTP();
140 
141  cFTPFactory* get_FTPFactory() const;
142  virtual HRESULT DisposeThis(void) override;
143 
144  void Data_ConnectComplete(cClientFTPData* pClient, bool bPasv);
146  bool Data_IsPASV() const
147  {
149  return !m_DAddr.isAddrValid();
150  }
151 
152  static inline bool IsRoot(const char* pStr)
153  {
154  for (; *pStr != '\0'; pStr++)
155  {
156  if (!cFilePath::IsCharDirSep(*pStr))
157  return false;
158  }
159  return true;
160  }
161 
162  HTTPRET_TYPE MakeFilePath(const char* pszName, FTP_PRIV_TYPE_ wPrivReq, cFileFindEntry* pfd = nullptr);
163 
164  const char* DoCommandCheck(const char* pszCmdBuffer);
165  void DoControlCmd(const char* pszCmdBuffer);
166 
167  virtual HRESULT ProcessStreamPacket() override;
168  bool OnException();
169 
170  StrLen_t _cdecl ReplyF(HTTPRET_TYPE eReplyCode, const char* pReplyString, ...);
171 
172  int Reply_OK(HTTPRET_TYPE eReplyCode = HTTPRET_OK_DATA);
173  int Reply_BadPath(HTTPRET_TYPE eReplyCode = HTTPRET_ER_550);
174  int Reply_SysError(HTTPRET_TYPE eReplyCode, const char* pszText, HRESULT hRes);
175  int Reply_SysErrorLast(HTTPRET_TYPE eReplyCode, const char* pszText = nullptr);
176  int Reply_ParameterNotImplemented(const char* pText);
177 
178  int Reply_DataTransferError(const char* pError, HRESULT hRes);
180  int Reply_DataTransferComplete(void);
181 
182  void Cmd_Allo(const char* pszParam);
183 #ifdef USE_SSL
184  void Cmd_Auth(const char* pszParam);
185 #endif
186  void Cmd_Appe(const char* pszParam);
187  void Cmd_Pwd(const char* pszParam);
188  void Cmd_Cwd(const char* pszParam);
189  void Cmd_Cdup(const char* pszParam);
190  void Cmd_Mkd(const char* pszParam);
191  void Cmd_Opts(const char* pszParam);
192  void Cmd_Rest(const char* pszParam);
193  void Cmd_Rmd(const char* pszParam);
194  void Cmd_Retr(const char* pszParam);
195  void Cmd_Stor_Base(const char* pszParam, bool bAppend);
196  void Cmd_Stor(const char* pszParam);
197  void Cmd_Dele(const char* pszParam);
198  void Cmd_Epsv(const char* pszParam);
199  void Cmd_Help_Base(const CFTPCmd* pCmds, const char* pszType, const char* pszParam);
200  void Cmd_Help(const char* pszParam);
201  void Cmd_List_Base(const char* pszParam, bool bVerbose);
202  void Cmd_Mdtm(const char* pszParam);
203  void Cmd_List(const char* pszParam);
204  void Cmd_Nlst(const char* pszParam);
205  void Cmd_User(const char* pszParam);
206  void Cmd_Pass(const char* pszParam);
207  void Cmd_Pasv(const char* pszParam);
208  void Cmd_Noop(const char* pszParam);
209  void Cmd_Quit(const char* pszParam);
210  void Cmd_Port(const char* pszParam);
211  void Cmd_Syst(const char* pszParam);
212  void Cmd_Abor(const char* pszParam);
213  void Cmd_Mode(const char* pszParam);
214  void Cmd_Struct(const char* pszParam);
215  void Cmd_Stat(const char* pszParam);
216  void Cmd_Size(const char* pszParam);
217  void Cmd_Type(const char* pszParam);
218  void Cmd_Feat(const char* pszParam);
219  void Cmd_Rnfr(const char* pszParam);
220  void Cmd_Rnto(const char* pszParam);
221  void Cmd_UTF8(const char* pszParam);
222 
223  void Cmd_Site(const char* pszParam);
224  void Cmd_Site_Help(const char* pszParam);
225  // void Cmd_Site_ChMod( const char* pszParam );
226 #ifdef UNDER_CE
227  void Cmd_Site_CeMon(const char* pszParam);
228 #endif
229 
230  // Event types. LOG_ATTR_MASK_t
231  StrLen_t _cdecl LogEventF(LOG_ATTR_MASK_t dwAttrMask, const LOGCHAR_t* pszFormat, ...);
232  };
233 
235 };
236 #endif // _INC_cClientFTP_H
#define _MAX_PATH
Definition: SysTypes.h:423
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
Definition: cClientFTPBase.h:35
Definition: cClientFTPData.h:62
Definition: cClientFTP.h:86
void Cmd_Pasv(const char *pszParam)
Definition: cClientFTPCmd.cpp:934
void Cmd_Stat(const char *pszParam)
Definition: cClientFTPCmd.cpp:898
int Reply_SysErrorLast(HTTPRET_TYPE eReplyCode, const char *pszText=nullptr)
Definition: cClientFTP.cpp:173
void Cmd_Opts(const char *pszParam)
Definition: cClientFTPCmd.cpp:99
bool OnException()
Definition: cClientFTP.cpp:563
cNetServerPortPtr m_pDPasv
an expected/waiting/incoming Pasv/EPSV data connection. (can only have one at a time)
Definition: cClientFTP.h:118
FTP_TSTRUCT_TYPE m_TransferStruct
Definition: cClientFTP.h:125
void Cmd_Dele(const char *pszParam)
Definition: cClientFTPCmd.cpp:357
FTP_TMODE_TYPE m_TransferMode
Definition: cClientFTP.h:124
void Cmd_Size(const char *pszParam)
Definition: cClientFTPCmd.cpp:920
int Reply_SysError(HTTPRET_TYPE eReplyCode, const char *pszText, HRESULT hRes)
Definition: cClientFTP.cpp:159
cArrayRef< cClientFTPData > m_aConnectData
open data connections for this control connection.
Definition: cClientFTP.h:120
void Cmd_Site(const char *pszParam)
Definition: cClientFTPCmd.cpp:1060
static bool IsRoot(const char *pStr)
Definition: cClientFTP.h:152
void Cmd_Appe(const char *pszParam)
Definition: cClientFTPCmd.cpp:346
void Cmd_Syst(const char *pszParam)
Definition: cClientFTPCmd.cpp:717
cStringA m_sUserName
Might be the anon users email.
Definition: cClientFTP.h:110
cStringA m_sCWD
Current working user path directory or file. (in Unix form)
Definition: cClientFTP.h:128
void Cmd_Cwd(const char *pszParam)
Definition: cClientFTPCmd.cpp:121
void Cmd_Cdup(const char *pszParam)
Definition: cClientFTPCmd.cpp:139
void Cmd_List_Base(const char *pszParam, bool bVerbose)
Definition: cClientFTPCmd.cpp:495
void Cmd_Port(const char *pszParam)
Definition: cClientFTPCmd.cpp:665
cNetAddrName m_AddrPeer
DNS lookup of my peer name. get_NetStream()->m_addrPeer.
Definition: cClientFTP.h:98
void Cmd_Type(const char *pszParam)
Definition: cClientFTPCmd.cpp:943
char m_szCmdBuffer[_MAX_PATH]
current command + path.
Definition: cClientFTP.h:106
void Cmd_Pasv_Start(const char *pszParam, bool bExt)
Definition: cClientFTPCmd.cpp:380
void Cmd_Retr(const char *pszParam)
Definition: cClientFTPCmd.cpp:204
cStringA m_sActiveUserPath
file/path (in Unix form)
Definition: cClientFTP.h:129
void Cmd_Site_Help(const char *pszParam)
Definition: cClientFTPCmd.cpp:1001
void Cmd_Mode(const char *pszParam)
Definition: cClientFTPCmd.cpp:738
void Cmd_Quit(const char *pszParam)
Definition: cClientFTPCmd.cpp:657
int Reply_BadPath(HTTPRET_TYPE eReplyCode=HTTPRET_ER_550)
Definition: cClientFTP.cpp:178
void Cmd_Mdtm(const char *pszParam)
Definition: cClientFTPCmd.cpp:796
cFTPFactory * get_FTPFactory() const
Definition: cClientFTP.cpp:71
void Cmd_Rnfr(const char *pszParam)
Definition: cClientFTPCmd.cpp:59
void Cmd_Auth(const char *pszParam)
void Cmd_Epsv(const char *pszParam)
Definition: cClientFTPCmd.cpp:426
void Cmd_User(const char *pszParam)
Definition: cClientFTPCmd.cpp:549
void Cmd_Nlst(const char *pszParam)
Definition: cClientFTPCmd.cpp:534
void Cmd_Help(const char *pszParam)
Definition: cClientFTPCmd.cpp:488
void Cmd_List(const char *pszParam)
Definition: cClientFTPCmd.cpp:542
int Reply_DataTransferError(const char *pError, HRESULT hRes)
Definition: cClientFTP.cpp:202
void Cmd_Stor_Base(const char *pszParam, bool bAppend)
Definition: cClientFTPCmd.cpp:278
void Cmd_UTF8(const char *pszParam)
Definition: cClientFTPCmd.cpp:95
static const CFTPCmd * FindCmd(const CFTPCmd *pCmds, const char *pszCmd)
Definition: cClientFTPCmd.cpp:33
void Cmd_Allo(const char *pszParam)
Definition: cClientFTPCmd.cpp:333
cSSLServerStreamPtr m_pAuthSSL
We used the AUTH command or are implicit SSL/TLS connection.
Definition: cClientFTP.h:103
int Reply_DataTransferComplete(void)
Definition: cClientFTP.cpp:192
void Cmd_Rest(const char *pszParam)
Definition: cClientFTPCmd.cpp:146
void Cmd_Abor(const char *pszParam)
Definition: cClientFTPCmd.cpp:729
StrLen_t _cdecl ReplyF(HTTPRET_TYPE eReplyCode, const char *pReplyString,...)
Definition: cClientFTP.cpp:102
void Cmd_Pwd(const char *pszParam)
Definition: cClientFTPCmd.cpp:113
void Cmd_Noop(const char *pszParam)
Definition: cClientFTPCmd.cpp:650
const char * DoCommandCheck(const char *pszCmdBuffer)
Definition: cClientFTP.cpp:396
cNetAddrTrackPtr m_pAddrTrack
Duplicates m_AddrPeer ??
Definition: cClientFTP.h:100
void Cmd_Mkd(const char *pszParam)
Definition: cClientFTPCmd.cpp:156
STREAM_POS_t m_nDataRestoreOffset
restore offset, for file transfers. set via Cmd_Rest
Definition: cClientFTP.h:116
cNetAddress m_DAddr
data address (can be changed w/ Port command) for (non pasv) outgoing data connections.
Definition: cClientFTP.h:117
const CFTPCmd * m_pCmd
Current Command.
Definition: cClientFTP.h:107
void Data_ConnectComplete(cClientFTPData *pClient, bool bPasv)
Definition: cClientFTP.cpp:573
cClientFTP(cFTPFactory *pFactory, IUnkObject *pServerConnection, cStreamInput *pStreamInp, cStreamOutput *pStreamOut)
Definition: cClientFTP.cpp:13
bool m_bAccountLogin
m_pAccount is logged in (may be anon)
Definition: cClientFTP.h:112
void Cmd_Rnto(const char *pszParam)
Definition: cClientFTPCmd.cpp:71
FTP_TTYPE_TYPE m_TransferType
Definition: cClientFTP.h:123
void Cmd_Help_Base(const CFTPCmd *pCmds, const char *pszType, const char *pszParam)
Definition: cClientFTPCmd.cpp:463
cFTPDataParamsPtr m_pDataParams
Set up params for the next data connection.
Definition: cClientFTP.h:119
void Cmd_Rmd(const char *pszParam)
Definition: cClientFTPCmd.cpp:183
virtual ~cClientFTP()
Definition: cClientFTP.cpp:60
virtual HRESULT DisposeThis(void) override
Definition: cClientFTP.cpp:661
void Cmd_Pass(const char *pszParam)
Definition: cClientFTPCmd.cpp:586
int Reply_DataTransferAbort(HRESULT hRes)
Definition: cClientFTP.cpp:197
FILECHAR_t m_tActiveFilePath[_MAX_PATH]
current valid (user checked) full real system path/file.
Definition: cClientFTP.h:130
bool m_bUTF8
Definition: cClientFTP.h:115
void DoControlCmd(const char *pszCmdBuffer)
Definition: cClientFTP.cpp:451
cFTPAccountPtr m_pAccount
Account we are trying to log in with. May not yet be logged in.
Definition: cClientFTP.h:111
bool Data_IsPASV() const
Definition: cClientFTP.h:146
virtual HRESULT ProcessStreamPacket() override
Definition: cClientFTP.cpp:487
void Cmd_Stor(const char *pszParam)
Definition: cClientFTPCmd.cpp:352
int Reply_ParameterNotImplemented(const char *pText)
Definition: cClientFTP.cpp:207
int Reply_OK(HTTPRET_TYPE eReplyCode=HTTPRET_OK_DATA)
Definition: cClientFTP.cpp:151
void Cmd_Struct(const char *pszParam)
Definition: cClientFTPCmd.cpp:767
HRESULT Data_ConnectOpen()
Definition: cClientFTP.cpp:595
void Cmd_Feat(const char *pszParam)
Definition: cClientFTPCmd.cpp:435
StrLen_t _cdecl LogEventF(LOG_ATTR_MASK_t dwAttrMask, const LOGCHAR_t *pszFormat,...)
Definition: cClientFTP.cpp:76
HTTPRET_TYPE MakeFilePath(const char *pszName, FTP_PRIV_TYPE_ wPrivReq, cFileFindEntry *pfd=nullptr)
Definition: cClientFTP.cpp:213
Definition: cFTPFactory.h:54
Definition: cNetAddrName.h:21
Definition: cNetAddr.h:31
bool isAddrValid() const
Definition: cNetAddr.cpp:20
Definition: cArrayRef.h:21
Definition: cFileDir.h:86
static constexpr bool IsCharDirSep(wchar_t ch) noexcept
Definition: cFilePath.h:85
Definition: cStream.h:306
Definition: cStream.h:126
Definition: cFTPAccount.h:14
FTP_PRIV_TYPE_
Definition: cFTPAccount.h:34
cRefPtr< cClientFTP > cClientFTPPtr
Definition: cClientFTP.h:234
FTP_TMODE_TYPE
Definition: cClientFTP.h:42
@ FTP_TMODE_STREAM
Definition: cClientFTP.h:46
@ FTP_TMODE_BLOCK
Definition: cClientFTP.h:47
@ FTP_TMODE_COMPRESSED
Definition: cClientFTP.h:48
FTP_TSTRUCT_TYPE
Definition: cClientFTP.h:52
@ FTP_TSTRUCT_FILE
Definition: cClientFTP.h:55
@ FTP_TSTRUCT_PAGE
Definition: cClientFTP.h:57
@ FTP_TSTRUCT_RECORD
Definition: cClientFTP.h:56
FTP_TTYPE_TYPE
Definition: cClientFTP.h:27
@ FTP_TTYPE_EBCDIC_TELNET
Definition: cClientFTP.h:37
@ FTP_TTYPE_ASCII_CSA
Definition: cClientFTP.h:35
@ FTP_TTYPE_EBCDIC_NONPRINT
Definition: cClientFTP.h:36
@ FTP_TTYPE_EBCDIC_ASA
Definition: cClientFTP.h:38
@ FTP_TTYPE_ASCII_NONPRINT
Definition: cClientFTP.h:30
@ FTP_TTYPE_ASCII_TELNET
Definition: cClientFTP.h:34
@ FTP_TTYPE_BINARY_IMAGE
Definition: cClientFTP.h:31
void(cClientFTP::* FTP_CMD_FUNC)(const char *pszParam)
Definition: cClientFTP.h:72
CF_TYPE_
Definition: cClientFTP.h:61
@ CF_PARM_OPTIONAL
params are optional.
Definition: cClientFTP.h:66
@ CF_PARM_NEED
needs a parameter or won't work
Definition: cClientFTP.h:65
@ CF_AUTHENTICATE
Must be logged in to use this command.
Definition: cClientFTP.h:64
@ CF_PARM_HIDE
don't log params. (e.g. password)
Definition: cClientFTP.h:67
@ CF_MAJOR
This is an important major command (log this)
Definition: cClientFTP.h:69
@ CF_FEAT
shown in "feats" list.
Definition: cClientFTP.h:68
cRefPtr< cFTPAccount > cFTPAccountPtr
Definition: cFTPAccount.h:126
HTTPRET_TYPE
Definition: cHttpCommon.h:24
int StrLen_t
the length of a string in chars (bytes for UTF8, wchar_t for UNICODE). or offset in characters....
Definition: StrConst.h:32
UINT32 LOG_ATTR_MASK_t
Definition: cLogAppender.h:56
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
ULONG_PTR STREAM_POS_t
NOT same as FILE_SIZE_t in 32 bit. Why not ?
Definition: cOSHandle.h:54
char LOGCHAR_t
always just use UTF8 for logs, don't bother with UNICODE.
Definition: cLogLevel.h:17
Definition: cClientFTP.h:75
StrLen_t m_iCmdLen
Definition: cClientFTP.h:79
const char * m_pszSyntax
description and arguments.
Definition: cClientFTP.h:80
DWORD m_dwFlags
CF_TYPE_ ex. CF_AUTHENTICATE.
Definition: cClientFTP.h:81
FTP_CMD_FUNC m_Function
The code to exec the action. a method in cClientFTP.
Definition: cClientFTP.h:82
const char * m_pszCmd
all caps
Definition: cClientFTP.h:78