OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "base/file_util.h" | 5 #include "base/file_util.h" |
6 | 6 |
7 #include <dirent.h> | 7 #include <dirent.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <fcntl.h> | 9 #include <fcntl.h> |
10 #include <fnmatch.h> | 10 #include <fnmatch.h> |
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 // potentially only matching against items in the top-most directory. | 634 // potentially only matching against items in the top-most directory. |
635 // Do the same here. | 635 // Do the same here. |
636 if (pattern.size() == 0) | 636 if (pattern.size() == 0) |
637 pattern_ = FilePath::StringType(); | 637 pattern_ = FilePath::StringType(); |
638 pending_paths_.push(root_path); | 638 pending_paths_.push(root_path); |
639 } | 639 } |
640 | 640 |
641 FileEnumerator::~FileEnumerator() { | 641 FileEnumerator::~FileEnumerator() { |
642 } | 642 } |
643 | 643 |
644 void FileEnumerator::GetFindInfo(FindInfo* info) { | |
645 DCHECK(info); | |
646 | |
647 if (current_directory_entry_ >= directory_entries_.size()) | |
648 return; | |
649 | |
650 DirectoryEntryInfo* cur_entry = &directory_entries_[current_directory_entry_]; | |
651 memcpy(&(info->stat), &(cur_entry->stat), sizeof(info->stat)); | |
652 info->filename.assign(cur_entry->filename.value()); | |
653 } | |
654 | |
655 bool FileEnumerator::IsDirectory(const FindInfo& info) { | |
656 return S_ISDIR(info.stat.st_mode); | |
657 } | |
658 | |
659 // static | |
660 FilePath FileEnumerator::GetFilename(const FindInfo& find_info) { | |
661 return FilePath(find_info.filename); | |
662 } | |
663 | |
664 FilePath FileEnumerator::Next() { | 644 FilePath FileEnumerator::Next() { |
665 ++current_directory_entry_; | 645 ++current_directory_entry_; |
666 | 646 |
667 // While we've exhausted the entries in the current directory, do the next | 647 // While we've exhausted the entries in the current directory, do the next |
668 while (current_directory_entry_ >= directory_entries_.size()) { | 648 while (current_directory_entry_ >= directory_entries_.size()) { |
669 if (pending_paths_.empty()) | 649 if (pending_paths_.empty()) |
670 return FilePath(); | 650 return FilePath(); |
671 | 651 |
672 root_path_ = pending_paths_.top(); | 652 root_path_ = pending_paths_.top(); |
673 root_path_ = root_path_.StripTrailingSeparators(); | 653 root_path_ = root_path_.StripTrailingSeparators(); |
(...skipping 21 matching lines...) Expand all Loading... |
695 if ((S_ISDIR(i->stat.st_mode) && (file_type_ & DIRECTORIES)) || | 675 if ((S_ISDIR(i->stat.st_mode) && (file_type_ & DIRECTORIES)) || |
696 (!S_ISDIR(i->stat.st_mode) && (file_type_ & FILES))) | 676 (!S_ISDIR(i->stat.st_mode) && (file_type_ & FILES))) |
697 directory_entries_.push_back(*i); | 677 directory_entries_.push_back(*i); |
698 } | 678 } |
699 } | 679 } |
700 | 680 |
701 return root_path_.Append(directory_entries_[current_directory_entry_ | 681 return root_path_.Append(directory_entries_[current_directory_entry_ |
702 ].filename); | 682 ].filename); |
703 } | 683 } |
704 | 684 |
| 685 void FileEnumerator::GetFindInfo(FindInfo* info) { |
| 686 DCHECK(info); |
| 687 |
| 688 if (current_directory_entry_ >= directory_entries_.size()) |
| 689 return; |
| 690 |
| 691 DirectoryEntryInfo* cur_entry = &directory_entries_[current_directory_entry_]; |
| 692 memcpy(&(info->stat), &(cur_entry->stat), sizeof(info->stat)); |
| 693 info->filename.assign(cur_entry->filename.value()); |
| 694 } |
| 695 |
| 696 bool FileEnumerator::IsDirectory(const FindInfo& info) { |
| 697 return S_ISDIR(info.stat.st_mode); |
| 698 } |
| 699 |
| 700 // static |
| 701 FilePath FileEnumerator::GetFilename(const FindInfo& find_info) { |
| 702 return FilePath(find_info.filename); |
| 703 } |
| 704 |
705 bool FileEnumerator::ReadDirectory(std::vector<DirectoryEntryInfo>* entries, | 705 bool FileEnumerator::ReadDirectory(std::vector<DirectoryEntryInfo>* entries, |
706 const FilePath& source, bool show_links) { | 706 const FilePath& source, bool show_links) { |
707 base::ThreadRestrictions::AssertIOAllowed(); | 707 base::ThreadRestrictions::AssertIOAllowed(); |
708 DIR* dir = opendir(source.value().c_str()); | 708 DIR* dir = opendir(source.value().c_str()); |
709 if (!dir) | 709 if (!dir) |
710 return false; | 710 return false; |
711 | 711 |
712 #if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \ | 712 #if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \ |
713 !defined(OS_OPENBSD) && !defined(OS_SOLARIS) | 713 !defined(OS_OPENBSD) && !defined(OS_SOLARIS) |
714 #error Port warning: depending on the definition of struct dirent, \ | 714 #error Port warning: depending on the definition of struct dirent, \ |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 if (HANDLE_EINTR(close(infile)) < 0) | 881 if (HANDLE_EINTR(close(infile)) < 0) |
882 result = false; | 882 result = false; |
883 if (HANDLE_EINTR(close(outfile)) < 0) | 883 if (HANDLE_EINTR(close(outfile)) < 0) |
884 result = false; | 884 result = false; |
885 | 885 |
886 return result; | 886 return result; |
887 } | 887 } |
888 #endif // defined(OS_MACOSX) | 888 #endif // defined(OS_MACOSX) |
889 | 889 |
890 } // namespace file_util | 890 } // namespace file_util |
OLD | NEW |