1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 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/file_system.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/change_list_loader.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/directory_loader.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_change.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/copy_operation.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/create_directory_operation.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/create_file_operation.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/download_operation.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/get_file_for_saving_operation.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/move_operation.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system/open_file_operation.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/remove_operation.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/search_operation.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/touch_operation.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/drive/file_system/truncate_operation.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_observer.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/job_scheduler.h"
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/remove_stale_cache_files.h"
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/search_metadata.h"
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/sync_client.h"
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/drive_service_interface.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h"
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using content::BrowserThread;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace drive {
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Gets a ResourceEntry from the metadata, and overwrites its file info when the
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// cached file is dirty.
45558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochFileError GetLocallyStoredResourceEntry(
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    internal::ResourceMetadata* resource_metadata,
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    internal::FileCache* cache,
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const base::FilePath& file_path,
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    ResourceEntry* entry) {
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string local_id;
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FileError error = resource_metadata->GetIdByPath(file_path, &local_id);
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (error != FILE_ERROR_OK)
53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return error;
54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  error = resource_metadata->GetResourceEntryById(local_id, entry);
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (error != FILE_ERROR_OK)
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return error;
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // For entries that will never be cached, use the original resource entry
60558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // as is.
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!entry->has_file_specific_info() ||
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      entry->file_specific_info().is_hosted_document())
63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return FILE_ERROR_OK;
64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // When cache is not found, use the original resource entry as is.
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!entry->file_specific_info().has_cache_state())
67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return FILE_ERROR_OK;
68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // When cache is non-dirty and obsolete (old hash), use the original entry.
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!entry->file_specific_info().cache_state().is_dirty() &&
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      entry->file_specific_info().md5() !=
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      entry->file_specific_info().cache_state().md5())
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return FILE_ERROR_OK;
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If there's a valid cache, obtain the file info from the cache file itself.
76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::FilePath local_cache_path;
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  error = cache->GetFile(local_id, &local_cache_path);
78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (error != FILE_ERROR_OK)
79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return error;
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::File::Info file_info;
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!base::GetFileInfo(local_cache_path, &file_info))
83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return FILE_ERROR_NOT_FOUND;
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  entry->mutable_file_info()->set_size(file_info.size);
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return FILE_ERROR_OK;
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Runs the callback with parameters.
90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid RunGetResourceEntryCallback(const GetResourceEntryCallback& callback,
91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 scoped_ptr<ResourceEntry> entry,
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 FileError error) {
93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(!callback.is_null());
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (error != FILE_ERROR_OK)
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    entry.reset();
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  callback.Run(error, entry.Pass());
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Used to implement Pin().
102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileError PinInternal(internal::ResourceMetadata* resource_metadata,
103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                      internal::FileCache* cache,
104424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                      const base::FilePath& file_path,
105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                      std::string* local_id) {
106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FileError error = resource_metadata->GetIdByPath(file_path, local_id);
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (error != FILE_ERROR_OK)
108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return error;
109424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ResourceEntry entry;
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  error = resource_metadata->GetResourceEntryById(*local_id, &entry);
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (error != FILE_ERROR_OK)
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return error;
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // TODO(hashimoto): Support pinning directories. crbug.com/127831
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (entry.file_info().is_directory())
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return FILE_ERROR_NOT_A_FILE;
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return cache->Pin(*local_id);
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Used to implement Unpin().
123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileError UnpinInternal(internal::ResourceMetadata* resource_metadata,
124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        internal::FileCache* cache,
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        const base::FilePath& file_path,
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                        std::string* local_id) {
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FileError error = resource_metadata->GetIdByPath(file_path, local_id);
128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (error != FILE_ERROR_OK)
129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return error;
130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return cache->Unpin(*local_id);
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Used to implement MarkCacheFileAsMounted().
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileError MarkCacheFileAsMountedInternal(
136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    internal::ResourceMetadata* resource_metadata,
137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    internal::FileCache* cache,
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const base::FilePath& drive_file_path,
139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::FilePath* cache_file_path) {
140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string local_id;
141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FileError error = resource_metadata->GetIdByPath(drive_file_path, &local_id);
142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (error != FILE_ERROR_OK)
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return error;
144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return cache->MarkAsMounted(local_id, cache_file_path);
146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Runs the callback with arguments.
149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void RunMarkMountedCallback(const MarkMountedCallback& callback,
150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                            base::FilePath* cache_file_path,
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                            FileError error) {
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(!callback.is_null());
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  callback.Run(error, *cache_file_path);
154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Callback for ResourceMetadata::GetLargestChangestamp.
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |callback| must not be null.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OnGetLargestChangestamp(
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FileSystemMetadata metadata,  // Will be modified.
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetFilesystemMetadataCallback& callback,
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const int64* largest_changestamp,
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FileError error) {
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  metadata.largest_changestamp = *largest_changestamp;
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(metadata);
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Thin adapter to map GetFileCallback to FileOperationCallback.
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GetFileCallbackToFileOperationCallbackAdapter(
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FileOperationCallback& callback,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FileError error,
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& unused_file_path,
175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    scoped_ptr<ResourceEntry> unused_entry) {
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(error);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Clears |resource_metadata| and |cache|.
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FileError ResetOnBlockingPool(internal::ResourceMetadata* resource_metadata,
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                              internal::FileCache* cache) {
182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FileError error = resource_metadata->Reset();
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (error != FILE_ERROR_OK)
184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return error;
185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return cache->ClearAll() ? FILE_ERROR_OK : FILE_ERROR_FAILED;
186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Part of GetPathFromResourceId().
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Obtains |file_path| from |resource_id|. The function should be run on the
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// blocking pool.
191effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochFileError GetPathFromResourceIdOnBlockingPool(
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    internal::ResourceMetadata* resource_metadata,
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const std::string& resource_id,
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::FilePath* file_path) {
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string local_id;
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const FileError error =
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      resource_metadata->GetIdByResourceId(resource_id, &local_id);
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (error != FILE_ERROR_OK)
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error;
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return resource_metadata->GetFilePath(local_id, file_path);
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Part of GetPathFromResourceId().
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Called when GetPathFromResourceIdInBlockingPool is complete.
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid GetPathFromResourceIdAfterGetPath(base::FilePath* file_path,
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       const GetFilePathCallback& callback,
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       FileError error) {
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  callback.Run(error, *file_path);
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Excludes hosted documents from the given entries.
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Used to implement ReadDirectory().
214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid FilterHostedDocuments(const ReadDirectoryEntriesCallback& callback,
215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                           scoped_ptr<ResourceEntryVector> entries) {
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!callback.is_null());
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (entries) {
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // TODO(kinaba): Stop handling hide_hosted_docs here. crbug.com/256520.
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_ptr<ResourceEntryVector> filtered(new ResourceEntryVector);
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    for (size_t i = 0; i < entries->size(); ++i) {
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (entries->at(i).file_specific_info().is_hosted_document()) {
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        continue;
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      }
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      filtered->push_back(entries->at(i));
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    entries.swap(filtered);
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  callback.Run(entries.Pass());
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Adapter for using FileOperationCallback as google_apis::EntryActionCallback.
23423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void RunFileOperationCallbackAsEntryActionCallback(
23523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const FileOperationCallback& callback,
23623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    google_apis::GDataErrorCode error) {
23723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  callback.Run(GDataToFileError(error));
23823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
23923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct FileSystem::CreateDirectoryParams {
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::FilePath directory_path;
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_exclusive;
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_recursive;
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FileOperationCallback callback;
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)FileSystem::FileSystem(
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PrefService* pref_service,
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EventLogger* logger,
252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    internal::FileCache* cache,
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DriveServiceInterface* drive_service,
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    JobScheduler* scheduler,
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    internal::ResourceMetadata* resource_metadata,
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::SequencedTaskRunner* blocking_task_runner,
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& temporary_file_directory)
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : pref_service_(pref_service),
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger_(logger),
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      cache_(cache),
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      drive_service_(drive_service),
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scheduler_(scheduler),
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      resource_metadata_(resource_metadata),
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      last_update_check_error_(FILE_ERROR_OK),
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      blocking_task_runner_(blocking_task_runner),
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      temporary_file_directory_(temporary_file_directory),
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this) {
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
269d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
270d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResetComponents();
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FileSystem::~FileSystem() {
274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  directory_loader_->RemoveObserver(this);
277d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  change_list_loader_->RemoveObserver(this);
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileSystem::Reset(const FileOperationCallback& callback) {
281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Discard the current loader and operation objects and renew them. This is to
282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // avoid that changes initiated before the metadata reset is applied after the
283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // reset, which may cause an inconsistent state.
284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // TODO(kinaba): callbacks held in the subcomponents are discarded. We might
285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // want to have a way to abort and flush callbacks in in-flight operations.
286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResetComponents();
287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
288d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::PostTaskAndReplyWithResult(
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
290d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      FROM_HERE,
291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&ResetOnBlockingPool, resource_metadata_, cache_),
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      callback);
293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
295d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void FileSystem::ResetComponents() {
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  file_system::OperationDelegate* delegate = this;
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  about_resource_loader_.reset(new internal::AboutResourceLoader(scheduler_));
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  loader_controller_.reset(new internal::LoaderController);
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_list_loader_.reset(new internal::ChangeListLoader(
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger_,
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      blocking_task_runner_.get(),
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      resource_metadata_,
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scheduler_,
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      about_resource_loader_.get(),
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      loader_controller_.get()));
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_list_loader_->AddObserver(this);
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  directory_loader_.reset(new internal::DirectoryLoader(
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      logger_,
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      blocking_task_runner_.get(),
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      resource_metadata_,
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scheduler_,
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      about_resource_loader_.get(),
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      loader_controller_.get()));
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  directory_loader_->AddObserver(this);
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_client_.reset(new internal::SyncClient(blocking_task_runner_.get(),
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                              delegate,
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              scheduler_,
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              resource_metadata_,
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              cache_,
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              loader_controller_.get(),
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              temporary_file_directory_));
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  copy_operation_.reset(
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new file_system::CopyOperation(blocking_task_runner_.get(),
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     delegate,
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     scheduler_,
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     resource_metadata_,
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     cache_));
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  create_directory_operation_.reset(new file_system::CreateDirectoryOperation(
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      blocking_task_runner_.get(), delegate, resource_metadata_));
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  create_file_operation_.reset(
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new file_system::CreateFileOperation(blocking_task_runner_.get(),
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                           delegate,
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           resource_metadata_));
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  move_operation_.reset(
3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new file_system::MoveOperation(blocking_task_runner_.get(),
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     delegate,
3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     resource_metadata_));
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  open_file_operation_.reset(
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new file_system::OpenFileOperation(blocking_task_runner_.get(),
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                         delegate,
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                         scheduler_,
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                         resource_metadata_,
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                         cache_,
347a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                                         temporary_file_directory_));
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  remove_operation_.reset(
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new file_system::RemoveOperation(blocking_task_runner_.get(),
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       delegate,
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       resource_metadata_,
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       cache_));
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  touch_operation_.reset(new file_system::TouchOperation(
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      blocking_task_runner_.get(), delegate, resource_metadata_));
355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  truncate_operation_.reset(
356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new file_system::TruncateOperation(blocking_task_runner_.get(),
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                         delegate,
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                         scheduler_,
359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                         resource_metadata_,
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                         cache_,
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                         temporary_file_directory_));
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  download_operation_.reset(
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new file_system::DownloadOperation(blocking_task_runner_.get(),
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                         delegate,
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         scheduler_,
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         resource_metadata_,
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         cache_,
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         temporary_file_directory_));
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  search_operation_.reset(new file_system::SearchOperation(
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      blocking_task_runner_.get(), scheduler_, resource_metadata_,
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      loader_controller_.get()));
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  get_file_for_saving_operation_.reset(
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new file_system::GetFileForSavingOperation(logger_,
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 blocking_task_runner_.get(),
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                 delegate,
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 scheduler_,
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 resource_metadata_,
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 cache_,
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 temporary_file_directory_));
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::CheckForUpdates() {
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DVLOG(1) << "CheckForUpdates";
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  change_list_loader_->CheckForUpdates(
387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&FileSystem::OnUpdateChecked, weak_ptr_factory_.GetWeakPtr()));
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::OnUpdateChecked(FileError error) {
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DVLOG(1) << "CheckForUpdates finished: " << FileErrorToString(error);
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  last_update_check_time_ = base::Time::Now();
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  last_update_check_error_ = error;
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::AddObserver(FileSystemObserver* observer) {
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  observers_.AddObserver(observer);
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::RemoveObserver(FileSystemObserver* observer) {
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  observers_.RemoveObserver(observer);
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::TransferFileFromLocalToRemote(
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& local_src_file_path,
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& remote_dest_file_path,
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FileOperationCallback& callback) {
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!callback.is_null());
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  copy_operation_->TransferFileFromLocalToRemote(local_src_file_path,
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 remote_dest_file_path,
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                 callback);
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::Copy(const base::FilePath& src_file_path,
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const base::FilePath& dest_file_path,
42068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      bool preserve_last_modified,
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const FileOperationCallback& callback) {
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
42468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  copy_operation_->Copy(
42568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      src_file_path, dest_file_path, preserve_last_modified, callback);
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::Move(const base::FilePath& src_file_path,
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const base::FilePath& dest_file_path,
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      const FileOperationCallback& callback) {
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  move_operation_->Move(src_file_path, dest_file_path, callback);
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::Remove(const base::FilePath& file_path,
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        bool is_recursive,
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const FileOperationCallback& callback) {
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  remove_operation_->Remove(file_path, is_recursive, callback);
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::CreateDirectory(
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& directory_path,
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool is_exclusive,
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool is_recursive,
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FileOperationCallback& callback) {
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CreateDirectoryParams params;
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  params.directory_path = directory_path;
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  params.is_exclusive = is_exclusive;
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  params.is_recursive = is_recursive;
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  params.callback = callback;
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Ensure its parent directory is loaded to the local metadata.
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReadDirectory(directory_path.DirName(),
460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                ReadDirectoryEntriesCallback(),
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                base::Bind(&FileSystem::CreateDirectoryAfterRead,
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           weak_ptr_factory_.GetWeakPtr(), params));
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid FileSystem::CreateDirectoryAfterRead(const CreateDirectoryParams& params,
466a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                          FileError error) {
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!params.callback.is_null());
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DVLOG_IF(1, error != FILE_ERROR_OK) << "ReadDirectory failed. "
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      << FileErrorToString(error);
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  create_directory_operation_->CreateDirectory(
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      params.directory_path, params.is_exclusive, params.is_recursive,
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      params.callback);
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::CreateFile(const base::FilePath& file_path,
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            bool is_exclusive,
4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            const std::string& mime_type,
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const FileOperationCallback& callback) {
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  create_file_operation_->CreateFile(
4853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_path, is_exclusive, mime_type, callback);
48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void FileSystem::TouchFile(const base::FilePath& file_path,
48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           const base::Time& last_access_time,
49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           const base::Time& last_modified_time,
49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                           const FileOperationCallback& callback) {
49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!callback.is_null());
494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  touch_operation_->TouchFile(
49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      file_path, last_access_time, last_modified_time, callback);
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FileSystem::TruncateFile(const base::FilePath& file_path,
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              int64 length,
500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              const FileOperationCallback& callback) {
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!callback.is_null());
503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  truncate_operation_->Truncate(file_path, length, callback);
504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::Pin(const base::FilePath& file_path,
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     const FileOperationCallback& callback) {
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
511424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string* local_id = new std::string;
512424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::PostTaskAndReplyWithResult(
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
514424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FROM_HERE,
515d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&PinInternal, resource_metadata_, cache_, file_path, local_id),
516424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&FileSystem::FinishPin,
517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr(),
518424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 callback,
519424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 base::Owned(local_id)));
5207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FileSystem::FinishPin(const FileOperationCallback& callback,
523424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                           const std::string* local_id,
5247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           FileError error) {
5257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!callback.is_null());
5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (error == FILE_ERROR_OK)
529424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    sync_client_->AddFetchTask(*local_id);
5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  callback.Run(error);
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::Unpin(const base::FilePath& file_path,
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const FileOperationCallback& callback) {
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
538424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string* local_id = new std::string;
539424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::PostTaskAndReplyWithResult(
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
541424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FROM_HERE,
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &UnpinInternal, resource_metadata_, cache_, file_path, local_id),
544424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&FileSystem::FinishUnpin,
545a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr(),
546424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 callback,
547424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 base::Owned(local_id)));
5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void FileSystem::FinishUnpin(const FileOperationCallback& callback,
551424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                             const std::string* local_id,
5527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             FileError error) {
5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!callback.is_null());
5557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (error == FILE_ERROR_OK)
557424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    sync_client_->RemoveFetchTask(*local_id);
5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  callback.Run(error);
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FileSystem::GetFile(const base::FilePath& file_path,
562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                         const GetFileCallback& callback) {
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  download_operation_->EnsureFileDownloadedByPath(
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      file_path,
56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ClientContext(USER_INITIATED),
56990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetFileContentInitializedCallback(),
57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      google_apis::GetContentCallback(),
57190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      callback);
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FileSystem::GetFileForSaving(const base::FilePath& file_path,
575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  const GetFileCallback& callback) {
576ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
577ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback.is_null());
578ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
579ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  get_file_for_saving_operation_->GetFileForSaving(file_path, callback);
580ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
581ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::Closure FileSystem::GetFileContent(
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& file_path,
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetFileContentInitializedCallback& initialized_callback,
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const google_apis::GetContentCallback& get_content_callback,
586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FileOperationCallback& completion_callback) {
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!initialized_callback.is_null());
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!get_content_callback.is_null());
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!completion_callback.is_null());
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
592effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return download_operation_->EnsureFileDownloadedByPath(
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      file_path,
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ClientContext(USER_INITIATED),
59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      initialized_callback,
59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      get_content_callback,
59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&GetFileCallbackToFileOperationCallbackAdapter,
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 completion_callback));
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FileSystem::GetResourceEntry(
602a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const base::FilePath& file_path,
603a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const GetResourceEntryCallback& callback) {
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReadDirectory(file_path.DirName(),
608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                ReadDirectoryEntriesCallback(),
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                base::Bind(&FileSystem::GetResourceEntryAfterRead,
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           weak_ptr_factory_.GetWeakPtr(),
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           file_path,
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           callback));
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FileSystem::GetResourceEntryAfterRead(
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& file_path,
617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const GetResourceEntryCallback& callback,
618a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    FileError error) {
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DVLOG_IF(1, error != FILE_ERROR_OK) << "ReadDirectory failed. "
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      << FileErrorToString(error);
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
625558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<ResourceEntry> entry(new ResourceEntry);
626558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ResourceEntry* entry_ptr = entry.get();
627558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::PostTaskAndReplyWithResult(
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
629558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      FROM_HERE,
630558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::Bind(&GetLocallyStoredResourceEntry,
631558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 resource_metadata_,
632558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 cache_,
633558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 file_path,
634558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 entry_ptr),
6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&RunGetResourceEntryCallback, callback, base::Passed(&entry)));
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FileSystem::ReadDirectory(
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& directory_path,
640a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const ReadDirectoryEntriesCallback& entries_callback_in,
641a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const FileOperationCallback& completion_callback) {
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
643a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(!completion_callback.is_null());
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const bool hide_hosted_docs =
64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      pref_service_->GetBoolean(prefs::kDisableDriveHostedFiles);
647a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ReadDirectoryEntriesCallback entries_callback = entries_callback_in;
648a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!entries_callback.is_null() && hide_hosted_docs)
649a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    entries_callback = base::Bind(&FilterHostedDocuments, entries_callback);
650424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  directory_loader_->ReadDirectory(
652a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      directory_path, entries_callback, completion_callback);
653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Also start loading all of the user's contents.
655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  change_list_loader_->LoadIfNeeded(
656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Bind(&util::EmptyFileOperationCallback));
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::GetAvailableSpace(
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetAvailableSpaceCallback& callback) {
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  about_resource_loader_->GetAboutResource(
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&FileSystem::OnGetAboutResource,
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr(),
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 callback));
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::OnGetAboutResource(
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetAvailableSpaceCallback& callback,
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    google_apis::GDataErrorCode status,
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<google_apis::AboutResource> about_resource) {
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
677a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  FileError error = GDataToFileError(status);
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (error != FILE_ERROR_OK) {
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    callback.Run(error, -1, -1);
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(about_resource);
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(FILE_ERROR_OK,
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               about_resource->quota_bytes_total(),
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               about_resource->quota_bytes_used());
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FileSystem::GetShareUrl(const base::FilePath& file_path,
690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             const GURL& embed_origin,
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             const GetShareUrlCallback& callback) {
692bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
693bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(!callback.is_null());
694bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
695bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // Resolve the resource id.
696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ResourceEntry* entry = new ResourceEntry;
697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::PostTaskAndReplyWithResult(
698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      blocking_task_runner_.get(),
699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      FROM_HERE,
700a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath,
701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 base::Unretained(resource_metadata_),
702a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 file_path,
703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 entry),
704bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&FileSystem::GetShareUrlAfterGetResourceEntry,
705bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 weak_ptr_factory_.GetWeakPtr(),
706bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 file_path,
707bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 embed_origin,
708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 callback,
709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 base::Owned(entry)));
710bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
711bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
712bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid FileSystem::GetShareUrlAfterGetResourceEntry(
713bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const base::FilePath& file_path,
714bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const GURL& embed_origin,
715bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const GetShareUrlCallback& callback,
716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ResourceEntry* entry,
717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    FileError error) {
718bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
719bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(!callback.is_null());
720bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
721bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (error != FILE_ERROR_OK) {
722bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    callback.Run(error, GURL());
723bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
724bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (entry->resource_id().empty()) {
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This entry does not exist on the server. Just return.
727bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    callback.Run(FILE_ERROR_FAILED, GURL());
728bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
729bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
730bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
731bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  scheduler_->GetShareUrl(
732bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      entry->resource_id(),
733bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      embed_origin,
734bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      ClientContext(USER_INITIATED),
735bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&FileSystem::OnGetResourceEntryForGetShareUrl,
736bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 weak_ptr_factory_.GetWeakPtr(),
737bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 callback));
738bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
739bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
740bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid FileSystem::OnGetResourceEntryForGetShareUrl(
741bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const GetShareUrlCallback& callback,
742bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    google_apis::GDataErrorCode status,
743bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const GURL& share_url) {
744bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
745bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(!callback.is_null());
746bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  FileError error = GDataToFileError(status);
748bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (error != FILE_ERROR_OK) {
749bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    callback.Run(error, GURL());
750bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
751bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
752bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
753bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (share_url.is_empty()) {
754bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    callback.Run(FILE_ERROR_FAILED, GURL());
755bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
756bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
757bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
758bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  callback.Run(FILE_ERROR_OK, share_url);
759bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
760bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::Search(const std::string& search_query,
76258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const GURL& next_link,
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const SearchCallback& callback) {
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
76658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  search_operation_->Search(search_query, next_link, callback);
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::SearchMetadata(const std::string& query,
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                int options,
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                int at_most_num_matches,
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const SearchMetadataCallback& callback) {
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(satorux): Stop handling hide_hosted_docs here. crbug.com/256520.
77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (pref_service_->GetBoolean(prefs::kDisableDriveHostedFiles))
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    options |= SEARCH_METADATA_EXCLUDE_HOSTED_DOCUMENTS;
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  drive::internal::SearchMetadata(blocking_task_runner_,
78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  resource_metadata_,
78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  query,
78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  options,
78390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  at_most_num_matches,
78490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  callback);
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
787116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid FileSystem::OnFileChangedByOperation(const FileChange& changed_files) {
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FOR_EACH_OBSERVER(
791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FileSystemObserver, observers_, OnFileChanged(changed_files));
792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileSystem::OnEntryUpdatedByOperation(const std::string& local_id) {
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_client_->AddUpdateTask(ClientContext(USER_INITIATED), local_id);
796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileSystem::OnDriveSyncError(file_system::DriveSyncErrorType type,
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const std::string& local_id) {
800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath* file_path = new base::FilePath;
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::PostTaskAndReplyWithResult(
8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&internal::ResourceMetadata::GetFilePath,
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(resource_metadata_),
806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 local_id,
807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 file_path),
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&FileSystem::OnDriveSyncErrorAfterGetFilePath,
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr(),
810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 type,
811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Owned(file_path)));
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileSystem::OnDriveSyncErrorAfterGetFilePath(
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file_system::DriveSyncErrorType type,
816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::FilePath* file_path,
817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FileError error) {
818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (error != FILE_ERROR_OK)
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FOR_EACH_OBSERVER(FileSystemObserver,
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    observers_,
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    OnDriveSyncError(type, *file_path));
8237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool FileSystem::WaitForSyncComplete(const std::string& local_id,
8265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     const FileOperationCallback& callback) {
8275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return sync_client_->WaitForUpdateTaskToComplete(local_id, callback);
8285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
830116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid FileSystem::OnDirectoryReloaded(const base::FilePath& directory_path) {
831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FOR_EACH_OBSERVER(
834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FileSystemObserver, observers_, OnDirectoryChanged(directory_path));
835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
837116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid FileSystem::OnFileChanged(const FileChange& changed_files) {
838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FOR_EACH_OBSERVER(
841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FileSystemObserver, observers_, OnFileChanged(changed_files));
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void FileSystem::OnLoadFromServerComplete() {
845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  sync_client_->StartCheckingExistingPinnedFiles();
848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void FileSystem::OnInitialLoadComplete() {
851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  blocking_task_runner_->PostTask(FROM_HERE,
85490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                  base::Bind(&internal::RemoveStaleCacheFiles,
85590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                             cache_,
85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                             resource_metadata_));
857868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  sync_client_->StartProcessingBacklog();
858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::GetMetadata(
861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GetFilesystemMetadataCallback& callback) {
862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FileSystemMetadata metadata;
866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  metadata.refreshing = change_list_loader_->IsRefreshing();
867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Metadata related to delta update.
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  metadata.last_update_check_time = last_update_check_time_;
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  metadata.last_update_check_error = last_update_check_error_;
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64* largest_changestamp = new int64(0);
873d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::PostTaskAndReplyWithResult(
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
875d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      FROM_HERE,
876d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&internal::ResourceMetadata::GetLargestChangestamp,
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(resource_metadata_),
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 largest_changestamp),
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&OnGetLargestChangestamp,
8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 metadata,
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 callback,
882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::Owned(largest_changestamp)));
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
885c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::MarkCacheFileAsMounted(
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& drive_file_path,
887a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    const MarkMountedCallback& callback) {
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
891424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::FilePath* cache_file_path = new base::FilePath;
892424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::PostTaskAndReplyWithResult(
8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
894424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      FROM_HERE,
895424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&MarkCacheFileAsMountedInternal,
896424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 resource_metadata_,
897424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 cache_,
898424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 drive_file_path,
899424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 cache_file_path),
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(
9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &RunMarkMountedCallback, callback, base::Owned(cache_file_path)));
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::MarkCacheFileAsUnmounted(
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& cache_file_path,
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FileOperationCallback& callback) {
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!cache_->IsUnderFileCacheDirectory(cache_file_path)) {
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    callback.Run(FILE_ERROR_FAILED);
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::PostTaskAndReplyWithResult(
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      FROM_HERE,
918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&internal::FileCache::MarkAsUnmounted,
919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Unretained(cache_),
920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 cache_file_path),
921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      callback);
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void FileSystem::AddPermission(const base::FilePath& drive_file_path,
92523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               const std::string& email,
92623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               google_apis::drive::PermissionRole role,
92723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                               const FileOperationCallback& callback) {
92823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
92923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(!callback.is_null());
93023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
93123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Resolve the resource id.
93223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ResourceEntry* const entry = new ResourceEntry;
93323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::PostTaskAndReplyWithResult(
93423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      blocking_task_runner_.get(),
93523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      FROM_HERE,
93623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath,
93723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 base::Unretained(resource_metadata_),
93823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 drive_file_path,
93923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 entry),
94023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::Bind(&FileSystem::AddPermissionAfterGetResourceEntry,
94123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr(),
94223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 email,
94323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 role,
94423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 callback,
94523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 base::Owned(entry)));
94623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
94723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
94823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void FileSystem::AddPermissionAfterGetResourceEntry(
94923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& email,
95023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    google_apis::drive::PermissionRole role,
95123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const FileOperationCallback& callback,
95223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ResourceEntry* entry,
95323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    FileError error) {
95423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
95523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
95623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (error != FILE_ERROR_OK) {
95723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    callback.Run(error);
95823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
95923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
96023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
96123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scheduler_->AddPermission(
96223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      entry->resource_id(),
96323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      email,
96423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      role,
96523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::Bind(&RunFileOperationCallbackAsEntryActionCallback, callback));
96623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
96723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileSystem::OpenFile(const base::FilePath& file_path,
9697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          OpenMode open_mode,
9703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                          const std::string& mime_type,
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          const OpenFileCallback& callback) {
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback.is_null());
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  open_file_operation_->OpenFile(file_path, open_mode, mime_type, callback);
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
978effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid FileSystem::GetPathFromResourceId(const std::string& resource_id,
979effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       const GetFilePathCallback& callback) {
980effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
981effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(!callback.is_null());
982effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
983effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::FilePath* const file_path = new base::FilePath();
984effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::PostTaskAndReplyWithResult(
9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      blocking_task_runner_.get(),
986effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FROM_HERE,
987effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&GetPathFromResourceIdOnBlockingPool,
988effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 resource_metadata_,
989effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 resource_id,
990effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 file_path),
991effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&GetPathFromResourceIdAfterGetPath,
992effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 base::Owned(file_path),
993effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 callback));
994effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace drive
996