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 "), true)) {
47 for (size_t i
= 1U; i
< lines
.size(); i
++) {
51 std::vector
<base::string16
> columns
;
52 base::SplitString(base::CollapseWhitespace(lines
[i
], false), ' ', &columns
);
54 if (columns
.size() < 8)
57 FtpDirectoryListingEntry entry
;
59 if (columns
[0].length() != 1)
61 if (columns
[0][0] == 'd') {
62 entry
.type
= FtpDirectoryListingEntry::DIRECTORY
;
63 } else if (columns
[0][0] == '-') {
64 entry
.type
= FtpDirectoryListingEntry::FILE;
69 // Note: on older Netware systems the permissions listing is in the same
70 // column as the entry type (just there is no space between them). We do not
71 // support the older format here for simplicity.
72 if (!LooksLikeNetwarePermissionsListing(columns
[1]))
75 if (!base::StringToInt64(columns
[3], &entry
.size
))
79 if (entry
.type
!= FtpDirectoryListingEntry::FILE)
82 // Netware uses the same date listing format as Unix "ls -l".
83 if (!FtpUtil::LsDateListingToTime(columns
[4], columns
[5], columns
[6],
84 current_time
, &entry
.last_modified
)) {
88 entry
.name
= FtpUtil::GetStringPartAfterColumns(lines
[i
], 7);
90 entries
->push_back(entry
);