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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumera tor.h" 5 #include "chrome/browser/media_gallery/linux/mtp_recursive_device_object_enumera tor.h"
6 6
7 #include "base/sequenced_task_runner.h" 7 #include "base/sequenced_task_runner.h"
8 #include "base/synchronization/waitable_event.h" 8 #include "base/synchronization/waitable_event.h"
9 #include "chrome/browser/media_gallery/linux/mtp_device_object_enumerator.h" 9 #include "chrome/browser/media_gallery/linux/mtp_device_object_enumerator.h"
10 #include "chrome/browser/media_gallery/linux/mtp_read_directory_worker.h" 10 #include "chrome/browser/media_gallery/linux/mtp_read_directory_worker.h"
11 11
12 namespace chrome { 12 namespace chrome {
13 13
14 MTPRecursiveDeviceObjectEnumerator::MTPRecursiveDeviceObjectEnumerator( 14 MTPRecursiveDeviceObjectEnumerator::MTPRecursiveDeviceObjectEnumerator(
15 const std::string& handle, 15 const std::string& handle,
16 base::SequencedTaskRunner* task_runner, 16 base::SequencedTaskRunner* task_runner,
17 const std::vector<MtpFileEntry>& entries, 17 const std::vector<MtpFileEntry>& entries,
18 base::WaitableEvent* task_completed_event, 18 base::WaitableEvent* task_completed_event,
19 base::WaitableEvent* shutdown_event) 19 base::WaitableEvent* shutdown_event)
20 : device_handle_(handle), 20 : device_handle_(handle),
21 media_task_runner_(task_runner), 21 media_task_runner_(task_runner),
22 file_entries_(entries),
23 file_entry_iter_(file_entries_.begin()),
24 on_task_completed_event_(task_completed_event), 22 on_task_completed_event_(task_completed_event),
25 on_shutdown_event_(shutdown_event) { 23 on_shutdown_event_(shutdown_event) {
26 DCHECK(on_task_completed_event_); 24 DCHECK(on_task_completed_event_);
27 DCHECK(on_shutdown_event_); 25 DCHECK(on_shutdown_event_);
26 DCHECK(!entries.empty());
28 current_enumerator_.reset(new MTPDeviceObjectEnumerator(entries)); 27 current_enumerator_.reset(new MTPDeviceObjectEnumerator(entries));
28 empty_enumerator_.reset(
29 new fileapi::FileSystemFileUtil::EmptyFileEnumerator());
29 } 30 }
30 31
31 MTPRecursiveDeviceObjectEnumerator::~MTPRecursiveDeviceObjectEnumerator() { 32 MTPRecursiveDeviceObjectEnumerator::~MTPRecursiveDeviceObjectEnumerator() {
32 } 33 }
33 34
34 FilePath MTPRecursiveDeviceObjectEnumerator::Next() { 35 FilePath MTPRecursiveDeviceObjectEnumerator::Next() {
35 if (on_shutdown_event_->IsSignaled()) { 36 if (on_shutdown_event_->IsSignaled()) {
36 // Process is in shut down mode. 37 // Process is in shut down mode.
37 return FilePath(); 38 return FilePath();
38 } 39 }
39 40
40 FilePath path = current_enumerator_->Next(); 41 if (!current_enumerator_)
41 if (!path.empty())
42 return path;
43
44 // We reached the end.
45 if (file_entry_iter_ == file_entries_.end())
46 return FilePath(); 42 return FilePath();
47 43
48 // Enumerate subdirectories of the next media file entry. 44 if (!current_enumerator_->HasMoreEntries())
49 MtpFileEntry next_file_entry = *file_entry_iter_; 45 current_enumerator_ = GetSubdirectoryEnumerator();
50 ++file_entry_iter_;
51 46
52 // Create a MTPReadDirectoryWorker object to enumerate sub directories. 47 if (IsDirectory()) {
53 scoped_refptr<MTPReadDirectoryWorker> worker(new MTPReadDirectoryWorker( 48 // If the current entry is a directory, add it to
54 device_handle_, next_file_entry.item_id(), media_task_runner_, 49 // |untraversed_directory_entry_ids_| to scan after scanning this directory.
55 on_task_completed_event_, on_shutdown_event_)); 50 DirectoryEntryId dir_entry_id;
56 worker->Run(); 51 if (current_enumerator_->GetEntryId(&dir_entry_id))
57 if (!worker->get_file_entries().empty()) { 52 untraversed_directory_entry_ids_.push(dir_entry_id);
58 current_enumerator_.reset(
59 new MTPDeviceObjectEnumerator(worker->get_file_entries()));
60 } else {
61 current_enumerator_.reset(
62 new fileapi::FileSystemFileUtil::EmptyFileEnumerator());
63 } 53 }
64 return current_enumerator_->Next(); 54 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.
55 current_enumerator_->Next() : empty_enumerator_->Next();
65 } 56 }
66 57
67 int64 MTPRecursiveDeviceObjectEnumerator::Size() { 58 int64 MTPRecursiveDeviceObjectEnumerator::Size() {
68 return current_enumerator_->Size(); 59 return (current_enumerator_.get()) ?
60 current_enumerator_->Size() : empty_enumerator_->Size();
69 } 61 }
70 62
71 bool MTPRecursiveDeviceObjectEnumerator::IsDirectory() { 63 bool MTPRecursiveDeviceObjectEnumerator::IsDirectory() {
72 return current_enumerator_->IsDirectory(); 64 return (current_enumerator_.get()) ?
65 current_enumerator_->IsDirectory() : empty_enumerator_->IsDirectory();
73 } 66 }
74 67
75 base::Time MTPRecursiveDeviceObjectEnumerator::LastModifiedTime() { 68 base::Time MTPRecursiveDeviceObjectEnumerator::LastModifiedTime() {
76 return current_enumerator_->LastModifiedTime(); 69 return (current_enumerator_.get()) ? current_enumerator_->LastModifiedTime() :
70 empty_enumerator_->LastModifiedTime();
71 }
72
73 scoped_ptr<MTPDeviceObjectEnumerator> MTPRecursiveDeviceObjectEnumerator::
74 GetSubdirectoryEnumerator() {
75 while (!untraversed_directory_entry_ids_.empty()) {
76 // Create a MTPReadDirectoryWorker object to enumerate sub directories.
77 DirectoryEntryId dir_entry_id = untraversed_directory_entry_ids_.front();
78 untraversed_directory_entry_ids_.pop();
79 scoped_refptr<MTPReadDirectoryWorker> worker(new MTPReadDirectoryWorker(
80 device_handle_, dir_entry_id, media_task_runner_,
81 on_task_completed_event_, on_shutdown_event_));
82 worker->Run();
83 if (!worker->get_file_entries().empty()) {
84 return scoped_ptr<MTPDeviceObjectEnumerator>(
85 new MTPDeviceObjectEnumerator(worker->get_file_entries()));
86 }
87 }
88
89 // Reached the end. Traversed all the sub directories.
90 return scoped_ptr<MTPDeviceObjectEnumerator>();
77 } 91 }
78 92
79 } // namespace chrome 93 } // namespace chrome
OLDNEW
« 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