diff options
Diffstat (limited to 'chromium/net/ftp/ftp_ctrl_response_buffer.h')
-rw-r--r-- | chromium/net/ftp/ftp_ctrl_response_buffer.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/chromium/net/ftp/ftp_ctrl_response_buffer.h b/chromium/net/ftp/ftp_ctrl_response_buffer.h new file mode 100644 index 00000000000..fa5c03115b3 --- /dev/null +++ b/chromium/net/ftp/ftp_ctrl_response_buffer.h @@ -0,0 +1,101 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + + +#ifndef NET_FTP_FTP_CTRL_RESPONSE_BUFFER_H_ +#define NET_FTP_FTP_CTRL_RESPONSE_BUFFER_H_ + +#include <queue> +#include <string> +#include <vector> + +#include "base/basictypes.h" +#include "net/base/net_export.h" +#include "net/base/net_log.h" + +namespace net { + +struct NET_EXPORT_PRIVATE FtpCtrlResponse { + static const int kInvalidStatusCode; + + FtpCtrlResponse(); + ~FtpCtrlResponse(); + + int status_code; // Three-digit status code. + std::vector<std::string> lines; // Response lines, without CRLFs. +}; + +class NET_EXPORT_PRIVATE FtpCtrlResponseBuffer { + public: + FtpCtrlResponseBuffer(const BoundNetLog& net_log); + ~FtpCtrlResponseBuffer(); + + // Called when data is received from the control socket. Returns error code. + int ConsumeData(const char* data, int data_length); + + bool ResponseAvailable() const { + return !responses_.empty(); + } + + // Returns the next response. It is an error to call this function + // unless ResponseAvailable returns true. + FtpCtrlResponse PopResponse(); + + private: + struct ParsedLine { + ParsedLine(); + + // Indicates that this line begins with a valid 3-digit status code. + bool has_status_code; + + // Indicates that this line has the dash (-) after the code, which + // means a multiline response. + bool is_multiline; + + // Indicates that this line could be parsed as a complete and valid + // response line, without taking into account preceding lines (which + // may change its meaning into a continuation of the previous line). + bool is_complete; + + // Part of response parsed as status code. + int status_code; + + // Part of response parsed as status text. + std::string status_text; + + // Text before parsing, without terminating CRLF. + std::string raw_text; + }; + + static ParsedLine ParseLine(const std::string& line); + + void ExtractFullLinesFromBuffer(); + + // We keep not-yet-parsed data in a string buffer. + std::string buffer_; + + std::queue<ParsedLine> lines_; + + // True if we are in the middle of parsing a multi-line response. + bool multiline_; + + // When parsing a multiline response, we don't know beforehand if a line + // will have a continuation. So always store last line of multiline response + // so we can append the continuation to it. + std::string line_buf_; + + // Keep the response data while we add all lines to it. + FtpCtrlResponse response_buf_; + + // As we read full responses (possibly multiline), we add them to the queue. + std::queue<FtpCtrlResponse> responses_; + + BoundNetLog net_log_; + + DISALLOW_COPY_AND_ASSIGN(FtpCtrlResponseBuffer); +}; + +} // namespace net + +#endif // NET_FTP_FTP_CTRL_RESPONSE_BUFFER_H_ |