1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/debug_info_collector.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/task_util.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using content::BrowserThread; 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace drive { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace { 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void IterateFileCacheInternal( 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) internal::ResourceMetadata* metadata, 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const DebugInfoCollector::IterateFileCacheCallback& iteration_callback) { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<internal::ResourceMetadata::Iterator> it = metadata->GetIterator(); 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (; !it->IsAtEnd(); it->Advance()) { 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (it->GetValue().file_specific_info().has_cache_state()) { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) iteration_callback.Run(it->GetID(), 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it->GetValue().file_specific_info().cache_state()); 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(!it->HasError()); 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Runs the callback with arguments. 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RunGetResourceEntryCallback(const GetResourceEntryCallback& callback, 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ResourceEntry> entry, 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileError error) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!callback.is_null()); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != FILE_ERROR_OK) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entry.reset(); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(error, entry.Pass()); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Runs the callback with arguments. 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RunReadDirectoryCallback( 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DebugInfoCollector::ReadDirectoryCallback& callback, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ResourceEntryVector> entries, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileError error) { 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!callback.is_null()); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != FILE_ERROR_OK) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entries.reset(); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(error, entries.Pass()); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)DebugInfoCollector::DebugInfoCollector( 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) internal::ResourceMetadata* metadata, 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileSystemInterface* file_system, 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::SequencedTaskRunner* blocking_task_runner) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : metadata_(metadata), 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_system_(file_system), 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) blocking_task_runner_(blocking_task_runner) { 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(metadata_); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(file_system_); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DebugInfoCollector::~DebugInfoCollector() { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DebugInfoCollector::GetResourceEntry( 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file_path, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GetResourceEntryCallback& callback) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!callback.is_null()); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ResourceEntry> entry(new ResourceEntry); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry* entry_ptr = entry.get(); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::PostTaskAndReplyWithResult( 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocking_task_runner_, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(metadata_), 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_path, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entry_ptr), 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&RunGetResourceEntryCallback, callback, base::Passed(&entry))); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DebugInfoCollector::ReadDirectory( 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& file_path, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ReadDirectoryCallback& callback) { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!callback.is_null()); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ResourceEntryVector> entries(new ResourceEntryVector); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntryVector* entries_ptr = entries.get(); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::PostTaskAndReplyWithResult( 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocking_task_runner_.get(), 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&internal::ResourceMetadata::ReadDirectoryByPath, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(metadata_), 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_path, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entries_ptr), 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&RunReadDirectoryCallback, callback, base::Passed(&entries))); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DebugInfoCollector::IterateFileCache( 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const IterateFileCacheCallback& iteration_callback, 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Closure& completion_callback) { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!iteration_callback.is_null()); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!completion_callback.is_null()); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) blocking_task_runner_->PostTaskAndReply( 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FROM_HERE, 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&IterateFileCacheInternal, 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metadata_, 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) google_apis::CreateRelayCallback(iteration_callback)), 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) completion_callback); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DebugInfoCollector::GetMetadata( 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GetFilesystemMetadataCallback& callback) { 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!callback.is_null()); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Currently, this is just a proxy to the FileSystem. 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(hidehiko): Move the implementation to here to simplify the 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // FileSystem's implementation. crbug.com/237088 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_system_->GetMetadata(callback); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace drive 131