- add sources.
[platform/framework/web/crosswalk.git] / src / net / ftp / ftp_directory_listing_parser_os2.cc
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