Home | History | Annotate | Download | only in ftp
      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_os2.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 
     16 namespace net {
     17 
     18 bool ParseFtpDirectoryListingOS2(
     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(CollapseWhitespace(lines[i], false), ' ', &columns);
     27 
     28     // Every line of the listing consists of the following:
     29     //
     30     //   1. size in bytes (0 for directories)
     31     //   2. type (A for files, DIR for directories)
     32     //   3. date
     33     //   4. time
     34     //   5. filename (may be empty or contain spaces)
     35     //
     36     // For now, make sure we have 1-4, and handle 5 later.
     37     if (columns.size() < 4)
     38       return false;
     39 
     40     FtpDirectoryListingEntry entry;
     41     if (!base::StringToInt64(columns[0], &entry.size))
     42       return false;
     43     if (EqualsASCII(columns[1], "DIR")) {
     44       if (entry.size != 0)
     45         return false;
     46       entry.type = FtpDirectoryListingEntry::DIRECTORY;
     47       entry.size = -1;
     48     } else if (EqualsASCII(columns[1], "A")) {
     49       entry.type = FtpDirectoryListingEntry::FILE;
     50       if (entry.size < 0)
     51         return false;
     52     } else {
     53       return false;
     54     }
     55 
     56     if (!FtpUtil::WindowsDateListingToTime(columns[2],
     57                                            columns[3],
     58                                            &entry.last_modified)) {
     59       return false;
     60     }
     61 
     62     entry.name = FtpUtil::GetStringPartAfterColumns(lines[i], 4);
     63     if (entry.name.empty()) {
     64       // Some FTP servers send listing entries with empty names.
     65       // It's not obvious how to display such an entry, so ignore them.
     66       // We don't want to make the parsing fail at this point though.
     67       // Other entries can still be useful.
     68       continue;
     69     }
     70 
     71     entries->push_back(entry);
     72   }
     73 
     74   return true;
     75 }
     76 
     77 }  // namespace net
     78