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
12using content::BrowserThread;
13
14namespace drive {
15
16namespace {
17
18void 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.
32void 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.
42void 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
54DebugInfoCollector::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
65DebugInfoCollector::~DebugInfoCollector() {
66}
67
68void 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
86void 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
104void 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
119void 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