/* */ #include "FtpInitiateConnectionCommand.h" #include #include "DownloadEngine.h" #include "Option.h" #include "Request.h" #include "FtpNegotiationCommand.h" #include "HttpRequest.h" #include "Segment.h" #include "HttpRequestCommand.h" #include "FtpTunnelRequestCommand.h" #include "DlAbortEx.h" #include "Logger.h" #include "message.h" #include "prefs.h" #include "HttpConnection.h" #include "Socket.h" namespace aria2 { FtpInitiateConnectionCommand::FtpInitiateConnectionCommand (int cuid, const RequestHandle& req, RequestGroup* requestGroup, DownloadEngine* e) :InitiateConnectionCommand(cuid, req, requestGroup, e) {} FtpInitiateConnectionCommand::~FtpInitiateConnectionCommand() {} Command* FtpInitiateConnectionCommand::createNextCommand (const std::deque& resolvedAddresses, const SharedHandle& proxyRequest) { Command* command; if(!proxyRequest.isNull()) { std::map options; SharedHandle pooledSocket = e->popPooledSocket(options, req->getHost(), req->getPort()); if(pooledSocket.isNull()) { logger->info(MSG_CONNECTING_TO_SERVER, cuid, proxyRequest->getHost().c_str(), proxyRequest->getPort()); socket.reset(new SocketCore()); socket->establishConnection(resolvedAddresses.front(), proxyRequest->getPort()); if(e->option->get(PREF_PROXY_METHOD) == V_GET) { SharedHandle hc (new HttpConnection(cuid, socket, e->option)); HttpRequestCommand* c = new HttpRequestCommand(cuid, req, _requestGroup, hc, e, socket); c->setProxyRequest(proxyRequest); command = c; } else if(e->option->get(PREF_PROXY_METHOD) == V_TUNNEL) { command = new FtpTunnelRequestCommand(cuid, req, _requestGroup, e, proxyRequest, socket); } else { // TODO throw DlAbortEx("ERROR"); } } else { if(e->option->get(PREF_PROXY_METHOD) == V_TUNNEL) { command = new FtpNegotiationCommand(cuid, req, _requestGroup, e, pooledSocket, FtpNegotiationCommand::SEQ_SEND_CWD, options["baseWorkingDir"]); } else if(e->option->get(PREF_PROXY_METHOD) == V_GET) { SharedHandle hc (new HttpConnection(cuid, pooledSocket, e->option)); HttpRequestCommand* c = new HttpRequestCommand(cuid, req, _requestGroup, hc, e, pooledSocket); c->setProxyRequest(proxyRequest); command = c; } else { // TODO throw DlAbortEx("ERROR"); } } } else { std::map options; SharedHandle pooledSocket = e->popPooledSocket(options, resolvedAddresses, req->getPort()); if(pooledSocket.isNull()) { logger->info(MSG_CONNECTING_TO_SERVER, cuid, req->getHost().c_str(), req->getPort()); socket.reset(new SocketCore()); socket->establishConnection(resolvedAddresses.front(), req->getPort()); command = new FtpNegotiationCommand(cuid, req, _requestGroup, e, socket); } else { command = new FtpNegotiationCommand(cuid, req, _requestGroup, e, pooledSocket, FtpNegotiationCommand::SEQ_SEND_CWD, options["baseWorkingDir"]); } } return command; } } // namespace aria2