| Index: chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.cc
|
| diff --git a/chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.cc b/chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.cc
|
| index 2b5ceebea0759b0b0c5e0735df5953bbf83c3388..41584bb51fde27c00ed77fe5d790d60203d79b1e 100644
|
| --- a/chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.cc
|
| +++ b/chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.cc
|
| @@ -19,13 +19,14 @@ MTPRecursiveDeviceObjectEnumerator::MTPRecursiveDeviceObjectEnumerator(
|
| base::WaitableEvent* shutdown_event)
|
| : device_handle_(handle),
|
| media_task_runner_(task_runner),
|
| - file_entries_(entries),
|
| - file_entry_iter_(file_entries_.begin()),
|
| on_task_completed_event_(task_completed_event),
|
| on_shutdown_event_(shutdown_event) {
|
| DCHECK(on_task_completed_event_);
|
| DCHECK(on_shutdown_event_);
|
| + DCHECK(!entries.empty());
|
| current_enumerator_.reset(new MTPDeviceObjectEnumerator(entries));
|
| + empty_enumerator_.reset(
|
| + new fileapi::FileSystemFileUtil::EmptyFileEnumerator());
|
| }
|
|
|
| MTPRecursiveDeviceObjectEnumerator::~MTPRecursiveDeviceObjectEnumerator() {
|
| @@ -37,43 +38,56 @@ FilePath MTPRecursiveDeviceObjectEnumerator::Next() {
|
| return FilePath();
|
| }
|
|
|
| - FilePath path = current_enumerator_->Next();
|
| - if (!path.empty())
|
| - return path;
|
| -
|
| - // We reached the end.
|
| - if (file_entry_iter_ == file_entries_.end())
|
| + if (!current_enumerator_)
|
| return FilePath();
|
|
|
| - // Enumerate subdirectories of the next media file entry.
|
| - MtpFileEntry next_file_entry = *file_entry_iter_;
|
| - ++file_entry_iter_;
|
| + if (!current_enumerator_->HasMoreEntries())
|
| + current_enumerator_ = GetSubdirectoryEnumerator();
|
|
|
| - // Create a MTPReadDirectoryWorker object to enumerate sub directories.
|
| - scoped_refptr<MTPReadDirectoryWorker> worker(new MTPReadDirectoryWorker(
|
| - device_handle_, next_file_entry.item_id(), media_task_runner_,
|
| - on_task_completed_event_, on_shutdown_event_));
|
| - worker->Run();
|
| - if (!worker->get_file_entries().empty()) {
|
| - current_enumerator_.reset(
|
| - new MTPDeviceObjectEnumerator(worker->get_file_entries()));
|
| - } else {
|
| - current_enumerator_.reset(
|
| - new fileapi::FileSystemFileUtil::EmptyFileEnumerator());
|
| + if (IsDirectory()) {
|
| + // If the current entry is a directory, add it to
|
| + // |untraversed_directory_entry_ids_| to scan after scanning this directory.
|
| + DirectoryEntryId dir_entry_id;
|
| + if (current_enumerator_->GetEntryId(&dir_entry_id))
|
| + untraversed_directory_entry_ids_.push(dir_entry_id);
|
| }
|
| - return current_enumerator_->Next();
|
| + return current_enumerator_ ?
|
| + current_enumerator_->Next() : empty_enumerator_->Next();
|
| }
|
|
|
| int64 MTPRecursiveDeviceObjectEnumerator::Size() {
|
| - return current_enumerator_->Size();
|
| + return current_enumerator_ ?
|
| + current_enumerator_->Size() : empty_enumerator_->Size();
|
| }
|
|
|
| bool MTPRecursiveDeviceObjectEnumerator::IsDirectory() {
|
| - return current_enumerator_->IsDirectory();
|
| + return current_enumerator_ ?
|
| + current_enumerator_->IsDirectory() : empty_enumerator_->IsDirectory();
|
| }
|
|
|
| base::Time MTPRecursiveDeviceObjectEnumerator::LastModifiedTime() {
|
| - return current_enumerator_->LastModifiedTime();
|
| + return current_enumerator_ ? current_enumerator_->LastModifiedTime() :
|
| + empty_enumerator_->LastModifiedTime();
|
| +}
|
| +
|
| +scoped_ptr<MTPDeviceObjectEnumerator> MTPRecursiveDeviceObjectEnumerator::
|
| +GetSubdirectoryEnumerator() {
|
| + while (!untraversed_directory_entry_ids_.empty()) {
|
| + // Create a MTPReadDirectoryWorker object to enumerate sub directories.
|
| + DirectoryEntryId dir_entry_id = untraversed_directory_entry_ids_.front();
|
| + untraversed_directory_entry_ids_.pop();
|
| + scoped_refptr<MTPReadDirectoryWorker> worker(new MTPReadDirectoryWorker(
|
| + device_handle_, dir_entry_id, media_task_runner_,
|
| + on_task_completed_event_, on_shutdown_event_));
|
| + worker->Run();
|
| + if (!worker->get_file_entries().empty()) {
|
| + return scoped_ptr<MTPDeviceObjectEnumerator>(
|
| + new MTPDeviceObjectEnumerator(worker->get_file_entries()));
|
| + }
|
| + }
|
| +
|
| + // Reached the end. Traversed all the sub directories.
|
| + return scoped_ptr<MTPDeviceObjectEnumerator>();
|
| }
|
|
|
| } // namespace chrome
|
|
|