mirror of
https://git.mirrors.martin98.com/https://github.com/luc-github/ESP3D.git
synced 2025-10-11 22:31:30 +08:00

Update style to some files with clang-format using Google style Add Script to parse all embedded js/css files and format them using prettier based on .prettierrc config file Update style to embedded js/css files with prettier
159 lines
5.4 KiB
C++
159 lines
5.4 KiB
C++
/*
|
|
* FTP Serveur for Arduino Due or Mega 2580
|
|
* and Ethernet shield W5100, W5200 or W5500
|
|
* or for Esp8266 with external SD card or SpiFfs
|
|
* Copyright (c) 2014-2018 by Jean-Michel Gallego
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
/*
|
|
* 2019-10-27 Modified version for ESP3D by Luc LEBOSSE @luc-github
|
|
* support for ESP8266 and ESP32 in ESP3D project
|
|
*/
|
|
|
|
/*******************************************************************************
|
|
** **
|
|
** DEFINITIONS FOR FTP SERVER **
|
|
** **
|
|
*******************************************************************************/
|
|
|
|
#ifndef FTP_SERVER_H
|
|
#define FTP_SERVER_H
|
|
|
|
class WiFiServer;
|
|
class WiFiClient;
|
|
#ifndef FF_MAX_LFN
|
|
#define FF_MAX_LFN 255
|
|
#endif
|
|
#define FTP_TIME_OUT 5 * 60 // Disconnect client after 5 minutes of inactivity
|
|
#define FTP_AUTH_TIME_OUT 10 // Wait for authentication for 10 seconds
|
|
#define FTP_CMD_SIZE FF_MAX_LFN + 8 // max size of a command
|
|
#define FTP_CWD_SIZE FF_MAX_LFN + 8 // max size of a directory name
|
|
#define FTP_FIL_SIZE FF_MAX_LFN // max size of a file name
|
|
#define FTP_BUF_SIZE 1024 // 512 // size of file buffer for read/write
|
|
|
|
#define FTP_SERVER WiFiServer
|
|
#define FTP_CLIENT WiFiClient
|
|
#define CommandIs(a) (command != NULL && !strcmp_P(command, PSTR(a)))
|
|
#define ParameterIs(a) (parameter != NULL && !strcmp_P(parameter, PSTR(a)))
|
|
#include <time.h>
|
|
|
|
enum ftpCmd {
|
|
FTP_Stop = 0, // In this stage, stop any connection
|
|
FTP_Init, // initialize some variables
|
|
FTP_Client, // wait for client connection
|
|
FTP_User, // wait for user name
|
|
FTP_Pass, // wait for user password
|
|
FTP_Cmd
|
|
}; // answers to commands
|
|
|
|
enum ftpTransfer {
|
|
FTP_Close = 0, // In this stage, close data channel
|
|
FTP_Retrieve, // retrieve file
|
|
FTP_Store, // store file
|
|
FTP_List, // list of files
|
|
FTP_Nlst, // list of name of files
|
|
FTP_Mlsd
|
|
}; // listing for machine processing
|
|
|
|
enum ftpDataConn {
|
|
FTP_NoConn = 0, // No data connexion
|
|
FTP_Pasive, // Pasive type
|
|
FTP_Active
|
|
}; // Active type
|
|
|
|
class FtpServer {
|
|
public:
|
|
FtpServer();
|
|
~FtpServer();
|
|
bool begin();
|
|
void handle();
|
|
void end();
|
|
bool started();
|
|
uint16_t ctrlport() { return ctrlPort; }
|
|
uint16_t datapassiveport() { return passivePort; }
|
|
uint16_t dataactiveport() { return activePort; }
|
|
void closeClient();
|
|
bool isConnected();
|
|
const char* clientIPAddress();
|
|
bool isUser(const char* user);
|
|
bool isPassword(const char* password);
|
|
bool accessFS(const char* path);
|
|
void releaseFS();
|
|
|
|
private:
|
|
void iniVariables();
|
|
void clientConnected();
|
|
void disconnectClient();
|
|
bool processCommand();
|
|
bool haveParameter();
|
|
int dataConnect(bool out150 = true);
|
|
bool dataConnected();
|
|
bool doRetrieve();
|
|
bool doStore();
|
|
bool doList();
|
|
bool doMlsd();
|
|
void closeTransfer();
|
|
void abortTransfer();
|
|
bool makePath(char* fullName, char* param = NULL);
|
|
bool makeExistsPath(char* path, char* param = NULL);
|
|
char* makeDateTimeStr(char* tstr, time_t timefile);
|
|
char* makeDateTimeString(char* tstr, time_t timefile);
|
|
uint8_t getDateTime(char* dt, uint16_t* pyear, uint8_t* pmonth, uint8_t* pday,
|
|
uint8_t* phour, uint8_t* pminute, uint8_t* second);
|
|
|
|
bool getFileModTime(const char* path, time_t& time);
|
|
bool timeStamp(const char* path, uint16_t year, uint8_t month, uint8_t day,
|
|
uint8_t hour, uint8_t minute, uint8_t second);
|
|
int8_t readChar();
|
|
uint8_t _fsType;
|
|
FTP_SERVER* ftpServer;
|
|
FTP_SERVER* dataServer;
|
|
uint16_t ctrlPort; // Command port on wich server is listening
|
|
uint16_t activePort; // Default data port in active mode
|
|
uint16_t passivePort; // Data port in passive mode
|
|
bool _started;
|
|
uint8_t _root;
|
|
IPAddress dataIp; // IP address of client for data
|
|
FTP_CLIENT client;
|
|
FTP_CLIENT data;
|
|
|
|
ftpCmd cmdStage; // stage of ftp command connexion
|
|
ftpTransfer transferStage; // stage of data connexion
|
|
ftpDataConn dataConn; // type of data connexion
|
|
|
|
// uint8_t __attribute__((packed, aligned(4))) // need to be aligned to 32bit
|
|
// for Esp8266 SPIClass::transferBytes()
|
|
uint8_t buf[FTP_BUF_SIZE]; // data buffer for transfers
|
|
char cmdLine[FTP_CMD_SIZE]; // where to store incoming char from client
|
|
char cwdName[FTP_CWD_SIZE]; // name of current directory
|
|
char rnfrName[FTP_CWD_SIZE]; // name of file for RNFR command
|
|
char command[5]; // command sent by client
|
|
bool rnfrCmd; // previous command was RNFR
|
|
char* parameter; // point to begin of parameters sent by client
|
|
uint16_t dataPort;
|
|
uint16_t iCL; // pointer to cmdLine next incoming char
|
|
uint16_t nbMatch;
|
|
|
|
uint32_t millisDelay, //
|
|
millisEndConnection, //
|
|
millisBeginTrans, // store time of beginning of a transaction
|
|
bytesTransfered; //
|
|
String _currentUser;
|
|
};
|
|
|
|
extern FtpServer ftp_server;
|
|
|
|
#endif // FTP_SERVER_H
|