/* */ #ifndef D_FTP_NEGOTIATION_COMMAND_H #define D_FTP_NEGOTIATION_COMMAND_H #include "AbstractCommand.h" #include namespace aria2 { class FtpConnection; class SocketCore; class HttpConnection; 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_PREP, SEQ_SEND_CWD, SEQ_RECV_CWD, SEQ_SEND_MDTM, SEQ_RECV_MDTM, SEQ_SEND_SIZE, SEQ_RECV_SIZE, SEQ_PREPARE_PORT, SEQ_PREPARE_SERVER_SOCKET_EPRT, SEQ_SEND_EPRT, SEQ_RECV_EPRT, SEQ_PREPARE_SERVER_SOCKET, SEQ_SEND_PORT, SEQ_RECV_PORT, SEQ_PREPARE_PASV, SEQ_SEND_EPSV, SEQ_RECV_EPSV, SEQ_SEND_PASV, SEQ_RECV_PASV, SEQ_RESOLVE_PROXY, SEQ_SEND_TUNNEL_REQUEST, SEQ_RECV_TUNNEL_RESPONSE, 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 sendCwdPrep(); bool sendCwd(); bool recvCwd(); bool sendMdtm(); bool recvMdtm(); bool sendSize(); bool recvSize(); bool preparePort(); bool prepareServerSocketEprt(); bool sendEprt(); bool recvEprt(); bool prepareServerSocket(); bool sendPort(); bool recvPort(); bool preparePasv(); bool sendEpsv(); bool recvEpsv(); bool sendPasv(); bool recvPasv(); bool preparePasvConnect(); bool resolveProxy(); bool sendTunnelRequest(); bool recvTunnelResponse(); bool sendRest(const std::shared_ptr& segment); bool sendRestPasv(const std::shared_ptr& segment); bool recvRest(const std::shared_ptr& segment); bool sendRetr(); bool recvRetr(); bool waitConnection(); bool processSequence(const std::shared_ptr& segment); void afterFileAllocation(); void poolConnection() const; bool onFileSizeDetermined(int64_t totalLength); void onDryRunFileFound(); std::shared_ptr dataSocket_; std::shared_ptr serverSocket_; Seq sequence_; std::shared_ptr ftp_; // For tunneling std::shared_ptr http_; // Port number in PASV/EPSV response uint16_t pasvPort_; // Resolved address for proxy std::string proxyAddr_; std::deque cwdDirs_; protected: virtual bool executeInternal() CXX11_OVERRIDE; public: FtpNegotiationCommand(cuid_t cuid, const std::shared_ptr& req, const std::shared_ptr& fileEntry, RequestGroup* requestGroup, DownloadEngine* e, const std::shared_ptr& s, Seq seq = SEQ_RECV_GREETING, const std::string& baseWorkingDir = "/"); virtual ~FtpNegotiationCommand(); }; } // namespace aria2 #endif // D_FTP_NEGOTIATION_COMMAND_H