OLD | NEW |
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this | 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 #ifndef NET_FTP_FTP_NETWORK_TRANSACTION_H_ | 5 #ifndef NET_FTP_FTP_NETWORK_TRANSACTION_H_ |
6 #define NET_FTP_FTP_NETWORK_TRANSACTION_H_ | 6 #define NET_FTP_FTP_NETWORK_TRANSACTION_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
| 9 #include <queue> |
| 10 #include <utility> |
9 | 11 |
10 #include "base/ref_counted.h" | 12 #include "base/ref_counted.h" |
11 #include "base/scoped_ptr.h" | 13 #include "base/scoped_ptr.h" |
12 #include "net/base/address_list.h" | 14 #include "net/base/address_list.h" |
13 #include "net/base/host_resolver.h" | 15 #include "net/base/host_resolver.h" |
14 #include "net/ftp/ftp_response_info.h" | 16 #include "net/ftp/ftp_response_info.h" |
15 #include "net/ftp/ftp_transaction.h" | 17 #include "net/ftp/ftp_transaction.h" |
16 | 18 |
17 namespace net { | 19 namespace net { |
18 | 20 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 ERROR_CLASS_PENDING, // The command accepted, but the | 65 ERROR_CLASS_PENDING, // The command accepted, but the |
64 // request on hold. | 66 // request on hold. |
65 ERROR_CLASS_ERROR_RETRY, // The command was not accepted and the | 67 ERROR_CLASS_ERROR_RETRY, // The command was not accepted and the |
66 // requested action did not take place, | 68 // requested action did not take place, |
67 // but the error condition is temporary and the | 69 // but the error condition is temporary and the |
68 // action may be requested again. | 70 // action may be requested again. |
69 ERROR_CLASS_ERROR, // The command was not accepted and | 71 ERROR_CLASS_ERROR, // The command was not accepted and |
70 // the requested action did not take place. | 72 // the requested action did not take place. |
71 }; | 73 }; |
72 | 74 |
| 75 struct ResponseLine { |
| 76 ResponseLine(int code, const std::string& text) : code(code), text(text) { |
| 77 } |
| 78 |
| 79 int code; // Three-digit status code. |
| 80 std::string text; // Text after the code, without ending CRLF. |
| 81 }; |
| 82 |
73 void DoCallback(int result); | 83 void DoCallback(int result); |
74 void OnIOComplete(int result); | 84 void OnIOComplete(int result); |
75 int GetRespnseCode(); | 85 |
76 int ProcessResponse(int response_code); | 86 // Executes correct ProcessResponse + command_name function based on last |
77 int ParsePasvResponse(); | 87 // issued command. Returns error code. |
| 88 int ProcessCtrlResponses(); |
| 89 |
| 90 // Parses as much as possible from response_message_buf_. Puts index of the |
| 91 // first unparsed character in cut_pos. Returns error code. |
| 92 int ParseCtrlResponse(int* cut_pos); |
78 | 93 |
79 int SendFtpCommand(const std::string& command, Command cmd); | 94 int SendFtpCommand(const std::string& command, Command cmd); |
80 | 95 |
81 // TODO(ibrar): Use C++ static_cast. | 96 // TODO(ibrar): Use C++ static_cast. |
82 ErrorClass GetErrorClass(int response_code) { | 97 ErrorClass GetErrorClass(int response_code) { |
83 return (ErrorClass)(response_code / 100); | 98 return (ErrorClass)(response_code / 100); |
84 } | 99 } |
85 | 100 |
86 // Runs the state transition loop. | 101 // Runs the state transition loop. |
87 int DoLoop(int result); | 102 int DoLoop(int result); |
88 | 103 |
89 // Each of these methods corresponds to a State value. Those with an input | 104 // Each of these methods corresponds to a State value. Those with an input |
90 // argument receive the result from the previous state. If a method returns | 105 // argument receive the result from the previous state. If a method returns |
91 // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the | 106 // ERR_IO_PENDING, then the result from OnIOComplete will be passed to the |
92 // next state method as the result arg. | 107 // next state method as the result arg. |
93 int DoCtrlInit(); | 108 int DoCtrlInit(); |
94 int DoCtrlInitComplete(int result); | 109 int DoCtrlInitComplete(int result); |
95 int DoCtrlResolveHost(); | 110 int DoCtrlResolveHost(); |
96 int DoCtrlResolveHostComplete(int result); | 111 int DoCtrlResolveHostComplete(int result); |
97 int DoCtrlConnect(); | 112 int DoCtrlConnect(); |
98 int DoCtrlConnectComplete(int result); | 113 int DoCtrlConnectComplete(int result); |
99 int DoCtrlRead(); | 114 int DoCtrlRead(); |
100 int DoCtrlReadComplete(int result); | 115 int DoCtrlReadComplete(int result); |
101 int DoCtrlWriteUSER(); | 116 int DoCtrlWriteUSER(); |
102 int ProcessResponseUSER(int response_code); | 117 int ProcessResponseUSER(const ResponseLine& response); |
103 int DoCtrlWritePASS(); | 118 int DoCtrlWritePASS(); |
104 int ProcessResponsePASS(int response_code); | 119 int ProcessResponsePASS(const ResponseLine& response); |
105 int DoCtrlWriteACCT(); | 120 int DoCtrlWriteACCT(); |
106 int ProcessResponseACCT(int response_code); | 121 int ProcessResponseACCT(const ResponseLine& response); |
107 int DoCtrlWriteSYST(); | 122 int DoCtrlWriteSYST(); |
108 int ProcessResponseSYST(int response_code); | 123 int ProcessResponseSYST(const ResponseLine& response); |
109 int DoCtrlWritePWD(); | 124 int DoCtrlWritePWD(); |
110 int ProcessResponsePWD(int response_code); | 125 int ProcessResponsePWD(const ResponseLine& response); |
111 int DoCtrlWriteTYPE(); | 126 int DoCtrlWriteTYPE(); |
112 int ProcessResponseTYPE(int response_code); | 127 int ProcessResponseTYPE(const ResponseLine& response); |
113 int DoCtrlWritePASV(); | 128 int DoCtrlWritePASV(); |
114 int ProcessResponsePASV(int response_code); | 129 int ProcessResponsePASV(const ResponseLine& response); |
115 int DoCtrlWriteRETR(); | 130 int DoCtrlWriteRETR(); |
116 int ProcessResponseRETR(int response_code); | 131 int ProcessResponseRETR(const ResponseLine& response); |
117 int DoCtrlWriteSIZE(); | 132 int DoCtrlWriteSIZE(); |
118 int ProcessResponseSIZE(int response_code); | 133 int ProcessResponseSIZE(const ResponseLine& response); |
119 int DoCtrlWriteCWD(); | 134 int DoCtrlWriteCWD(); |
120 int ProcessResponseCWD(int response_code); | 135 int ProcessResponseCWD(const ResponseLine& response); |
121 int DoCtrlWriteLIST(); | 136 int DoCtrlWriteLIST(); |
122 int ProcessResponseLIST(int response_code); | 137 int ProcessResponseLIST(const ResponseLine& response); |
123 int DoCtrlWriteMDTM(); | 138 int DoCtrlWriteMDTM(); |
124 int ProcessResponseMDTM(int response_code); | 139 int ProcessResponseMDTM(const ResponseLine& response); |
125 int DoCtrlWriteQUIT(); | 140 int DoCtrlWriteQUIT(); |
126 int ProcessResponseQUIT(int response_code); | 141 int ProcessResponseQUIT(const ResponseLine& response); |
127 | 142 |
128 int DoDataResolveHost(); | 143 int DoDataResolveHost(); |
129 int DoDataResolveHostComplete(int result); | 144 int DoDataResolveHostComplete(int result); |
130 int DoDataConnect(); | 145 int DoDataConnect(); |
131 int DoDataConnectComplete(int result); | 146 int DoDataConnectComplete(int result); |
132 int DoDataRead(); | 147 int DoDataRead(); |
133 int DoDataReadComplete(int result); | 148 int DoDataReadComplete(int result); |
134 | 149 |
135 Command command_sent_; | 150 Command command_sent_; |
136 | 151 |
137 CompletionCallbackImpl<FtpNetworkTransaction> io_callback_; | 152 CompletionCallbackImpl<FtpNetworkTransaction> io_callback_; |
138 CompletionCallback* user_callback_; | 153 CompletionCallback* user_callback_; |
139 | 154 |
140 scoped_refptr<FtpNetworkSession> session_; | 155 scoped_refptr<FtpNetworkSession> session_; |
141 | 156 |
142 const FtpRequestInfo* request_; | 157 const FtpRequestInfo* request_; |
143 FtpResponseInfo response_; | 158 FtpResponseInfo response_; |
144 | 159 |
145 // Cancels the outstanding request on destruction. | 160 // Cancels the outstanding request on destruction. |
146 SingleRequestHostResolver resolver_; | 161 SingleRequestHostResolver resolver_; |
147 AddressList addresses_; | 162 AddressList addresses_; |
148 | 163 |
149 // User buffer and length passed to the Read method. | 164 // As we read full response lines, we parse them and add to the queue. |
150 scoped_refptr<IOBuffer> read_ctrl_buf_; | 165 std::queue<ResponseLine> ctrl_responses_; |
151 int read_ctrl_buf_size_; | |
152 | 166 |
153 scoped_refptr<IOBuffer> response_message_buf_; | 167 // Buffer holding not-yet-parsed control socket responses. |
| 168 scoped_refptr<IOBufferWithSize> response_message_buf_; |
154 int response_message_buf_len_; | 169 int response_message_buf_len_; |
155 | 170 |
| 171 // User buffer passed to the Read method. It actually writes to the |
| 172 // response_message_buf_ at correct offset. |
| 173 scoped_refptr<ReusedIOBuffer> read_ctrl_buf_; |
| 174 |
156 scoped_refptr<IOBuffer> read_data_buf_; | 175 scoped_refptr<IOBuffer> read_data_buf_; |
157 int read_data_buf_len_; | 176 int read_data_buf_len_; |
158 int file_data_len_; | 177 int file_data_len_; |
159 | 178 |
160 scoped_refptr<IOBuffer> write_buf_; | 179 scoped_refptr<IOBuffer> write_buf_; |
161 | 180 |
162 int last_error_; | 181 int last_error_; |
163 | 182 |
164 bool is_anonymous_; | 183 bool is_anonymous_; |
165 bool retr_failed_; | 184 bool retr_failed_; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 STATE_DATA_READ, | 222 STATE_DATA_READ, |
204 STATE_DATA_READ_COMPLETE, | 223 STATE_DATA_READ_COMPLETE, |
205 STATE_NONE | 224 STATE_NONE |
206 }; | 225 }; |
207 State next_state_; | 226 State next_state_; |
208 }; | 227 }; |
209 | 228 |
210 } // namespace net | 229 } // namespace net |
211 | 230 |
212 #endif // NET_FTP_FTP_NETWORK_TRANSACTION_H_ | 231 #endif // NET_FTP_FTP_NETWORK_TRANSACTION_H_ |
OLD | NEW |