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