1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/drive/debug_info_collector.h" 6 7 #include "base/callback.h" 8 #include "base/logging.h" 9 #include "content/public/browser/browser_thread.h" 10 #include "google_apis/drive/task_util.h" 11 12 using content::BrowserThread; 13 14 namespace drive { 15 16 namespace { 17 18 void IterateFileCacheInternal( 19 internal::ResourceMetadata* metadata, 20 const DebugInfoCollector::IterateFileCacheCallback& iteration_callback) { 21 scoped_ptr<internal::ResourceMetadata::Iterator> it = metadata->GetIterator(); 22 for (; !it->IsAtEnd(); it->Advance()) { 23 if (it->GetValue().file_specific_info().has_cache_state()) { 24 iteration_callback.Run(it->GetID(), 25 it->GetValue().file_specific_info().cache_state()); 26 } 27 } 28 DCHECK(!it->HasError()); 29 } 30 31 // Runs the callback with arguments. 32 void RunGetResourceEntryCallback(const GetResourceEntryCallback& callback, 33 scoped_ptr<ResourceEntry> entry, 34 FileError error) { 35 DCHECK(!callback.is_null()); 36 if (error != FILE_ERROR_OK) 37 entry.reset(); 38 callback.Run(error, entry.Pass()); 39 } 40 41 // Runs the callback with arguments. 42 void RunReadDirectoryCallback( 43 const DebugInfoCollector::ReadDirectoryCallback& callback, 44 scoped_ptr<ResourceEntryVector> entries, 45 FileError error) { 46 DCHECK(!callback.is_null()); 47 if (error != FILE_ERROR_OK) 48 entries.reset(); 49 callback.Run(error, entries.Pass()); 50 } 51 52 } // namespace 53 54 DebugInfoCollector::DebugInfoCollector( 55 internal::ResourceMetadata* metadata, 56 FileSystemInterface* file_system, 57 base::SequencedTaskRunner* blocking_task_runner) 58 : metadata_(metadata), 59 file_system_(file_system), 60 blocking_task_runner_(blocking_task_runner) { 61 DCHECK(metadata_); 62 DCHECK(file_system_); 63 } 64 65 DebugInfoCollector::~DebugInfoCollector() { 66 } 67 68 void DebugInfoCollector::GetResourceEntry( 69 const base::FilePath& file_path, 70 const GetResourceEntryCallback& callback) { 71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 72 DCHECK(!callback.is_null()); 73 74 scoped_ptr<ResourceEntry> entry(new ResourceEntry); 75 ResourceEntry* entry_ptr = entry.get(); 76 base::PostTaskAndReplyWithResult( 77 blocking_task_runner_.get(), 78 FROM_HERE, 79 base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath, 80 base::Unretained(metadata_), 81 file_path, 82 entry_ptr), 83 base::Bind(&RunGetResourceEntryCallback, callback, base::Passed(&entry))); 84 } 85 86 void DebugInfoCollector::ReadDirectory( 87 const base::FilePath& file_path, 88 const ReadDirectoryCallback& callback) { 89 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 90 DCHECK(!callback.is_null()); 91 92 scoped_ptr<ResourceEntryVector> entries(new ResourceEntryVector); 93 ResourceEntryVector* entries_ptr = entries.get(); 94 base::PostTaskAndReplyWithResult( 95 blocking_task_runner_.get(), 96 FROM_HERE, 97 base::Bind(&internal::ResourceMetadata::ReadDirectoryByPath, 98 base::Unretained(metadata_), 99 file_path, 100 entries_ptr), 101 base::Bind(&RunReadDirectoryCallback, callback, base::Passed(&entries))); 102 } 103 104 void DebugInfoCollector::IterateFileCache( 105 const IterateFileCacheCallback& iteration_callback, 106 const base::Closure& completion_callback) { 107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 108 DCHECK(!iteration_callback.is_null()); 109 DCHECK(!completion_callback.is_null()); 110 111 blocking_task_runner_->PostTaskAndReply( 112 FROM_HERE, 113 base::Bind(&IterateFileCacheInternal, 114 metadata_, 115 google_apis::CreateRelayCallback(iteration_callback)), 116 completion_callback); 117 } 118 119 void DebugInfoCollector::GetMetadata( 120 const GetFilesystemMetadataCallback& callback) { 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 122 DCHECK(!callback.is_null()); 123 124 // Currently, this is just a proxy to the FileSystem. 125 // TODO(hidehiko): Move the implementation to here to simplify the 126 // FileSystem's implementation. crbug.com/237088 127 file_system_->GetMetadata(callback); 128 } 129 130 } // namespace drive 131