1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_FTP_FTP_NETWORK_TRANSACTION_H_ 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_FTP_FTP_NETWORK_TRANSACTION_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string> 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <utility> 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/address_list.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/host_resolver.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h" 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_ctrl_response_buffer.h" 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_response_info.h" 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/ftp/ftp_transaction.h" 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ClientSocket; 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ClientSocketFactory; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FtpNetworkSession; 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FtpNetworkTransaction : public FtpTransaction { 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FtpNetworkTransaction(FtpNetworkSession* session, 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ClientSocketFactory* socket_factory); 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~FtpNetworkTransaction(); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual int Stop(int error); 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual int RestartIgnoringLastError(CompletionCallback* callback); 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // FtpTransaction methods: 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual int Start(const FtpRequestInfo* request_info, 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CompletionCallback* callback, 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BoundNetLog& net_log); 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual int RestartWithAuth(const string16& username, 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& password, 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CompletionCallback* callback); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual int Read(IOBuffer* buf, int buf_len, CompletionCallback* callback); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual const FtpResponseInfo* GetResponseInfo() const; 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual LoadState GetLoadState() const; 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual uint64 GetUploadProgress() const; 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum Command { 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_NONE, 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_USER, 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_PASS, 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_SYST, 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_TYPE, 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch COMMAND_EPSV, 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_PASV, 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_PWD, 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_SIZE, 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_RETR, 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_CWD, 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMMAND_LIST, 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch COMMAND_QUIT, 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Major categories of remote system types, as returned by SYST command. 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum SystemType { 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SYSTEM_TYPE_UNKNOWN, 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SYSTEM_TYPE_UNIX, 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SYSTEM_TYPE_WINDOWS, 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SYSTEM_TYPE_OS2, 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SYSTEM_TYPE_VMS, 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Data representation type, see RFC 959 section 3.1.1. Data Types. 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We only support the two most popular data types. 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum DataType { 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DATA_TYPE_ASCII, 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DATA_TYPE_IMAGE, 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // In FTP we need to issue different commands depending on whether a resource 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is a file or directory. If we don't know that, we're going to autodetect 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it. 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum ResourceType { 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RESOURCE_TYPE_UNKNOWN, 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RESOURCE_TYPE_FILE, 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RESOURCE_TYPE_DIRECTORY, 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen enum State { 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Control connection states: 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_RESOLVE_HOST, 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_RESOLVE_HOST_COMPLETE, 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_CONNECT, 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_CONNECT_COMPLETE, 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_READ, 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_READ_COMPLETE, 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE, 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_COMPLETE, 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_USER, 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_PASS, 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_SYST, 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_TYPE, 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_EPSV, 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_PASV, 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_PWD, 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_RETR, 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_SIZE, 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_CWD, 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_LIST, 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_CTRL_WRITE_QUIT, 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Data connection states: 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_DATA_CONNECT, 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_DATA_CONNECT_COMPLETE, 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_DATA_READ, 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_DATA_READ_COMPLETE, 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STATE_NONE 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Resets the members of the transaction so it can be restarted. 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ResetStateForRestart(); 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoCallback(int result); 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnIOComplete(int result); 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Executes correct ProcessResponse + command_name function based on last 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // issued command. Returns error code. 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessCtrlResponse(); 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int SendFtpCommand(const std::string& command, Command cmd); 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns request path suitable to be included in an FTP command. If the path 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // will be used as a directory, |is_directory| should be true. 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string GetRequestPathForFtpCommand(bool is_directory) const; 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See if the request URL contains a typecode and make us respect it. 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DetectTypecode(); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Runs the state transition loop. 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoLoop(int result); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Each of these methods corresponds to a State value. Those with an input 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // argument receive the result from the previous state. If a method returns 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // next state method as the result arg. 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlResolveHost(); 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlResolveHostComplete(int result); 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlConnect(); 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlConnectComplete(int result); 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlRead(); 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlReadComplete(int result); 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWrite(); 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteComplete(int result); 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteUSER(); 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseUSER(const FtpCtrlResponse& response); 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWritePASS(); 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponsePASS(const FtpCtrlResponse& response); 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteSYST(); 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseSYST(const FtpCtrlResponse& response); 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWritePWD(); 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponsePWD(const FtpCtrlResponse& response); 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteTYPE(); 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseTYPE(const FtpCtrlResponse& response); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int DoCtrlWriteEPSV(); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int ProcessResponseEPSV(const FtpCtrlResponse& response); 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWritePASV(); 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponsePASV(const FtpCtrlResponse& response); 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteRETR(); 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseRETR(const FtpCtrlResponse& response); 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteSIZE(); 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseSIZE(const FtpCtrlResponse& response); 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteCWD(); 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseCWD(const FtpCtrlResponse& response); 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteLIST(); 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseLIST(const FtpCtrlResponse& response); 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoCtrlWriteQUIT(); 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int ProcessResponseQUIT(const FtpCtrlResponse& response); 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoDataConnect(); 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoDataConnectComplete(int result); 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoDataRead(); 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int DoDataReadComplete(int result); 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void RecordDataConnectionError(int result); 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Command command_sent_; 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CompletionCallbackImpl<FtpNetworkTransaction> io_callback_; 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CompletionCallback* user_callback_; 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_refptr<FtpNetworkSession> session_; 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog net_log_; 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const FtpRequestInfo* request_; 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FtpResponseInfo response_; 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Cancels the outstanding request on destruction. 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SingleRequestHostResolver resolver_; 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AddressList addresses_; 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // User buffer passed to the Read method for control socket. 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_refptr<IOBuffer> read_ctrl_buf_; 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<FtpCtrlResponseBuffer> ctrl_response_buffer_; 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_refptr<IOBuffer> read_data_buf_; 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int read_data_buf_len_; 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Buffer holding the command line to be written to the control socket. 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_refptr<IOBufferWithSize> write_command_buf_; 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Buffer passed to the Write method of control socket. It actually writes 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // to the write_command_buf_ at correct offset. 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_refptr<DrainableIOBuffer> write_buf_; 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int last_error_; 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SystemType system_type_; 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Data type to be used for the TYPE command. 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DataType data_type_; 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Detected resource type (file or directory). 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResourceType resource_type_; 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initially we favour EPSV over PASV for transfers but should any 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // EPSV fail, we fall back to PASV for the duration of connection. 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool use_epsv_; 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 username_; 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 password_; 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Current directory on the remote server, as returned by last PWD command, 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // with any trailing slash removed. 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string current_remote_directory_; 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int data_connection_port_; 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ClientSocketFactory* socket_factory_; 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<ClientSocket> ctrl_socket_; 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<ClientSocket> data_socket_; 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott State next_state_; 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // NET_FTP_FTP_NETWORK_TRANSACTION_H_ 251