ftp_directory_listing_parser_windows.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/ftp/ftp_directory_listing_parser_windows.h"
6
7#include <vector>
8
9#include "base/strings/string_number_conversions.h"
10#include "base/strings/string_split.h"
11#include "base/strings/string_util.h"
12#include "base/time/time.h"
13#include "net/ftp/ftp_directory_listing_parser.h"
14#include "net/ftp/ftp_util.h"
15
16namespace net {
17
18bool ParseFtpDirectoryListingWindows(
19    const std::vector<base::string16>& lines,
20    std::vector<FtpDirectoryListingEntry>* entries) {
21  for (size_t i = 0; i < lines.size(); i++) {
22    if (lines[i].empty())
23      continue;
24
25    std::vector<base::string16> columns;
26    base::SplitString(base::CollapseWhitespace(lines[i], false), ' ', &columns);
27
28    // Every line of the listing consists of the following:
29    //
30    //   1. date
31    //   2. time
32    //   3. size in bytes (or "<DIR>" for directories)
33    //   4. filename (may be empty or contain spaces)
34    //
35    // For now, make sure we have 1-3, and handle 4 later.
36    if (columns.size() < 3)
37      return false;
38
39    FtpDirectoryListingEntry entry;
40    if (EqualsASCII(columns[2], "<DIR>")) {
41      entry.type = FtpDirectoryListingEntry::DIRECTORY;
42      entry.size = -1;
43    } else {
44      entry.type = FtpDirectoryListingEntry::FILE;
45      if (!base::StringToInt64(columns[2], &entry.size))
46        return false;
47      if (entry.size < 0)
48        return false;
49    }
50
51    if (!FtpUtil::WindowsDateListingToTime(columns[0],
52                                           columns[1],
53                                           &entry.last_modified)) {
54      return false;
55    }
56
57    entry.name = FtpUtil::GetStringPartAfterColumns(lines[i], 3);
58    if (entry.name.empty()) {
59      // Some FTP servers send listing entries with empty names.
60      // It's not obvious how to display such an entry, so ignore them.
61      // We don't want to make the parsing fail at this point though.
62      // Other entries can still be useful.
63      continue;
64    }
65
66    entries->push_back(entry);
67  }
68
69  return true;
70}
71
72}  // namespace net
73