summaryrefslogtreecommitdiffstats
path: root/components/drive/file_system.cc
diff options
context:
space:
mode:
authoryawano <yawano@chromium.org>2016-01-06 02:11:51 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-06 10:12:57 +0000
commit1409407a93075f8ef9e894455ca75059ee68f99b (patch)
treed1f0ea2463cea5fabb7bfd1f8c9606adcbc190c1 /components/drive/file_system.cc
parent90d029b4bdd8c1727bb2ed859eea8cc60da30594 (diff)
downloadchromium_src-1409407a93075f8ef9e894455ca75059ee68f99b.zip
chromium_src-1409407a93075f8ef9e894455ca75059ee68f99b.tar.gz
chromium_src-1409407a93075f8ef9e894455ca75059ee68f99b.tar.bz2
Compile FileCache related drive components only on Chrome OS.
BUG=533750 TEST=builds pass Review URL: https://codereview.chromium.org/1528323004 Cr-Commit-Position: refs/heads/master@{#367808}
Diffstat (limited to 'components/drive/file_system.cc')
-rw-r--r--components/drive/file_system.cc1062
1 files changed, 0 insertions, 1062 deletions
diff --git a/components/drive/file_system.cc b/components/drive/file_system.cc
deleted file mode 100644
index c42da59..0000000
--- a/components/drive/file_system.cc
+++ /dev/null
@@ -1,1062 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/drive/file_system.h"
-
-#include <stddef.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/prefs/pref_service.h"
-#include "components/drive/change_list_loader.h"
-#include "components/drive/directory_loader.h"
-#include "components/drive/drive.pb.h"
-#include "components/drive/drive_pref_names.h"
-#include "components/drive/file_cache.h"
-#include "components/drive/file_change.h"
-#include "components/drive/file_system/copy_operation.h"
-#include "components/drive/file_system/create_directory_operation.h"
-#include "components/drive/file_system/create_file_operation.h"
-#include "components/drive/file_system/download_operation.h"
-#include "components/drive/file_system/get_file_for_saving_operation.h"
-#include "components/drive/file_system/move_operation.h"
-#include "components/drive/file_system/open_file_operation.h"
-#include "components/drive/file_system/remove_operation.h"
-#include "components/drive/file_system/search_operation.h"
-#include "components/drive/file_system/set_property_operation.h"
-#include "components/drive/file_system/touch_operation.h"
-#include "components/drive/file_system/truncate_operation.h"
-#include "components/drive/file_system_core_util.h"
-#include "components/drive/file_system_observer.h"
-#include "components/drive/job_scheduler.h"
-#include "components/drive/remove_stale_cache_files.h"
-#include "components/drive/resource_entry_conversion.h"
-#include "components/drive/search_metadata.h"
-#include "components/drive/sync_client.h"
-#include "google_apis/drive/drive_api_parser.h"
-
-namespace drive {
-namespace {
-
-// Gets a ResourceEntry from the metadata, and overwrites its file info when the
-// cached file is dirty.
-FileError GetLocallyStoredResourceEntry(
- internal::ResourceMetadata* resource_metadata,
- internal::FileCache* cache,
- const base::FilePath& file_path,
- ResourceEntry* entry) {
- std::string local_id;
- FileError error = resource_metadata->GetIdByPath(file_path, &local_id);
- if (error != FILE_ERROR_OK)
- return error;
-
- error = resource_metadata->GetResourceEntryById(local_id, entry);
- if (error != FILE_ERROR_OK)
- return error;
-
- // For entries that will never be cached, use the original resource entry
- // as is.
- if (!entry->has_file_specific_info() ||
- entry->file_specific_info().is_hosted_document())
- return FILE_ERROR_OK;
-
- // When cache is not found, use the original resource entry as is.
- if (!entry->file_specific_info().has_cache_state())
- return FILE_ERROR_OK;
-
- // When cache is non-dirty and obsolete (old hash), use the original entry.
- if (!entry->file_specific_info().cache_state().is_dirty() &&
- entry->file_specific_info().md5() !=
- entry->file_specific_info().cache_state().md5())
- return FILE_ERROR_OK;
-
- // If there's a valid cache, obtain the file info from the cache file itself.
- base::FilePath local_cache_path;
- error = cache->GetFile(local_id, &local_cache_path);
- if (error != FILE_ERROR_OK)
- return error;
-
- base::File::Info file_info;
- if (!base::GetFileInfo(local_cache_path, &file_info))
- return FILE_ERROR_NOT_FOUND;
-
- entry->mutable_file_info()->set_size(file_info.size);
- return FILE_ERROR_OK;
-}
-
-// Runs the callback with parameters.
-void RunGetResourceEntryCallback(const GetResourceEntryCallback& callback,
- scoped_ptr<ResourceEntry> entry,
- FileError error) {
- DCHECK(!callback.is_null());
-
- if (error != FILE_ERROR_OK)
- entry.reset();
- callback.Run(error, std::move(entry));
-}
-
-// Used to implement Pin().
-FileError PinInternal(internal::ResourceMetadata* resource_metadata,
- internal::FileCache* cache,
- const base::FilePath& file_path,
- std::string* local_id) {
- FileError error = resource_metadata->GetIdByPath(file_path, local_id);
- if (error != FILE_ERROR_OK)
- return error;
-
- ResourceEntry entry;
- error = resource_metadata->GetResourceEntryById(*local_id, &entry);
- if (error != FILE_ERROR_OK)
- return error;
-
- // TODO(hashimoto): Support pinning directories. crbug.com/127831
- if (entry.file_info().is_directory())
- return FILE_ERROR_NOT_A_FILE;
-
- return cache->Pin(*local_id);
-}
-
-// Used to implement Unpin().
-FileError UnpinInternal(internal::ResourceMetadata* resource_metadata,
- internal::FileCache* cache,
- const base::FilePath& file_path,
- std::string* local_id) {
- FileError error = resource_metadata->GetIdByPath(file_path, local_id);
- if (error != FILE_ERROR_OK)
- return error;
-
- return cache->Unpin(*local_id);
-}
-
-// Used to implement MarkCacheFileAsMounted().
-FileError MarkCacheFileAsMountedInternal(
- internal::ResourceMetadata* resource_metadata,
- internal::FileCache* cache,
- const base::FilePath& drive_file_path,
- base::FilePath* cache_file_path) {
- std::string local_id;
- FileError error = resource_metadata->GetIdByPath(drive_file_path, &local_id);
- if (error != FILE_ERROR_OK)
- return error;
-
- return cache->MarkAsMounted(local_id, cache_file_path);
-}
-
-// Runs the callback with arguments.
-void RunMarkMountedCallback(const MarkMountedCallback& callback,
- base::FilePath* cache_file_path,
- FileError error) {
- DCHECK(!callback.is_null());
- callback.Run(error, *cache_file_path);
-}
-
-// Callback for ResourceMetadata::GetLargestChangestamp.
-// |callback| must not be null.
-void OnGetLargestChangestamp(FileSystemMetadata metadata, // Will be modified.
- const GetFilesystemMetadataCallback& callback,
- const int64_t* largest_changestamp,
- FileError error) {
- DCHECK(!callback.is_null());
-
- metadata.largest_changestamp = *largest_changestamp;
- callback.Run(metadata);
-}
-
-// Thin adapter to map GetFileCallback to FileOperationCallback.
-void GetFileCallbackToFileOperationCallbackAdapter(
- const FileOperationCallback& callback,
- FileError error,
- const base::FilePath& unused_file_path,
- scoped_ptr<ResourceEntry> unused_entry) {
- callback.Run(error);
-}
-
-// Clears |resource_metadata| and |cache|.
-FileError ResetOnBlockingPool(internal::ResourceMetadata* resource_metadata,
- internal::FileCache* cache) {
- FileError error = resource_metadata->Reset();
- if (error != FILE_ERROR_OK)
- return error;
- return cache->ClearAll() ? FILE_ERROR_OK : FILE_ERROR_FAILED;
-}
-
-// Part of GetPathFromResourceId().
-// Obtains |file_path| from |resource_id|. The function should be run on the
-// blocking pool.
-FileError GetPathFromResourceIdOnBlockingPool(
- internal::ResourceMetadata* resource_metadata,
- const std::string& resource_id,
- base::FilePath* file_path) {
- std::string local_id;
- const FileError error =
- resource_metadata->GetIdByResourceId(resource_id, &local_id);
- if (error != FILE_ERROR_OK)
- return error;
- return resource_metadata->GetFilePath(local_id, file_path);
-}
-
-// Part of GetPathFromResourceId().
-// Called when GetPathFromResourceIdInBlockingPool is complete.
-void GetPathFromResourceIdAfterGetPath(base::FilePath* file_path,
- const GetFilePathCallback& callback,
- FileError error) {
- callback.Run(error, *file_path);
-}
-
-bool FreeDiskSpaceIfNeededForOnBlockingPool(internal::FileCache* cache,
- int64_t num_bytes) {
- return cache->FreeDiskSpaceIfNeededFor(num_bytes);
-}
-
-uint64_t CalculateEvictableCacheSizeOnBlockingPool(internal::FileCache* cache) {
- return cache->CalculateEvictableCacheSize();
-}
-
-// Excludes hosted documents from the given entries.
-// Used to implement ReadDirectory().
-void FilterHostedDocuments(const ReadDirectoryEntriesCallback& callback,
- scoped_ptr<ResourceEntryVector> entries) {
- DCHECK(!callback.is_null());
-
- if (entries) {
- // TODO(kinaba): Stop handling hide_hosted_docs here. crbug.com/256520.
- scoped_ptr<ResourceEntryVector> filtered(new ResourceEntryVector);
- for (size_t i = 0; i < entries->size(); ++i) {
- if (entries->at(i).file_specific_info().is_hosted_document()) {
- continue;
- }
- filtered->push_back(entries->at(i));
- }
- entries.swap(filtered);
- }
- callback.Run(std::move(entries));
-}
-
-// Adapter for using FileOperationCallback as google_apis::EntryActionCallback.
-void RunFileOperationCallbackAsEntryActionCallback(
- const FileOperationCallback& callback,
- google_apis::DriveApiErrorCode error) {
- callback.Run(GDataToFileError(error));
-}
-
-// Checks if the |entry|'s hash is included in |hashes|.
-bool CheckHashes(const std::set<std::string>& hashes,
- const ResourceEntry& entry) {
- return hashes.find(entry.file_specific_info().md5()) != hashes.end();
-}
-
-// Runs |callback| with |error| and the list of HashAndFilePath obtained from
-// |original_result|.
-void RunSearchByHashesCallback(
- const SearchByHashesCallback& callback,
- FileError error,
- scoped_ptr<MetadataSearchResultVector> original_result) {
- std::vector<HashAndFilePath> result;
- if (error != FILE_ERROR_OK) {
- callback.Run(error, result);
- return;
- }
- for (const auto& search_result : *original_result) {
- HashAndFilePath hash_and_path;
- hash_and_path.hash = search_result.md5;
- hash_and_path.path = search_result.path;
- result.push_back(hash_and_path);
- }
- callback.Run(FILE_ERROR_OK, result);
-}
-
-} // namespace
-
-struct FileSystem::CreateDirectoryParams {
- base::FilePath directory_path;
- bool is_exclusive;
- bool is_recursive;
- FileOperationCallback callback;
-};
-
-FileSystem::FileSystem(PrefService* pref_service,
- EventLogger* logger,
- internal::FileCache* cache,
- JobScheduler* scheduler,
- internal::ResourceMetadata* resource_metadata,
- base::SequencedTaskRunner* blocking_task_runner,
- base::SingleThreadTaskRunner* file_task_runner,
- const base::FilePath& temporary_file_directory)
- : pref_service_(pref_service),
- logger_(logger),
- cache_(cache),
- scheduler_(scheduler),
- resource_metadata_(resource_metadata),
- last_update_check_error_(FILE_ERROR_OK),
- blocking_task_runner_(blocking_task_runner),
- file_task_runner_(file_task_runner),
- temporary_file_directory_(temporary_file_directory),
- weak_ptr_factory_(this) {
- ResetComponents();
-}
-
-FileSystem::~FileSystem() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- directory_loader_->RemoveObserver(this);
- change_list_loader_->RemoveObserver(this);
-}
-
-void FileSystem::Reset(const FileOperationCallback& callback) {
- // Discard the current loader and operation objects and renew them. This is to
- // avoid that changes initiated before the metadata reset is applied after the
- // reset, which may cause an inconsistent state.
- // TODO(kinaba): callbacks held in the subcomponents are discarded. We might
- // want to have a way to abort and flush callbacks in in-flight operations.
- ResetComponents();
-
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&ResetOnBlockingPool, resource_metadata_, cache_),
- callback);
-}
-
-void FileSystem::ResetComponents() {
- file_system::OperationDelegate* delegate = this;
-
- about_resource_loader_.reset(new internal::AboutResourceLoader(scheduler_));
- loader_controller_.reset(new internal::LoaderController);
- change_list_loader_.reset(new internal::ChangeListLoader(
- logger_,
- blocking_task_runner_.get(),
- resource_metadata_,
- scheduler_,
- about_resource_loader_.get(),
- loader_controller_.get()));
- change_list_loader_->AddObserver(this);
- directory_loader_.reset(new internal::DirectoryLoader(
- logger_,
- blocking_task_runner_.get(),
- resource_metadata_,
- scheduler_,
- about_resource_loader_.get(),
- loader_controller_.get()));
- directory_loader_->AddObserver(this);
-
- sync_client_.reset(new internal::SyncClient(blocking_task_runner_.get(),
- delegate,
- scheduler_,
- resource_metadata_,
- cache_,
- loader_controller_.get(),
- temporary_file_directory_));
-
- copy_operation_.reset(
- new file_system::CopyOperation(blocking_task_runner_.get(),
- delegate,
- scheduler_,
- resource_metadata_,
- cache_));
- create_directory_operation_.reset(new file_system::CreateDirectoryOperation(
- blocking_task_runner_.get(), delegate, resource_metadata_));
- create_file_operation_.reset(
- new file_system::CreateFileOperation(blocking_task_runner_.get(),
- delegate,
- resource_metadata_));
- move_operation_.reset(
- new file_system::MoveOperation(blocking_task_runner_.get(),
- delegate,
- resource_metadata_));
- open_file_operation_.reset(
- new file_system::OpenFileOperation(blocking_task_runner_.get(),
- delegate,
- scheduler_,
- resource_metadata_,
- cache_,
- temporary_file_directory_));
- remove_operation_.reset(
- new file_system::RemoveOperation(blocking_task_runner_.get(),
- delegate,
- resource_metadata_,
- cache_));
- touch_operation_.reset(new file_system::TouchOperation(
- blocking_task_runner_.get(), delegate, resource_metadata_));
- truncate_operation_.reset(
- new file_system::TruncateOperation(blocking_task_runner_.get(),
- delegate,
- scheduler_,
- resource_metadata_,
- cache_,
- temporary_file_directory_));
- download_operation_.reset(
- new file_system::DownloadOperation(blocking_task_runner_.get(),
- delegate,
- scheduler_,
- resource_metadata_,
- cache_,
- temporary_file_directory_));
- search_operation_.reset(new file_system::SearchOperation(
- blocking_task_runner_.get(), scheduler_, resource_metadata_,
- loader_controller_.get()));
- get_file_for_saving_operation_.reset(
- new file_system::GetFileForSavingOperation(
- logger_, blocking_task_runner_.get(), file_task_runner_.get(),
- delegate, scheduler_, resource_metadata_, cache_,
- temporary_file_directory_));
- set_property_operation_.reset(new file_system::SetPropertyOperation(
- blocking_task_runner_.get(), delegate, resource_metadata_));
-}
-
-void FileSystem::CheckForUpdates() {
- DCHECK(thread_checker_.CalledOnValidThread());
- DVLOG(1) << "CheckForUpdates";
-
- change_list_loader_->CheckForUpdates(
- base::Bind(&FileSystem::OnUpdateChecked, weak_ptr_factory_.GetWeakPtr()));
-}
-
-void FileSystem::OnUpdateChecked(FileError error) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DVLOG(1) << "CheckForUpdates finished: " << FileErrorToString(error);
- last_update_check_time_ = base::Time::Now();
- last_update_check_error_ = error;
-}
-
-void FileSystem::AddObserver(FileSystemObserver* observer) {
- DCHECK(thread_checker_.CalledOnValidThread());
- observers_.AddObserver(observer);
-}
-
-void FileSystem::RemoveObserver(FileSystemObserver* observer) {
- DCHECK(thread_checker_.CalledOnValidThread());
- observers_.RemoveObserver(observer);
-}
-
-void FileSystem::TransferFileFromLocalToRemote(
- const base::FilePath& local_src_file_path,
- const base::FilePath& remote_dest_file_path,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- copy_operation_->TransferFileFromLocalToRemote(local_src_file_path,
- remote_dest_file_path,
- callback);
-}
-
-void FileSystem::Copy(const base::FilePath& src_file_path,
- const base::FilePath& dest_file_path,
- bool preserve_last_modified,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- copy_operation_->Copy(
- src_file_path, dest_file_path, preserve_last_modified, callback);
-}
-
-void FileSystem::Move(const base::FilePath& src_file_path,
- const base::FilePath& dest_file_path,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- move_operation_->Move(src_file_path, dest_file_path, callback);
-}
-
-void FileSystem::Remove(const base::FilePath& file_path,
- bool is_recursive,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- remove_operation_->Remove(file_path, is_recursive, callback);
-}
-
-void FileSystem::CreateDirectory(
- const base::FilePath& directory_path,
- bool is_exclusive,
- bool is_recursive,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- CreateDirectoryParams params;
- params.directory_path = directory_path;
- params.is_exclusive = is_exclusive;
- params.is_recursive = is_recursive;
- params.callback = callback;
-
- // Ensure its parent directory is loaded to the local metadata.
- ReadDirectory(directory_path.DirName(),
- ReadDirectoryEntriesCallback(),
- base::Bind(&FileSystem::CreateDirectoryAfterRead,
- weak_ptr_factory_.GetWeakPtr(), params));
-}
-
-void FileSystem::CreateDirectoryAfterRead(const CreateDirectoryParams& params,
- FileError error) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!params.callback.is_null());
-
- DVLOG_IF(1, error != FILE_ERROR_OK) << "ReadDirectory failed. "
- << FileErrorToString(error);
-
- create_directory_operation_->CreateDirectory(
- params.directory_path, params.is_exclusive, params.is_recursive,
- params.callback);
-}
-
-void FileSystem::CreateFile(const base::FilePath& file_path,
- bool is_exclusive,
- const std::string& mime_type,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- create_file_operation_->CreateFile(
- file_path, is_exclusive, mime_type, callback);
-}
-
-void FileSystem::TouchFile(const base::FilePath& file_path,
- const base::Time& last_access_time,
- const base::Time& last_modified_time,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- touch_operation_->TouchFile(
- file_path, last_access_time, last_modified_time, callback);
-}
-
-void FileSystem::TruncateFile(const base::FilePath& file_path,
- int64_t length,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- truncate_operation_->Truncate(file_path, length, callback);
-}
-
-void FileSystem::Pin(const base::FilePath& file_path,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- std::string* local_id = new std::string;
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&PinInternal, resource_metadata_, cache_, file_path, local_id),
- base::Bind(&FileSystem::FinishPin,
- weak_ptr_factory_.GetWeakPtr(),
- callback,
- base::Owned(local_id)));
-}
-
-void FileSystem::FinishPin(const FileOperationCallback& callback,
- const std::string* local_id,
- FileError error) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- if (error == FILE_ERROR_OK)
- sync_client_->AddFetchTask(*local_id);
- callback.Run(error);
-}
-
-void FileSystem::Unpin(const base::FilePath& file_path,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- std::string* local_id = new std::string;
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(
- &UnpinInternal, resource_metadata_, cache_, file_path, local_id),
- base::Bind(&FileSystem::FinishUnpin,
- weak_ptr_factory_.GetWeakPtr(),
- callback,
- base::Owned(local_id)));
-}
-
-void FileSystem::FinishUnpin(const FileOperationCallback& callback,
- const std::string* local_id,
- FileError error) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- if (error == FILE_ERROR_OK)
- sync_client_->RemoveFetchTask(*local_id);
- callback.Run(error);
-}
-
-void FileSystem::GetFile(const base::FilePath& file_path,
- const GetFileCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- download_operation_->EnsureFileDownloadedByPath(
- file_path,
- ClientContext(USER_INITIATED),
- GetFileContentInitializedCallback(),
- google_apis::GetContentCallback(),
- callback);
-}
-
-void FileSystem::GetFileForSaving(const base::FilePath& file_path,
- const GetFileCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- get_file_for_saving_operation_->GetFileForSaving(file_path, callback);
-}
-
-base::Closure FileSystem::GetFileContent(
- const base::FilePath& file_path,
- const GetFileContentInitializedCallback& initialized_callback,
- const google_apis::GetContentCallback& get_content_callback,
- const FileOperationCallback& completion_callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!initialized_callback.is_null());
- DCHECK(!get_content_callback.is_null());
- DCHECK(!completion_callback.is_null());
-
- return download_operation_->EnsureFileDownloadedByPath(
- file_path,
- ClientContext(USER_INITIATED),
- initialized_callback,
- get_content_callback,
- base::Bind(&GetFileCallbackToFileOperationCallbackAdapter,
- completion_callback));
-}
-
-void FileSystem::GetResourceEntry(
- const base::FilePath& file_path,
- const GetResourceEntryCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- ReadDirectory(file_path.DirName(),
- ReadDirectoryEntriesCallback(),
- base::Bind(&FileSystem::GetResourceEntryAfterRead,
- weak_ptr_factory_.GetWeakPtr(),
- file_path,
- callback));
-}
-
-void FileSystem::GetResourceEntryAfterRead(
- const base::FilePath& file_path,
- const GetResourceEntryCallback& callback,
- FileError error) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- DVLOG_IF(1, error != FILE_ERROR_OK) << "ReadDirectory failed. "
- << FileErrorToString(error);
-
- scoped_ptr<ResourceEntry> entry(new ResourceEntry);
- ResourceEntry* entry_ptr = entry.get();
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&GetLocallyStoredResourceEntry,
- resource_metadata_,
- cache_,
- file_path,
- entry_ptr),
- base::Bind(&RunGetResourceEntryCallback, callback, base::Passed(&entry)));
-}
-
-void FileSystem::ReadDirectory(
- const base::FilePath& directory_path,
- const ReadDirectoryEntriesCallback& entries_callback_in,
- const FileOperationCallback& completion_callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!completion_callback.is_null());
-
- const bool hide_hosted_docs =
- pref_service_->GetBoolean(prefs::kDisableDriveHostedFiles);
- ReadDirectoryEntriesCallback entries_callback = entries_callback_in;
- if (!entries_callback.is_null() && hide_hosted_docs)
- entries_callback = base::Bind(&FilterHostedDocuments, entries_callback);
-
- directory_loader_->ReadDirectory(
- directory_path, entries_callback, completion_callback);
-
- // Also start loading all of the user's contents.
- change_list_loader_->LoadIfNeeded(
- base::Bind(&util::EmptyFileOperationCallback));
-}
-
-void FileSystem::GetAvailableSpace(
- const GetAvailableSpaceCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- about_resource_loader_->GetAboutResource(
- base::Bind(&FileSystem::OnGetAboutResource,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
-}
-
-void FileSystem::OnGetAboutResource(
- const GetAvailableSpaceCallback& callback,
- google_apis::DriveApiErrorCode status,
- scoped_ptr<google_apis::AboutResource> about_resource) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- FileError error = GDataToFileError(status);
- if (error != FILE_ERROR_OK) {
- callback.Run(error, -1, -1);
- return;
- }
- DCHECK(about_resource);
-
- callback.Run(FILE_ERROR_OK, about_resource->quota_bytes_total(),
- about_resource->quota_bytes_used_aggregate());
-}
-
-void FileSystem::GetShareUrl(const base::FilePath& file_path,
- const GURL& embed_origin,
- const GetShareUrlCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- // Resolve the resource id.
- ResourceEntry* entry = new ResourceEntry;
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath,
- base::Unretained(resource_metadata_),
- file_path,
- entry),
- base::Bind(&FileSystem::GetShareUrlAfterGetResourceEntry,
- weak_ptr_factory_.GetWeakPtr(),
- file_path,
- embed_origin,
- callback,
- base::Owned(entry)));
-}
-
-void FileSystem::GetShareUrlAfterGetResourceEntry(
- const base::FilePath& file_path,
- const GURL& embed_origin,
- const GetShareUrlCallback& callback,
- ResourceEntry* entry,
- FileError error) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- if (error != FILE_ERROR_OK) {
- callback.Run(error, GURL());
- return;
- }
- if (entry->resource_id().empty()) {
- // This entry does not exist on the server. Just return.
- callback.Run(FILE_ERROR_FAILED, GURL());
- return;
- }
-
- scheduler_->GetShareUrl(
- entry->resource_id(),
- embed_origin,
- ClientContext(USER_INITIATED),
- base::Bind(&FileSystem::OnGetResourceEntryForGetShareUrl,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
-}
-
-void FileSystem::OnGetResourceEntryForGetShareUrl(
- const GetShareUrlCallback& callback,
- google_apis::DriveApiErrorCode status,
- const GURL& share_url) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- FileError error = GDataToFileError(status);
- if (error != FILE_ERROR_OK) {
- callback.Run(error, GURL());
- return;
- }
-
- if (share_url.is_empty()) {
- callback.Run(FILE_ERROR_FAILED, GURL());
- return;
- }
-
- callback.Run(FILE_ERROR_OK, share_url);
-}
-
-void FileSystem::Search(const std::string& search_query,
- const GURL& next_link,
- const SearchCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- search_operation_->Search(search_query, next_link, callback);
-}
-
-void FileSystem::SearchMetadata(const std::string& query,
- int options,
- int at_most_num_matches,
- const SearchMetadataCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- // TODO(satorux): Stop handling hide_hosted_docs here. crbug.com/256520.
- if (pref_service_->GetBoolean(prefs::kDisableDriveHostedFiles))
- options |= SEARCH_METADATA_EXCLUDE_HOSTED_DOCUMENTS;
-
- drive::internal::SearchMetadata(
- blocking_task_runner_, resource_metadata_, query,
- base::Bind(&drive::internal::MatchesType, options), at_most_num_matches,
- callback);
-}
-
-void FileSystem::SearchByHashes(const std::set<std::string>& hashes,
- const SearchByHashesCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- drive::internal::SearchMetadata(
- blocking_task_runner_, resource_metadata_,
- /* any file name */ "", base::Bind(&CheckHashes, hashes),
- std::numeric_limits<size_t>::max(),
- base::Bind(&RunSearchByHashesCallback, callback));
-}
-
-void FileSystem::OnFileChangedByOperation(const FileChange& changed_files) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- FOR_EACH_OBSERVER(
- FileSystemObserver, observers_, OnFileChanged(changed_files));
-}
-
-void FileSystem::OnEntryUpdatedByOperation(const ClientContext& context,
- const std::string& local_id) {
- sync_client_->AddUpdateTask(context, local_id);
-}
-
-void FileSystem::OnDriveSyncError(file_system::DriveSyncErrorType type,
- const std::string& local_id) {
- base::FilePath* file_path = new base::FilePath;
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&internal::ResourceMetadata::GetFilePath,
- base::Unretained(resource_metadata_),
- local_id,
- file_path),
- base::Bind(&FileSystem::OnDriveSyncErrorAfterGetFilePath,
- weak_ptr_factory_.GetWeakPtr(),
- type,
- base::Owned(file_path)));
-}
-
-void FileSystem::OnDriveSyncErrorAfterGetFilePath(
- file_system::DriveSyncErrorType type,
- const base::FilePath* file_path,
- FileError error) {
- if (error != FILE_ERROR_OK)
- return;
- FOR_EACH_OBSERVER(FileSystemObserver,
- observers_,
- OnDriveSyncError(type, *file_path));
-}
-
-bool FileSystem::WaitForSyncComplete(const std::string& local_id,
- const FileOperationCallback& callback) {
- return sync_client_->WaitForUpdateTaskToComplete(local_id, callback);
-}
-
-void FileSystem::OnDirectoryReloaded(const base::FilePath& directory_path) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- FOR_EACH_OBSERVER(
- FileSystemObserver, observers_, OnDirectoryChanged(directory_path));
-}
-
-void FileSystem::OnFileChanged(const FileChange& changed_files) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- FOR_EACH_OBSERVER(
- FileSystemObserver, observers_, OnFileChanged(changed_files));
-}
-
-void FileSystem::OnLoadFromServerComplete() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- sync_client_->StartCheckingExistingPinnedFiles();
-}
-
-void FileSystem::OnInitialLoadComplete() {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- blocking_task_runner_->PostTask(FROM_HERE,
- base::Bind(&internal::RemoveStaleCacheFiles,
- cache_,
- resource_metadata_));
- sync_client_->StartProcessingBacklog();
-}
-
-void FileSystem::GetMetadata(
- const GetFilesystemMetadataCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- FileSystemMetadata metadata;
- metadata.refreshing = change_list_loader_->IsRefreshing();
-
- // Metadata related to delta update.
- metadata.last_update_check_time = last_update_check_time_;
- metadata.last_update_check_error = last_update_check_error_;
-
- int64_t* largest_changestamp = new int64_t(0);
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&internal::ResourceMetadata::GetLargestChangestamp,
- base::Unretained(resource_metadata_),
- largest_changestamp),
- base::Bind(&OnGetLargestChangestamp,
- metadata,
- callback,
- base::Owned(largest_changestamp)));
-}
-
-void FileSystem::MarkCacheFileAsMounted(
- const base::FilePath& drive_file_path,
- const MarkMountedCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- base::FilePath* cache_file_path = new base::FilePath;
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&MarkCacheFileAsMountedInternal,
- resource_metadata_,
- cache_,
- drive_file_path,
- cache_file_path),
- base::Bind(
- &RunMarkMountedCallback, callback, base::Owned(cache_file_path)));
-}
-
-void FileSystem::MarkCacheFileAsUnmounted(
- const base::FilePath& cache_file_path,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- if (!cache_->IsUnderFileCacheDirectory(cache_file_path)) {
- callback.Run(FILE_ERROR_FAILED);
- return;
- }
-
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&internal::FileCache::MarkAsUnmounted,
- base::Unretained(cache_),
- cache_file_path),
- callback);
-}
-
-void FileSystem::AddPermission(const base::FilePath& drive_file_path,
- const std::string& email,
- google_apis::drive::PermissionRole role,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- // Resolve the resource id.
- ResourceEntry* const entry = new ResourceEntry;
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath,
- base::Unretained(resource_metadata_),
- drive_file_path,
- entry),
- base::Bind(&FileSystem::AddPermissionAfterGetResourceEntry,
- weak_ptr_factory_.GetWeakPtr(),
- email,
- role,
- callback,
- base::Owned(entry)));
-}
-
-void FileSystem::AddPermissionAfterGetResourceEntry(
- const std::string& email,
- google_apis::drive::PermissionRole role,
- const FileOperationCallback& callback,
- ResourceEntry* entry,
- FileError error) {
- DCHECK(thread_checker_.CalledOnValidThread());
-
- if (error != FILE_ERROR_OK) {
- callback.Run(error);
- return;
- }
-
- scheduler_->AddPermission(
- entry->resource_id(),
- email,
- role,
- base::Bind(&RunFileOperationCallbackAsEntryActionCallback, callback));
-}
-
-void FileSystem::SetProperty(
- const base::FilePath& drive_file_path,
- google_apis::drive::Property::Visibility visibility,
- const std::string& key,
- const std::string& value,
- const FileOperationCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- set_property_operation_->SetProperty(drive_file_path, visibility, key, value,
- callback);
-}
-
-void FileSystem::OpenFile(const base::FilePath& file_path,
- OpenMode open_mode,
- const std::string& mime_type,
- const OpenFileCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- open_file_operation_->OpenFile(file_path, open_mode, mime_type, callback);
-}
-
-void FileSystem::GetPathFromResourceId(const std::string& resource_id,
- const GetFilePathCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
-
- base::FilePath* const file_path = new base::FilePath();
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&GetPathFromResourceIdOnBlockingPool,
- resource_metadata_,
- resource_id,
- file_path),
- base::Bind(&GetPathFromResourceIdAfterGetPath,
- base::Owned(file_path),
- callback));
-}
-
-void FileSystem::FreeDiskSpaceIfNeededFor(
- int64_t num_bytes,
- const FreeDiskSpaceCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(), FROM_HERE,
- base::Bind(&FreeDiskSpaceIfNeededForOnBlockingPool, cache_, num_bytes),
- callback);
-}
-
-void FileSystem::CalculateEvictableCacheSize(
- const EvictableCacheSizeCallback& callback) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!callback.is_null());
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(), FROM_HERE,
- base::Bind(&CalculateEvictableCacheSizeOnBlockingPool, cache_), callback);
-}
-} // namespace drive