| Index: net/ftp/ftp_directory_listing_parser_windows.cc
|
| diff --git a/net/ftp/ftp_directory_listing_parser_windows.cc b/net/ftp/ftp_directory_listing_parser_windows.cc
|
| index ef733d5e019231d5828c82cea7fdf0910eef6d82..2317fa3a6ccd228db29e7ab4029f83c805025717 100644
|
| --- a/net/ftp/ftp_directory_listing_parser_windows.cc
|
| +++ b/net/ftp/ftp_directory_listing_parser_windows.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// 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.
|
|
|
| @@ -9,6 +9,8 @@
|
| #include "base/string_number_conversions.h"
|
| #include "base/string_split.h"
|
| #include "base/string_util.h"
|
| +#include "base/time.h"
|
| +#include "net/ftp/ftp_directory_listing_parser.h"
|
| #include "net/ftp/ftp_util.h"
|
|
|
| namespace {
|
| @@ -72,68 +74,55 @@ bool WindowsDateListingToTime(const std::vector<string16>& columns,
|
|
|
| namespace net {
|
|
|
| -FtpDirectoryListingParserWindows::FtpDirectoryListingParserWindows() {}
|
| -
|
| -FtpDirectoryListingParserWindows::~FtpDirectoryListingParserWindows() {}
|
| -
|
| -FtpServerType FtpDirectoryListingParserWindows::GetServerType() const {
|
| - return SERVER_WINDOWS;
|
| -}
|
| -
|
| -bool FtpDirectoryListingParserWindows::ConsumeLine(const string16& line) {
|
| - std::vector<string16> columns;
|
| - base::SplitString(CollapseWhitespace(line, false), ' ', &columns);
|
| -
|
| - // Every line of the listing consists of the following:
|
| - //
|
| - // 1. date
|
| - // 2. time
|
| - // 3. size in bytes (or "<DIR>" for directories)
|
| - // 4. filename (may be empty or contain spaces)
|
| - //
|
| - // For now, make sure we have 1-3, and handle 4 later.
|
| - if (columns.size() < 3)
|
| - return false;
|
| -
|
| - FtpDirectoryListingEntry entry;
|
| - if (EqualsASCII(columns[2], "<DIR>")) {
|
| - entry.type = FtpDirectoryListingEntry::DIRECTORY;
|
| - entry.size = -1;
|
| - } else {
|
| - entry.type = FtpDirectoryListingEntry::FILE;
|
| - if (!base::StringToInt64(columns[2], &entry.size))
|
| +bool ParseFtpDirectoryListingWindows(
|
| + const std::vector<string16>& lines,
|
| + std::vector<FtpDirectoryListingEntry>* entries) {
|
| + for (size_t i = 0; i < lines.size(); i++) {
|
| + if (lines[i].empty())
|
| + continue;
|
| +
|
| + std::vector<string16> columns;
|
| + base::SplitString(CollapseWhitespace(lines[i], false), ' ', &columns);
|
| +
|
| + // Every line of the listing consists of the following:
|
| + //
|
| + // 1. date
|
| + // 2. time
|
| + // 3. size in bytes (or "<DIR>" for directories)
|
| + // 4. filename (may be empty or contain spaces)
|
| + //
|
| + // For now, make sure we have 1-3, and handle 4 later.
|
| + if (columns.size() < 3)
|
| return false;
|
| - if (entry.size < 0)
|
| +
|
| + FtpDirectoryListingEntry entry;
|
| + if (EqualsASCII(columns[2], "<DIR>")) {
|
| + entry.type = FtpDirectoryListingEntry::DIRECTORY;
|
| + entry.size = -1;
|
| + } else {
|
| + entry.type = FtpDirectoryListingEntry::FILE;
|
| + if (!base::StringToInt64(columns[2], &entry.size))
|
| + return false;
|
| + if (entry.size < 0)
|
| + return false;
|
| + }
|
| +
|
| + if (!WindowsDateListingToTime(columns, &entry.last_modified))
|
| return false;
|
| - }
|
|
|
| - if (!WindowsDateListingToTime(columns, &entry.last_modified))
|
| - return false;
|
| + entry.name = FtpUtil::GetStringPartAfterColumns(lines[i], 3);
|
| + if (entry.name.empty()) {
|
| + // Some FTP servers send listing entries with empty names.
|
| + // It's not obvious how to display such an entry, so ignore them.
|
| + // We don't want to make the parsing fail at this point though.
|
| + // Other entries can still be useful.
|
| + continue;
|
| + }
|
|
|
| - entry.name = FtpUtil::GetStringPartAfterColumns(line, 3);
|
| - if (entry.name.empty()) {
|
| - // Some FTP servers send listing entries with empty names. It's not obvious
|
| - // how to display such an entry, so we ignore them. We don't want to make
|
| - // the parsing fail at this point though. Other entries can still be useful.
|
| - return true;
|
| + entries->push_back(entry);
|
| }
|
|
|
| - entries_.push(entry);
|
| - return true;
|
| -}
|
| -
|
| -bool FtpDirectoryListingParserWindows::OnEndOfInput() {
|
| return true;
|
| }
|
|
|
| -bool FtpDirectoryListingParserWindows::EntryAvailable() const {
|
| - return !entries_.empty();
|
| -}
|
| -
|
| -FtpDirectoryListingEntry FtpDirectoryListingParserWindows::PopEntry() {
|
| - FtpDirectoryListingEntry entry = entries_.front();
|
| - entries_.pop();
|
| - return entry;
|
| -}
|
| -
|
| } // namespace net
|
|
|