Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: net/base/directory_lister.cc

Issue 13165005: Move FileEnumerator to its own file, do some refactoring. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge, fixes Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/directory_lister.h ('k') | net/base/directory_lister_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/directory_lister.h" 5 #include "net/base/directory_lister.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/files/file_enumerator.h"
12 #include "base/i18n/file_util_icu.h" 13 #include "base/i18n/file_util_icu.h"
13 #include "base/message_loop.h" 14 #include "base/message_loop.h"
14 #include "base/threading/thread_restrictions.h" 15 #include "base/threading/thread_restrictions.h"
15 #include "base/threading/worker_pool.h" 16 #include "base/threading/worker_pool.h"
16 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
17 18
18 namespace net { 19 namespace net {
19 20
20 namespace { 21 namespace {
21 22
22 const int kFilesPerEvent = 8; 23 const int kFilesPerEvent = 8;
23 24
24 bool IsDotDot(const base::FilePath& path) { 25 bool IsDotDot(const base::FilePath& path) {
25 return FILE_PATH_LITERAL("..") == path.BaseName().value(); 26 return FILE_PATH_LITERAL("..") == path.BaseName().value();
26 } 27 }
27 28
28 // Comparator for sorting lister results. This uses the locale aware filename 29 // Comparator for sorting lister results. This uses the locale aware filename
29 // comparison function on the filenames for sorting in the user's locale. 30 // comparison function on the filenames for sorting in the user's locale.
30 // Static. 31 // Static.
31 bool CompareAlphaDirsFirst(const DirectoryLister::DirectoryListerData& a, 32 bool CompareAlphaDirsFirst(const DirectoryLister::DirectoryListerData& a,
32 const DirectoryLister::DirectoryListerData& b) { 33 const DirectoryLister::DirectoryListerData& b) {
33 // Parent directory before all else. 34 // Parent directory before all else.
34 if (IsDotDot(file_util::FileEnumerator::GetFilename(a.info))) 35 if (IsDotDot(a.info.GetName()))
35 return true; 36 return true;
36 if (IsDotDot(file_util::FileEnumerator::GetFilename(b.info))) 37 if (IsDotDot(b.info.GetName()))
37 return false; 38 return false;
38 39
39 // Directories before regular files. 40 // Directories before regular files.
40 bool a_is_directory = file_util::FileEnumerator::IsDirectory(a.info); 41 bool a_is_directory = a.info.IsDirectory();
41 bool b_is_directory = file_util::FileEnumerator::IsDirectory(b.info); 42 bool b_is_directory = b.info.IsDirectory();
42 if (a_is_directory != b_is_directory) 43 if (a_is_directory != b_is_directory)
43 return a_is_directory; 44 return a_is_directory;
44 45
45 return file_util::LocaleAwareCompareFilenames( 46 return file_util::LocaleAwareCompareFilenames(a.info.GetName(),
46 file_util::FileEnumerator::GetFilename(a.info), 47 b.info.GetName());
47 file_util::FileEnumerator::GetFilename(b.info));
48 } 48 }
49 49
50 bool CompareDate(const DirectoryLister::DirectoryListerData& a, 50 bool CompareDate(const DirectoryLister::DirectoryListerData& a,
51 const DirectoryLister::DirectoryListerData& b) { 51 const DirectoryLister::DirectoryListerData& b) {
52 // Parent directory before all else. 52 // Parent directory before all else.
53 if (IsDotDot(file_util::FileEnumerator::GetFilename(a.info))) 53 if (IsDotDot(a.info.GetName()))
54 return true; 54 return true;
55 if (IsDotDot(file_util::FileEnumerator::GetFilename(b.info))) 55 if (IsDotDot(b.info.GetName()))
56 return false; 56 return false;
57 57
58 // Directories before regular files. 58 // Directories before regular files.
59 bool a_is_directory = file_util::FileEnumerator::IsDirectory(a.info); 59 bool a_is_directory = a.info.IsDirectory();
60 bool b_is_directory = file_util::FileEnumerator::IsDirectory(b.info); 60 bool b_is_directory = b.info.IsDirectory();
61 if (a_is_directory != b_is_directory) 61 if (a_is_directory != b_is_directory)
62 return a_is_directory; 62 return a_is_directory;
63 #if defined(OS_POSIX) 63 return a.info.GetLastModifiedTime() > b.info.GetLastModifiedTime();
64 return a.info.stat.st_mtime > b.info.stat.st_mtime;
65 #elif defined(OS_WIN)
66 if (a.info.ftLastWriteTime.dwHighDateTime ==
67 b.info.ftLastWriteTime.dwHighDateTime) {
68 return a.info.ftLastWriteTime.dwLowDateTime >
69 b.info.ftLastWriteTime.dwLowDateTime;
70 } else {
71 return a.info.ftLastWriteTime.dwHighDateTime >
72 b.info.ftLastWriteTime.dwHighDateTime;
73 }
74 #endif
75 } 64 }
76 65
77 // Comparator for sorting find result by paths. This uses the locale-aware 66 // Comparator for sorting find result by paths. This uses the locale-aware
78 // comparison function on the filenames for sorting in the user's locale. 67 // comparison function on the filenames for sorting in the user's locale.
79 // Static. 68 // Static.
80 bool CompareFullPath(const DirectoryLister::DirectoryListerData& a, 69 bool CompareFullPath(const DirectoryLister::DirectoryListerData& a,
81 const DirectoryLister::DirectoryListerData& b) { 70 const DirectoryLister::DirectoryListerData& b) {
82 return file_util::LocaleAwareCompareFilenames(a.path, b.path); 71 return file_util::LocaleAwareCompareFilenames(a.path, b.path);
83 } 72 }
84 73
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 143
155 void DirectoryLister::Core::StartInternal() { 144 void DirectoryLister::Core::StartInternal() {
156 145
157 if (!file_util::DirectoryExists(dir_)) { 146 if (!file_util::DirectoryExists(dir_)) {
158 origin_loop_->PostTask( 147 origin_loop_->PostTask(
159 FROM_HERE, 148 FROM_HERE,
160 base::Bind(&DirectoryLister::Core::OnDone, this, ERR_FILE_NOT_FOUND)); 149 base::Bind(&DirectoryLister::Core::OnDone, this, ERR_FILE_NOT_FOUND));
161 return; 150 return;
162 } 151 }
163 152
164 int types = file_util::FileEnumerator::FILES | 153 int types = base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES;
165 file_util::FileEnumerator::DIRECTORIES;
166 if (!recursive_) 154 if (!recursive_)
167 types |= file_util::FileEnumerator::INCLUDE_DOT_DOT; 155 types |= base::FileEnumerator::INCLUDE_DOT_DOT;
168 156
169 file_util::FileEnumerator file_enum(dir_, recursive_, types); 157 base::FileEnumerator file_enum(dir_, recursive_, types);
170 158
171 base::FilePath path; 159 base::FilePath path;
172 std::vector<DirectoryListerData> file_data; 160 std::vector<DirectoryListerData> file_data;
173 while (lister_ && !(path = file_enum.Next()).empty()) { 161 while (lister_ && !(path = file_enum.Next()).empty()) {
174 DirectoryListerData data; 162 DirectoryListerData data;
175 file_enum.GetFindInfo(&data.info); 163 data.info = file_enum.GetInfo();
176 data.path = path; 164 data.path = path;
177 file_data.push_back(data); 165 file_data.push_back(data);
178 166
179 /* TODO(brettw) bug 24107: It would be nice to send incremental updates. 167 /* TODO(brettw) bug 24107: It would be nice to send incremental updates.
180 We gather them all so they can be sorted, but eventually the sorting 168 We gather them all so they can be sorted, but eventually the sorting
181 should be done from JS to give more flexibility in the page. When we do 169 should be done from JS to give more flexibility in the page. When we do
182 that, we can uncomment this to send incremental updates to the page. 170 that, we can uncomment this to send incremental updates to the page.
183 171
184 if (file_data.size() < kFilesPerEvent) 172 if (file_data.size() < kFilesPerEvent)
185 continue; 173 continue;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 206
219 void DirectoryLister::OnReceivedData(const DirectoryListerData& data) { 207 void DirectoryLister::OnReceivedData(const DirectoryListerData& data) {
220 delegate_->OnListFile(data); 208 delegate_->OnListFile(data);
221 } 209 }
222 210
223 void DirectoryLister::OnDone(int error) { 211 void DirectoryLister::OnDone(int error) {
224 delegate_->OnListDone(error); 212 delegate_->OnListDone(error);
225 } 213 }
226 214
227 } // namespace net 215 } // namespace net
OLDNEW
« no previous file with comments | « net/base/directory_lister.h ('k') | net/base/directory_lister_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698