Chromium Code Reviews| 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..98110b0bfc110afa708515b5ebb356da6004ebfa 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_.get()) ? |
|
Lei Zhang
2013/01/14 20:04:41
you can drop the .get() here and below.
kmadhusu
2013/01/14 20:28:29
Done.
|
| + current_enumerator_->Next() : empty_enumerator_->Next(); |
| } |
| int64 MTPRecursiveDeviceObjectEnumerator::Size() { |
| - return current_enumerator_->Size(); |
| + return (current_enumerator_.get()) ? |
| + current_enumerator_->Size() : empty_enumerator_->Size(); |
| } |
| bool MTPRecursiveDeviceObjectEnumerator::IsDirectory() { |
| - return current_enumerator_->IsDirectory(); |
| + return (current_enumerator_.get()) ? |
| + current_enumerator_->IsDirectory() : empty_enumerator_->IsDirectory(); |
| } |
| base::Time MTPRecursiveDeviceObjectEnumerator::LastModifiedTime() { |
| - return current_enumerator_->LastModifiedTime(); |
| + return (current_enumerator_.get()) ? 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 |