Files
2026-06-22 11:49:35 +02:00

174 lines
4.2 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __FTPLIB__
#define __FTPLIB__
#if __PLATFORM_WINDOWS__
#include <winsock.h>
#endif
#include "ntypes.h"
/// FTP connection.
struct FtpConnection
{
enum Direction
{
Upload = 0,
Download
};
int handle;
bool ready;
char *buffer;
int buffer_usage;
Direction direction;
void FreeBuffer();
bool AllocateBuffer();
FtpConnection();
~FtpConnection()
{ FreeBuffer(); }
};
/*
@short FTP Library.
*/
class FtpLibrary
{
public:
enum ConnectionMode
{
ConnectionPORT = 0,
ConnectionPASV
};
enum TransferMode
{
TransferASCII = 'A',
TransferBinary = 'I'
};
enum AccessType
{
AccessDir = 0,
AccessDirVerbose,
AccessFileRead,
AccessFileWrite,
AccessFileReadAppend,
AccessFileWriteAppend
};
enum State
{
FtpError = 0,
FtpOk,
FtpSocketTimeout
};
protected:
char response[256];
FtpConnection master_connection;
ConnectionMode connection_mode;
size_t offset;
bool correctpasv;
/// Check server PASV support.
bool CheckPASVResponse(unsigned char *v);
/// Read and verify a response from the server.
bool CheckResponse(char c);
/// Wait for the socket to receive or flush data.
State WaitSocket(FtpConnection *socket);
/// Read a line of text.
State ReadASCII(char *buf, int max, FtpConnection *socket, int &line_length);
/// Write a line of text.
State WriteASCII(char *buf, int length, FtpConnection *socket, int &wrote_length);
/// Send a command and wait for expected response.
bool FtpSendCmd(const char *cmd, char expresp);
/// Accept connection from server.
bool FtpAcceptConnection(FtpConnection *connection);
/// Create a PORT connection for data transfer.
FtpConnection *CreatePORTConnection(TransferMode mode, FtpConnection::Direction direction, char *connection_command);
/// Create a PASV connection for data transfer.
FtpConnection *CreatePASVConnection(TransferMode mode, FtpConnection::Direction direction, char *connection_command);
/// Create a connection for data transfer.
FtpConnection *CreateConnection(const char *path, AccessType type, TransferMode mode);
/// Close connection.
bool CloseConnection(FtpConnection *connection);
/// Generic data transfer function.
State DataTransfer(const char *local_path, const char *remote_path, AccessType type, TransferMode mode);
/// Read data from a connection.
State ReadBinary(void *buffer, int max, FtpConnection *connection, int &length);
/// Write data to a connection.
State WriteBinary(void *buffer, int length, FtpConnection *connection);
public:
/// Set data connection transfer mode.
void SetDataConnectionMode(ConnectionMode mode)
{ connection_mode = mode; }
/// Get last server response received.
const char *GetLastResponse() const
{ return response; }
/// Connect to a remote server.
bool Connect(const char *host);
/// Upload file to server.
State Upload(const char *local_path, const char *remote_path, TransferMode mode = TransferBinary, int offset = 0);
/// Download file from server.
State Download(const char *local_path, const char *remote_path, TransferMode mode = TransferBinary, int offset = 0);
/// Quit server, close connection.
bool Quit();
/// Change directory.
bool ChangeDirectory(const char *path);
/// Up directory.
bool UpDirectory();
/// Delete remote file.
bool DeleteFile(const char *path);
/// Get remote file size.
int GetFileSize(const char *path, TransferMode mode = TransferBinary);
/// Download directory listing to a local file.
bool Nlst(const char *outputfile, const char *path);
/// Login remote server.
bool Login(const char *user, const char *password);
/*
Callback functions.
*/
virtual bool IdleCallback()
{ return true; }
virtual void SendCommandCallback(const char * /*command*/)
{}
virtual bool DataReadCallback(const FtpConnection * /*connection*/)
{ return true; }
virtual bool DataWriteCallback(const FtpConnection * /*connection*/)
{ return true; }
FtpLibrary();
virtual ~FtpLibrary();
};
#endif // __FTPLIB__