Index: net/base/directory_lister.cc |
diff --git a/net/base/directory_lister.cc b/net/base/directory_lister.cc |
deleted file mode 100644 |
index f746f9b2e476576098d8d5ea9c7400c4674c5ecb..0000000000000000000000000000000000000000 |
--- a/net/base/directory_lister.cc |
+++ /dev/null |
@@ -1,229 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/base/directory_lister.h" |
- |
-#include <algorithm> |
- |
-#include "base/bind.h" |
-#include "base/files/file_enumerator.h" |
-#include "base/files/file_util.h" |
-#include "base/i18n/file_util_icu.h" |
-#include "base/logging.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/threading/thread_restrictions.h" |
-#include "base/threading/worker_pool.h" |
-#include "net/base/net_errors.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-bool IsDotDot(const base::FilePath& path) { |
- return FILE_PATH_LITERAL("..") == path.BaseName().value(); |
-} |
- |
-// Comparator for sorting lister results. This uses the locale aware filename |
-// comparison function on the filenames for sorting in the user's locale. |
-// Static. |
-bool CompareAlphaDirsFirst(const DirectoryLister::DirectoryListerData& a, |
- const DirectoryLister::DirectoryListerData& b) { |
- // Parent directory before all else. |
- if (IsDotDot(a.info.GetName())) |
- return true; |
- if (IsDotDot(b.info.GetName())) |
- return false; |
- |
- // Directories before regular files. |
- bool a_is_directory = a.info.IsDirectory(); |
- bool b_is_directory = b.info.IsDirectory(); |
- if (a_is_directory != b_is_directory) |
- return a_is_directory; |
- |
- return base::i18n::LocaleAwareCompareFilenames(a.info.GetName(), |
- b.info.GetName()); |
-} |
- |
-bool CompareDate(const DirectoryLister::DirectoryListerData& a, |
- const DirectoryLister::DirectoryListerData& b) { |
- // Parent directory before all else. |
- if (IsDotDot(a.info.GetName())) |
- return true; |
- if (IsDotDot(b.info.GetName())) |
- return false; |
- |
- // Directories before regular files. |
- bool a_is_directory = a.info.IsDirectory(); |
- bool b_is_directory = b.info.IsDirectory(); |
- if (a_is_directory != b_is_directory) |
- return a_is_directory; |
- return a.info.GetLastModifiedTime() > b.info.GetLastModifiedTime(); |
-} |
- |
-// Comparator for sorting find result by paths. This uses the locale-aware |
-// comparison function on the filenames for sorting in the user's locale. |
-// Static. |
-bool CompareFullPath(const DirectoryLister::DirectoryListerData& a, |
- const DirectoryLister::DirectoryListerData& b) { |
- return base::i18n::LocaleAwareCompareFilenames(a.path, b.path); |
-} |
- |
-void SortData(std::vector<DirectoryLister::DirectoryListerData>* data, |
- DirectoryLister::SortType sort_type) { |
- // Sort the results. See the TODO below (this sort should be removed and we |
- // should do it from JS). |
- if (sort_type == DirectoryLister::DATE) { |
- std::sort(data->begin(), data->end(), CompareDate); |
- } else if (sort_type == DirectoryLister::FULL_PATH) { |
- std::sort(data->begin(), data->end(), CompareFullPath); |
- } else if (sort_type == DirectoryLister::ALPHA_DIRS_FIRST) { |
- std::sort(data->begin(), data->end(), CompareAlphaDirsFirst); |
- } else { |
- DCHECK_EQ(DirectoryLister::NO_SORT, sort_type); |
- } |
-} |
- |
-} // namespace |
- |
-DirectoryLister::DirectoryLister(const base::FilePath& dir, |
- DirectoryListerDelegate* delegate) |
- : delegate_(delegate) { |
- core_ = new Core(dir, false, ALPHA_DIRS_FIRST, this); |
- DCHECK(delegate_); |
- DCHECK(!dir.value().empty()); |
-} |
- |
-DirectoryLister::DirectoryLister(const base::FilePath& dir, |
- bool recursive, |
- SortType sort, |
- DirectoryListerDelegate* delegate) |
- : delegate_(delegate) { |
- core_ = new Core(dir, recursive, sort, this); |
- DCHECK(delegate_); |
- DCHECK(!dir.value().empty()); |
-} |
- |
-DirectoryLister::~DirectoryLister() { |
- Cancel(); |
-} |
- |
-bool DirectoryLister::Start() { |
- return base::WorkerPool::PostTask( |
- FROM_HERE, |
- base::Bind(&Core::Start, core_), |
- true); |
-} |
- |
-void DirectoryLister::Cancel() { |
- core_->CancelOnOriginThread(); |
-} |
- |
-DirectoryLister::Core::Core(const base::FilePath& dir, |
- bool recursive, |
- SortType sort, |
- DirectoryLister* lister) |
- : dir_(dir), |
- recursive_(recursive), |
- sort_(sort), |
- origin_loop_(base::MessageLoopProxy::current()), |
- lister_(lister), |
- cancelled_(0) { |
- DCHECK(lister_); |
-} |
- |
-DirectoryLister::Core::~Core() {} |
- |
-void DirectoryLister::Core::CancelOnOriginThread() { |
- DCHECK(origin_loop_->BelongsToCurrentThread()); |
- |
- base::subtle::NoBarrier_Store(&cancelled_, 1); |
- // Core must not call into |lister_| after cancellation, as the |lister_| may |
- // have been destroyed. Setting |lister_| to NULL ensures any such access will |
- // cause a crash. |
- lister_ = nullptr; |
-} |
- |
-void DirectoryLister::Core::Start() { |
- scoped_ptr<DirectoryList> directory_list(new DirectoryList()); |
- |
- if (!base::DirectoryExists(dir_)) { |
- origin_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&Core::DoneOnOriginThread, this, |
- base::Passed(directory_list.Pass()), ERR_FILE_NOT_FOUND)); |
- return; |
- } |
- |
- int types = base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES; |
- if (!recursive_) |
- types |= base::FileEnumerator::INCLUDE_DOT_DOT; |
- |
- base::FileEnumerator file_enum(dir_, recursive_, types); |
- |
- base::FilePath path; |
- while (!(path = file_enum.Next()).empty()) { |
- // Abort on cancellation. This is purely for performance reasons. |
- // Correctness guarantees are made by checks in DoneOnOriginThread. |
- if (IsCancelled()) |
- return; |
- |
- DirectoryListerData data; |
- data.info = file_enum.GetInfo(); |
- data.path = path; |
- directory_list->push_back(data); |
- |
- /* TODO(brettw) bug 24107: It would be nice to send incremental updates. |
- We gather them all so they can be sorted, but eventually the sorting |
- should be done from JS to give more flexibility in the page. When we do |
- that, we can uncomment this to send incremental updates to the page. |
- |
- const int kFilesPerEvent = 8; |
- if (file_data.size() < kFilesPerEvent) |
- continue; |
- |
- origin_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&DirectoryLister::Core::SendData, file_data)); |
- file_data.clear(); |
- */ |
- } |
- |
- SortData(directory_list.get(), sort_); |
- |
- origin_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&Core::DoneOnOriginThread, this, |
- base::Passed(directory_list.Pass()), OK)); |
-} |
- |
-bool DirectoryLister::Core::IsCancelled() const { |
- return !!base::subtle::NoBarrier_Load(&cancelled_); |
-} |
- |
-void DirectoryLister::Core::DoneOnOriginThread( |
- scoped_ptr<DirectoryList> directory_list, int error) const { |
- DCHECK(origin_loop_->BelongsToCurrentThread()); |
- |
- // Need to check if the operation was before first callback. |
- if (IsCancelled()) |
- return; |
- |
- for (const auto& lister_data : *directory_list) { |
- lister_->OnListFile(lister_data); |
- // Need to check if the operation was cancelled during the callback. |
- if (IsCancelled()) |
- return; |
- } |
- lister_->OnListDone(error); |
-} |
- |
-void DirectoryLister::OnListFile(const DirectoryListerData& data) { |
- delegate_->OnListFile(data); |
-} |
- |
-void DirectoryLister::OnListDone(int error) { |
- delegate_->OnListDone(error); |
-} |
- |
-} // namespace net |