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