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.
5 #include "net/ftp/ftp_directory_listing_parser_netware.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_util.h"
11 #include "base/strings/string_split.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "net/ftp/ftp_directory_listing_parser.h"
14 #include "net/ftp/ftp_util.h"
18 bool LooksLikeNetwarePermissionsListing(const base::string16
& text
) {
19 if (text
.length() != 10)
22 if (text
[0] != '[' || text
[9] != ']')
24 return (text
[1] == 'R' || text
[1] == '-') &&
25 (text
[2] == 'W' || text
[2] == '-') &&
26 (text
[3] == 'C' || text
[3] == '-') &&
27 (text
[4] == 'E' || text
[4] == '-') &&
28 (text
[5] == 'A' || text
[5] == '-') &&
29 (text
[6] == 'F' || text
[6] == '-') &&
30 (text
[7] == 'M' || text
[7] == '-') &&
31 (text
[8] == 'S' || text
[8] == '-');
38 bool ParseFtpDirectoryListingNetware(
39 const std::vector
<base::string16
>& lines
,
40 const base::Time
& current_time
,
41 std::vector
<FtpDirectoryListingEntry
>* entries
) {
43 !base::StartsWith(lines
[0], base::ASCIIToUTF16("total "),
44 base::CompareCase::SENSITIVE
)) {
48 for (size_t i
= 1U; i
< lines
.size(); i
++) {
52 std::vector
<base::string16
> columns
= base::SplitString(
53 base::CollapseWhitespace(lines
[i
], false), base::ASCIIToUTF16(" "),
54 base::TRIM_WHITESPACE
, base::SPLIT_WANT_ALL
);
56 if (columns
.size() < 8)
59 FtpDirectoryListingEntry entry
;
61 if (columns
[0].length() != 1)
63 if (columns
[0][0] == 'd') {
64 entry
.type
= FtpDirectoryListingEntry::DIRECTORY
;
65 } else if (columns
[0][0] == '-') {
66 entry
.type
= FtpDirectoryListingEntry::FILE;
71 // Note: on older Netware systems the permissions listing is in the same
72 // column as the entry type (just there is no space between them). We do not
73 // support the older format here for simplicity.
74 if (!LooksLikeNetwarePermissionsListing(columns
[1]))
77 if (!base::StringToInt64(columns
[3], &entry
.size
))
81 if (entry
.type
!= FtpDirectoryListingEntry::FILE)
84 // Netware uses the same date listing format as Unix "ls -l".
85 if (!FtpUtil::LsDateListingToTime(columns
[4], columns
[5], columns
[6],
86 current_time
, &entry
.last_modified
)) {
90 entry
.name
= FtpUtil::GetStringPartAfterColumns(lines
[i
], 7);
92 entries
->push_back(entry
);