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_netware.h" 6 7#include <vector> 8 9#include "base/string_number_conversions.h" 10#include "base/string_split.h" 11#include "base/string_util.h" 12#include "base/utf_string_conversions.h" 13#include "net/ftp/ftp_directory_listing_parser.h" 14#include "net/ftp/ftp_util.h" 15 16namespace { 17 18bool LooksLikeNetwarePermissionsListing(const string16& text) { 19 if (text.length() != 10) 20 return false; 21 22 if (text[0] != '[' || text[9] != ']') 23 return false; 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] == '-'); 32} 33 34} // namespace 35 36namespace net { 37 38bool ParseFtpDirectoryListingNetware( 39 const std::vector<string16>& lines, 40 const base::Time& current_time, 41 std::vector<FtpDirectoryListingEntry>* entries) { 42 if (!lines.empty() && !StartsWith(lines[0], ASCIIToUTF16("total "), true)) 43 return false; 44 45 for (size_t i = 1U; i < lines.size(); i++) { 46 if (lines[i].empty()) 47 continue; 48 49 std::vector<string16> columns; 50 base::SplitString(CollapseWhitespace(lines[i], false), ' ', &columns); 51 52 if (columns.size() != 8) 53 return false; 54 55 FtpDirectoryListingEntry entry; 56 57 if (columns[0].length() != 1) 58 return false; 59 if (columns[0][0] == 'd') { 60 entry.type = FtpDirectoryListingEntry::DIRECTORY; 61 } else if (columns[0][0] == '-') { 62 entry.type = FtpDirectoryListingEntry::FILE; 63 } else { 64 return false; 65 } 66 67 // Note: on older Netware systems the permissions listing is in the same 68 // column as the entry type (just there is no space between them). We do not 69 // support the older format here for simplicity. 70 if (!LooksLikeNetwarePermissionsListing(columns[1])) 71 return false; 72 73 if (!base::StringToInt64(columns[3], &entry.size)) 74 return false; 75 if (entry.size < 0) 76 return false; 77 if (entry.type != FtpDirectoryListingEntry::FILE) 78 entry.size = -1; 79 80 // Netware uses the same date listing format as Unix "ls -l". 81 if (!FtpUtil::LsDateListingToTime(columns[4], columns[5], columns[6], 82 current_time, &entry.last_modified)) { 83 return false; 84 } 85 86 entry.name = columns[7]; 87 88 entries->push_back(entry); 89 } 90 91 return true; 92} 93 94} // namespace net 95