Index: net/ftp/ftp_directory_listing_buffer.cc |
diff --git a/net/ftp/ftp_directory_listing_buffer.cc b/net/ftp/ftp_directory_listing_buffer.cc |
deleted file mode 100644 |
index 58533b81112702dad3acb3f1dfe296ccaaabb700..0000000000000000000000000000000000000000 |
--- a/net/ftp/ftp_directory_listing_buffer.cc |
+++ /dev/null |
@@ -1,194 +0,0 @@ |
-// Copyright (c) 2009 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. |
- |
-#include "net/ftp/ftp_directory_listing_buffer.h" |
- |
-#include "base/i18n/icu_encoding_detection.h" |
-#include "base/i18n/icu_string_conversions.h" |
-#include "base/stl_util-inl.h" |
-#include "base/string_util.h" |
-#include "net/base/net_errors.h" |
-#include "net/ftp/ftp_directory_listing_parser_ls.h" |
-#include "net/ftp/ftp_directory_listing_parser_netware.h" |
-#include "net/ftp/ftp_directory_listing_parser_vms.h" |
-#include "net/ftp/ftp_directory_listing_parser_windows.h" |
- |
-namespace net { |
- |
-FtpDirectoryListingBuffer::FtpDirectoryListingBuffer( |
- const base::Time& current_time) |
- : current_parser_(NULL) { |
- parsers_.insert(new FtpDirectoryListingParserLs(current_time)); |
- parsers_.insert(new FtpDirectoryListingParserNetware(current_time)); |
- parsers_.insert(new FtpDirectoryListingParserVms()); |
- parsers_.insert(new FtpDirectoryListingParserWindows()); |
-} |
- |
-FtpDirectoryListingBuffer::~FtpDirectoryListingBuffer() { |
- STLDeleteElements(&parsers_); |
-} |
- |
-int FtpDirectoryListingBuffer::ConsumeData(const char* data, int data_length) { |
- buffer_.append(data, data_length); |
- |
- if (!encoding_.empty() || buffer_.length() > 1024) { |
- int rv = ConsumeBuffer(); |
- if (rv != OK) |
- return rv; |
- } |
- |
- return ParseLines(); |
-} |
- |
-int FtpDirectoryListingBuffer::ProcessRemainingData() { |
- int rv = ConsumeBuffer(); |
- if (rv != OK) |
- return rv; |
- |
- DCHECK(buffer_.empty()); |
- if (!converted_buffer_.empty()) |
- return ERR_INVALID_RESPONSE; |
- |
- rv = ParseLines(); |
- if (rv != OK) |
- return rv; |
- |
- rv = OnEndOfInput(); |
- if (rv != OK) |
- return rv; |
- |
- return OK; |
-} |
- |
-bool FtpDirectoryListingBuffer::EntryAvailable() const { |
- return (current_parser_ ? current_parser_->EntryAvailable() : false); |
-} |
- |
-FtpDirectoryListingEntry FtpDirectoryListingBuffer::PopEntry() { |
- DCHECK(EntryAvailable()); |
- return current_parser_->PopEntry(); |
-} |
- |
-FtpServerType FtpDirectoryListingBuffer::GetServerType() const { |
- return (current_parser_ ? current_parser_->GetServerType() : SERVER_UNKNOWN); |
-} |
- |
-int FtpDirectoryListingBuffer::DecodeBufferUsingEncoding( |
- const std::string& encoding) { |
- string16 converted; |
- if (!base::CodepageToUTF16(buffer_, |
- encoding.c_str(), |
- base::OnStringConversionError::FAIL, |
- &converted)) |
- return ERR_ENCODING_CONVERSION_FAILED; |
- |
- buffer_.clear(); |
- converted_buffer_ += converted; |
- return OK; |
-} |
- |
-int FtpDirectoryListingBuffer::ConvertBufferToUTF16() { |
- if (encoding_.empty()) { |
- std::vector<std::string> encodings; |
- if (!base::DetectAllEncodings(buffer_, &encodings)) |
- return ERR_ENCODING_DETECTION_FAILED; |
- |
- // Use first encoding that can be used to decode the buffer. |
- for (size_t i = 0; i < encodings.size(); i++) { |
- if (DecodeBufferUsingEncoding(encodings[i]) == OK) { |
- encoding_ = encodings[i]; |
- return OK; |
- } |
- } |
- |
- return ERR_ENCODING_DETECTION_FAILED; |
- } |
- |
- return DecodeBufferUsingEncoding(encoding_); |
-} |
- |
-void FtpDirectoryListingBuffer::ExtractFullLinesFromBuffer() { |
- int cut_pos = 0; |
- // TODO(phajdan.jr): This code accepts all endlines matching \r*\n. Should it |
- // be more strict, or enforce consistent line endings? |
- for (size_t i = 0; i < converted_buffer_.length(); ++i) { |
- if (converted_buffer_[i] != '\n') |
- continue; |
- int line_length = i - cut_pos; |
- if (i >= 1 && converted_buffer_[i - 1] == '\r') |
- line_length--; |
- lines_.push_back(converted_buffer_.substr(cut_pos, line_length)); |
- cut_pos = i + 1; |
- } |
- converted_buffer_.erase(0, cut_pos); |
-} |
- |
-int FtpDirectoryListingBuffer::ConsumeBuffer() { |
- int rv = ConvertBufferToUTF16(); |
- if (rv != OK) |
- return rv; |
- |
- ExtractFullLinesFromBuffer(); |
- return OK; |
-} |
- |
-int FtpDirectoryListingBuffer::ParseLines() { |
- while (!lines_.empty()) { |
- string16 line = lines_.front(); |
- lines_.pop_front(); |
- if (current_parser_) { |
- if (!current_parser_->ConsumeLine(line)) |
- return ERR_FAILED; |
- } else { |
- ParserSet::iterator i = parsers_.begin(); |
- while (i != parsers_.end()) { |
- if ((*i)->ConsumeLine(line)) { |
- i++; |
- } else { |
- delete *i; |
- parsers_.erase(i++); |
- } |
- } |
- if (parsers_.empty()) |
- return ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT; |
- if (parsers_.size() == 1) |
- current_parser_ = *parsers_.begin(); |
- } |
- } |
- |
- return OK; |
-} |
- |
-int FtpDirectoryListingBuffer::OnEndOfInput() { |
- ParserSet::iterator i = parsers_.begin(); |
- while (i != parsers_.end()) { |
- if ((*i)->OnEndOfInput()) { |
- i++; |
- } else { |
- delete *i; |
- parsers_.erase(i++); |
- } |
- } |
- |
- if (parsers_.size() != 1) { |
- current_parser_ = NULL; |
- |
- // We may hit an ambiguity in case of listings which have no entries. That's |
- // fine, as long as all remaining parsers agree that the listing is empty. |
- bool all_listings_empty = true; |
- for (ParserSet::iterator i = parsers_.begin(); i != parsers_.end(); ++i) { |
- if ((*i)->EntryAvailable()) |
- all_listings_empty = false; |
- } |
- if (all_listings_empty) |
- return OK; |
- |
- return ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT; |
- } |
- |
- current_parser_ = *parsers_.begin(); |
- return OK; |
-} |
- |
-} // namespace net |