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