Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(900)

Unified Diff: net/ftp/ftp_directory_listing_buffer.cc

Issue 6670085: FTP: Detect the character encoding only after the entire listing is received. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test coverage Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/ftp/ftp_directory_listing_buffer.h ('k') | net/ftp/ftp_directory_listing_parser.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « net/ftp/ftp_directory_listing_buffer.h ('k') | net/ftp/ftp_directory_listing_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698