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

Unified Diff: chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.cc

Issue 11855005: [Linux, Media Gallery] Fix MTPRecursiveDeviceObjectEnumerator to recursively enumerate all the medi… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed review comments Created 7 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumerator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698