// // File: hzFtpClient.h // // Legal Notice: This file is part of the HadronZoo C++ Class Library. // // Copyright 2025 HadronZoo Project (http://www.hadronzoo.com) // // The HadronZoo C++ Class Library is free software: You can redistribute it, and/or modify it under the terms of the GNU Lesser General Public License, as published by the Free // Software Foundation, either version 3 of the License, or any later version. // // The HadronZoo C++ Class Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR // A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License along with the HadronZoo C++ Class Library. If not, see http://www.gnu.org/licenses. //
// // Purpose: Header for the FTP client class //
#ifndef hzFtpClient_h #define hzFtpClient_h
#include "hzChain.h" #include "hzTmplMapS.h" #include "hzDirectory.h" #include "hzTcpClient.h"
class hzFtpClient { // Category: Internet // // The hzFtpClient class operates as an FTP client allowing applications to download and upload files from and to a remote server.
struct _ftpline { // Used to process FTP server response (directory listings)
hzString m_msg ; // The message body uint32_t m_code ; // The return code
_ftpline () { m_code = 0 ; }
_ftpline& operator= (const _ftpline& op) { m_msg = op.m_msg ; m_code = op.m_code ; return *this ; } } ;
hzVect<_ftpline> m_Stack ; // Server response stack hzArray<hzString> m_Array ; // For processing port nos etc
hzTcpClient m_ConnControl ; // TCP control client object
hzString m_Server ; // Server to connect to hzString m_Username ; // Username hzString m_Password ; // Password hzString m_LocalDir ; // Current local directory hzString m_ServerDir ; // Current remote directory hzIpaddr m_SvrAddr ; // Server IP
char m_c_rbuf[HZ_MAXPACKET+4] ; // Control recv buffer char m_c_sbuf[HZ_MAXPACKET+4] ; // Control send buffer char m_x_rbuf[HZ_MAXPACKET+4] ; // Data recv buffer char m_x_sbuf[HZ_MAXPACKET+4] ; // Data send buffer
uint32_t m_nRescode ; // Return code in server response uint32_t m_nDataPort ; // Port for connecting for data uint32_t m_nTries ; // Reconnection tries bool m_bInit ; // FTP client initialized bool m_bDebug ; // Report conversation in full rather than errors only
hzEcode _setmetafile (hzDirent& meta, char* line) ; hzEcode _openpasv (hzTcpClient& x) ; void _logrescode (void) ; hzEcode _ftprecv (uint32_t& nRecv, const char* funcname) ; hzEcode _reconnect (void) ;
public: hzFtpClient (void) { m_nRescode = 0 ; m_nDataPort = 0 ; m_nTries = 0 ; m_bInit = false ; m_bDebug = false ; }
~hzFtpClient (void) { }
hzEcode Initialize ( const hzString& server, // Server to connect to const hzString& username, // User to log in as const hzString& password // Password to use ) { if (!server) return E_ARGUMENT ; if (!username) return E_ARGUMENT ; if (!password) return E_ARGUMENT ;
m_Server = server ; m_Username = username ; m_Password = password ; m_bInit = true ;
return E_OK ; }
//void SetLogger (hzLogger* plog) { m_pLog = plog ; } void SetDebug (bool bDebug) { m_bDebug = bDebug ; m_ConnControl.SetDebug(bDebug) ; }
hzEcode StartSession (void) ; hzEcode GetServerDir (void) ;
hzEcode SetLocalDir (const hzString& LocDirname) ; hzEcode SetRemoteDir (const hzString& SvrDirname) ; hzEcode RemoteDirCreate (const hzString& SvrDirname) ; hzEcode RemoteDirDelete (const hzString& SvrDirname) ; hzEcode GetDirList (hzVect<hzDirent>& listing, const hzString& Criteria) ; hzEcode FileDownload (hzDirent& finfo) ; hzEcode FileUpload (const hzString& SvrFilename, const hzString& LocFilename) ; hzEcode FileDelete (const hzString& SvrFilename) ; hzEcode FileRename (const hzString& oldsvrname, const hzString& newsvrname) ;
hzEcode QuitSession (void) ; } ;
class hzFtpHost { // Category: Internet // // This is a class that is purely for mass downloads from an FTP host.
class _hz_FtpDnhist { // Support class - Download/Upload Controller for FTP
FILE* _file ; // For download history file char buf [256] ; // For processing entires
public: _hz_FtpDnhist () { _file = 0 ; }
~_hz_FtpDnhist () { if (_file) fclose(_file) ; _file = 0 ; }
hzEcode Load (hzMapS<hzString,hzDirent>& dlist, hzString& opdir) ; hzEcode Append (uint32_t epoch, uint32_t size, const hzString& name) ; } ;
hzMapS <hzString,hzDirent> m_Inventory ; // Files already downloaded in the repository
_hz_FtpDnhist dnh ; // Download history manager
hzString m_Host ; // For FTP collections only hzString m_Username ; // Ftp username if applicable hzString m_Password ; // Ftp password if applicable hzString m_Criteria ; // The download criteria (none would mean all files) hzString m_Source ; // The directory from which files are collected (on FTP server) hzString m_Repos ; // The directory into which files are collected bool m_bInit ; // Parameters supplied
public: hzSDate m_Issue ; // Issue date (WHOLE publications only)
hzFtpHost (void) { m_bInit = false ; } ~hzFtpHost (void) {}
hzEcode Init ( const hzString& host, const hzString& user, const hzString& pass, const hzString& remDir, const hzString& locDir, const hzString& criteria ) ;
hzEcode GetAll (void) ; } ;
#endif // hzFtpClient_h