/* */ #ifndef _D_FTP_NEGOTIATION_COMMAND_H_ #define _D_FTP_NEGOTIATION_COMMAND_H_ #include "AbstractCommand.h" namespace aria2 { class FtpConnection; class SocketCore; class FtpNegotiationCommand : public AbstractCommand { public: enum Seq { SEQ_RECV_GREETING, SEQ_SEND_USER, SEQ_RECV_USER, SEQ_SEND_PASS, SEQ_RECV_PASS, SEQ_SEND_TYPE, SEQ_RECV_TYPE, SEQ_SEND_PWD, SEQ_RECV_PWD, SEQ_SEND_CWD, SEQ_RECV_CWD, SEQ_SEND_MDTM, SEQ_RECV_MDTM, SEQ_SEND_SIZE, SEQ_RECV_SIZE, SEQ_PREPARE_SERVER_SOCKET, SEQ_SEND_PORT, SEQ_RECV_PORT, SEQ_SEND_PASV, SEQ_RECV_PASV, SEQ_SEND_REST_PASV, SEQ_SEND_REST, SEQ_RECV_REST, SEQ_SEND_RETR, SEQ_RECV_RETR, SEQ_WAIT_CONNECTION, SEQ_NEGOTIATION_COMPLETED, SEQ_RETRY, SEQ_HEAD_OK, SEQ_DOWNLOAD_ALREADY_COMPLETED, SEQ_FILE_PREPARATION, // File allocation after SIZE command SEQ_EXIT }; private: bool recvGreeting(); bool sendUser(); bool recvUser(); bool sendPass(); bool recvPass(); bool sendType(); bool recvType(); bool sendPwd(); bool recvPwd(); bool sendCwd(); bool recvCwd(); bool sendMdtm(); bool recvMdtm(); bool sendSize(); bool recvSize(); bool prepareServerSocket(); bool sendPort(); bool recvPort(); bool sendPasv(); bool recvPasv(); bool sendRest(const SharedHandle& segment); bool sendRestPasv(const SharedHandle& segment); bool recvRest(const SharedHandle& segment); bool sendRetr(); bool recvRetr(); bool waitConnection(); bool processSequence(const SharedHandle& segment); void afterFileAllocation(); void poolConnection() const; bool onFileSizeDetermined(uint64_t totalLength); void onDryRunFileFound(); SharedHandle dataSocket; SharedHandle serverSocket; Seq sequence; SharedHandle ftp; std::string _connectedHostname; std::string _connectedAddr; uint16_t _connectedPort; protected: virtual bool executeInternal(); public: FtpNegotiationCommand(int32_t cuid, const SharedHandle& req, const SharedHandle& fileEntry, RequestGroup* requestGroup, DownloadEngine* e, const SharedHandle& s, Seq seq = SEQ_RECV_GREETING, const std::string& baseWorkingDir = "/"); virtual ~FtpNegotiationCommand(); void setConnectedAddr (const std::string& hostname, const std::string& addr, uint16_t port) { _connectedHostname = hostname; _connectedAddr = addr; _connectedPort = port; } }; } // namespace aria2 #endif // _D_FTP_NEGOTIATION_COMMAND_H_