blob: a0a418196ec7bcce06fd8bf471c43a2e493241e2 [file] [log] [blame] [edit]
// 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.
#ifndef CHROME_BROWSER_CHROMEOS_GDATA_DRIVE_FILE_SYSTEM_H_
#define CHROME_BROWSER_CHROMEOS_GDATA_DRIVE_FILE_SYSTEM_H_
#include <string>
#include <vector>
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/timer.h"
#include "chrome/browser/chromeos/gdata/drive_cache.h"
#include "chrome/browser/chromeos/gdata/drive_file_system_interface.h"
#include "chrome/browser/chromeos/gdata/gdata_wapi_feed_loader.h"
#include "chrome/browser/google_apis/gdata_errorcode.h"
#include "content/public/browser/notification_observer.h"
class PrefChangeRegistrar;
namespace base {
struct PlatformFileInfo;
class SequencedTaskRunner;
}
namespace gdata {
class DriveFunctionRemove;
class DriveResourceMetadata;
class DriveServiceInterface;
class DriveUploaderInterface;
class DriveWebAppsRegistryInterface;
// The production implementation of DriveFileSystemInterface.
class DriveFileSystem : public DriveFileSystemInterface,
public GDataWapiFeedLoader::Observer,
public content::NotificationObserver {
public:
DriveFileSystem(Profile* profile,
DriveCache* cache,
DriveServiceInterface* drive_service,
DriveUploaderInterface* uploader,
DriveWebAppsRegistryInterface* webapps_registry,
base::SequencedTaskRunner* blocking_task_runner);
virtual ~DriveFileSystem();
// DriveFileSystem overrides.
virtual void Initialize() OVERRIDE;
virtual void AddObserver(
DriveFileSystemInterface::Observer* observer) OVERRIDE;
virtual void RemoveObserver(
DriveFileSystemInterface::Observer* observer) OVERRIDE;
virtual void StartInitialFeedFetch() OVERRIDE;
virtual void StartUpdates() OVERRIDE;
virtual void StopUpdates() OVERRIDE;
virtual void NotifyFileSystemMounted() OVERRIDE;
virtual void NotifyFileSystemToBeUnmounted() OVERRIDE;
virtual void CheckForUpdates() OVERRIDE;
virtual void GetEntryInfoByResourceId(
const std::string& resource_id,
const GetEntryInfoWithFilePathCallback& callback) OVERRIDE;
virtual void Search(const std::string& search_query,
const GURL& next_feed,
const SearchCallback& callback) OVERRIDE;
virtual void TransferFileFromRemoteToLocal(
const FilePath& remote_src_file_path,
const FilePath& local_dest_file_path,
const FileOperationCallback& callback) OVERRIDE;
virtual void TransferFileFromLocalToRemote(
const FilePath& local_src_file_path,
const FilePath& remote_dest_file_path,
const FileOperationCallback& callback) OVERRIDE;
virtual void OpenFile(const FilePath& file_path,
const OpenFileCallback& callback) OVERRIDE;
virtual void CloseFile(const FilePath& file_path,
const FileOperationCallback& callback) OVERRIDE;
virtual void Copy(const FilePath& src_file_path,
const FilePath& dest_file_path,
const FileOperationCallback& callback) OVERRIDE;
virtual void Move(const FilePath& src_file_path,
const FilePath& dest_file_path,
const FileOperationCallback& callback) OVERRIDE;
virtual void Remove(const FilePath& file_path,
bool is_recursive,
const FileOperationCallback& callback) OVERRIDE;
virtual void CreateDirectory(const FilePath& directory_path,
bool is_exclusive,
bool is_recursive,
const FileOperationCallback& callback) OVERRIDE;
virtual void CreateFile(const FilePath& file_path,
bool is_exclusive,
const FileOperationCallback& callback) OVERRIDE;
virtual void GetFileByPath(
const FilePath& file_path,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback) OVERRIDE;
virtual void GetFileByResourceId(
const std::string& resource_id,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback) OVERRIDE;
virtual void UpdateFileByResourceId(
const std::string& resource_id,
const FileOperationCallback& callback) OVERRIDE;
virtual void GetEntryInfoByPath(
const FilePath& file_path,
const GetEntryInfoCallback& callback) OVERRIDE;
virtual void ReadDirectoryByPath(
const FilePath& directory_path,
const ReadDirectoryWithSettingCallback& callback) OVERRIDE;
virtual void RequestDirectoryRefresh(
const FilePath& directory_path) OVERRIDE;
virtual void GetAvailableSpace(
const GetAvailableSpaceCallback& callback) OVERRIDE;
virtual void AddUploadedFile(UploadMode upload_mode,
const FilePath& directory_path,
scoped_ptr<DocumentEntry> doc_entry,
const FilePath& file_content_path,
DriveCache::FileOperationType cache_operation,
const base::Closure& callback) OVERRIDE;
virtual void UpdateEntryData(const std::string& resource_id,
const std::string& md5,
scoped_ptr<DocumentEntry> entry,
const FilePath& file_content_path,
const base::Closure& callback) OVERRIDE;
// content::NotificationObserver implementation.
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// GDataWapiFeedLoader::Observer overrides.
// Used to propagate events from GDataWapiFeedLoader.
virtual void OnDirectoryChanged(const FilePath& directory_path) OVERRIDE;
virtual void OnDocumentFeedFetched(int num_accumulated_entries) OVERRIDE;
virtual void OnFeedFromServerLoaded() OVERRIDE;
DriveResourceMetadata* ResourceMetadata() { return resource_metadata_.get(); }
// Used in tests to load the root feed from the cache.
void LoadRootFeedFromCacheForTesting();
// Used in tests to update the file system from |feed_list|.
// See also the comment at GDataWapiFeedLoader::UpdateFromFeed().
DriveFileError UpdateFromFeedForTesting(
const ScopedVector<DocumentFeed>& feed_list,
int64 start_changestamp,
int64 root_feed_changestamp);
private:
friend class DriveFileSystemTest;
FRIEND_TEST_ALL_PREFIXES(DriveFileSystemTest,
FindFirstMissingParentDirectory);
// Defines possible search results of FindFirstMissingParentDirectory().
enum FindFirstMissingParentDirectoryError {
// Target directory found, it's not a directory.
FIND_FIRST_FOUND_INVALID,
// Found missing directory segment while searching for given directory.
FIND_FIRST_FOUND_MISSING,
// Found target directory, it already exists.
FIND_FIRST_DIRECTORY_ALREADY_PRESENT,
};
// The result struct for FindFirstMissingParentDirectory().
struct FindFirstMissingParentDirectoryResult {
FindFirstMissingParentDirectoryResult();
~FindFirstMissingParentDirectoryResult();
// Initializes the struct.
void Init(FindFirstMissingParentDirectoryError error,
FilePath first_missing_parent_path,
GURL last_dir_content_url);
FindFirstMissingParentDirectoryError error;
// The following two fields are provided when |error| is set to
// FIND_FIRST_FOUND_MISSING. Otherwise, the two fields are undefined.
// Suppose "drive/foo/bar/baz/qux" is being checked, and only
// "drive/foo/bar" is present, "drive/foo/bar/baz" is the first missing
// parent path.
FilePath first_missing_parent_path;
// The content URL of the last found directory. In the above example, the
// content URL of "drive/foo/bar". Note that this value is empty if the
// last found directory is the root of Drive.
GURL last_dir_content_url;
};
// Callback for FindFirstMissingParentDirectory().
typedef base::Callback<void(
const FindFirstMissingParentDirectoryResult& result)>
FindFirstMissingParentDirectoryCallback;
// Params for FindFirstMissingParentDirectory().
struct FindFirstMissingParentDirectoryParams;
// Defines set of parameters passes to intermediate callbacks during
// execution of CreateDirectory() method.
struct CreateDirectoryParams {
CreateDirectoryParams(const FilePath& created_directory_path,
const FilePath& target_directory_path,
bool is_exclusive,
bool is_recursive,
const FileOperationCallback& callback);
~CreateDirectoryParams();
const FilePath created_directory_path;
const FilePath target_directory_path;
const bool is_exclusive;
const bool is_recursive;
FileOperationCallback callback;
};
// Defines set of parameters passed to an intermediate callback
// OnGetFileCompleteForOpen, during execution of OpenFile() method.
struct GetFileCompleteForOpenParams;
// Defines set of parameters passed to intermediate callbacks during
// execution of GetFileByPath() method.
struct GetFileFromCacheParams;
// Struct used for StartFileUploadOnUIThread().
struct StartFileUploadParams;
// Struct used for AddUploadedFile.
struct AddUploadedFileParams;
// Struct used by UpdateEntryData.
struct UpdateEntryParams;
// Callback passed to |LoadFeedFromServer| from |Search| method.
// |callback| is that should be run with data received from
// |LoadFeedFromServer|. |callback| must not be null.
// |params| params used for getting document feed for content search.
// |error| error code returned by |LoadFeedFromServer|.
void OnSearch(const SearchCallback& callback,
scoped_ptr<LoadFeedParams> params,
DriveFileError error);
// Callback for DriveResourceMetadata::RefreshFile, from OnSearch.
// Adds |drive_file_path| to |results|. When |entry_proto| is not present in
// the local file system snapshot, it is not added to |results|. Instead,
// CheckForUpdates is called. Runs |callback| with |results|.
// |callback| may be null.
void AddToSearchResults(
std::vector<SearchResultInfo>* results,
const base::Closure& callback,
DriveFileError error,
const FilePath& drive_file_path,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of TransferFileFromLocalToRemote(). Called after
// GetEntryInfoByPath() is complete.
void TransferFileFromLocalToRemoteAfterGetEntryInfo(
const FilePath& local_src_file_path,
const FilePath& remote_dest_file_path,
const FileOperationCallback& callback,
DriveFileError error,
scoped_ptr<DriveEntryProto> entry_proto);
// Initiates transfer of |local_file_path| with |resource_id| to
// |remote_dest_file_path|. |local_file_path| must be a file from the local
// file system, |remote_dest_file_path| is the virtual destination path within
// Drive file system. If |resource_id| is a non-empty string, the transfer is
// handled by CopyDocumentToDirectory. Otherwise, the transfer is handled by
// TransferRegularFile.
//
// Must be called from *UI* thread. |callback| is run on the calling thread.
// |callback| must not be null.
void TransferFileForResourceId(const FilePath& local_file_path,
const FilePath& remote_dest_file_path,
const FileOperationCallback& callback,
std::string* resource_id);
// Initiates transfer of |local_file_path| to |remote_dest_file_path|.
// |local_file_path| must be a regular file (i.e. not a hosted document) from
// the local file system, |remote_dest_file_path| is the virtual destination
// path within Drive file system.
//
// Must be called from *UI* thread. |callback| is run on the calling thread.
void TransferRegularFile(const FilePath& local_file_path,
const FilePath& remote_dest_file_path,
const FileOperationCallback& callback);
// Invoked during the process of CreateFile.
// First, FindEntryByPathAsyncOnUIThread is called and the result is returned
// to OnGetEntryInfoForCreateFile. By using the information, CreateFile deals
// with the cases when an entry already existed at the path. If there was no
// entry, a new empty file is uploaded, and when it finishes
// DidUploadForCreateBrandNewFile does the final clean up.
// |callback| must not be null.
void OnGetEntryInfoForCreateFile(const FilePath& file_path,
bool is_exclusive,
const FileOperationCallback& callback,
DriveFileError result,
scoped_ptr<DriveEntryProto> entry_proto);
void DoUploadForCreateBrandNewFile(const FilePath& remote_path,
FilePath* local_path,
const FileOperationCallback& callback);
void DidUploadForCreateBrandNewFile(const FilePath& local_path,
const FileOperationCallback& callback,
DriveFileError result);
// Invoked upon completion of GetEntryInfoByPath initiated by
// GetFileByPath. It then continues to invoke GetResolvedFileByPath.
// |get_file_callback| must not be null.
// |get_content_callback| may be null.
void OnGetEntryInfoCompleteForGetFileByPath(
const FilePath& file_path,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback,
DriveFileError error,
scoped_ptr<DriveEntryProto> file_info);
// Invoked upon completion of GetEntryInfoByPath initiated by OpenFile.
// It then continues to invoke GetResolvedFileByPath and proceeds to
// OnGetFileCompleteForOpenFile.
void OnGetEntryInfoCompleteForOpenFile(
const FilePath& file_path,
const OpenFileCallback& callback,
DriveFileError error,
scoped_ptr<DriveEntryProto> file_info);
// Invoked at the last step of OpenFile. It removes |file_path| from the
// current set of opened files if |result| is an error, and then invokes the
// |callback| function.
void OnOpenFileFinished(const FilePath& file_path,
const OpenFileCallback& callback,
DriveFileError result,
const FilePath& cache_file_path);
// Invoked during the process of CloseFile. What is done here is as follows:
// 1) Gets resource_id and md5 of the entry at |file_path|.
// 2) Commits the modification to the cache system.
// 3) Removes the |file_path| from the remembered set of opened files.
// 4) Invokes the user-supplied |callback|.
// |callback| must not be null.
void CloseFileOnUIThreadAfterGetEntryInfo(
const FilePath& file_path,
const FileOperationCallback& callback,
DriveFileError error,
scoped_ptr<DriveEntryProto> entry_proto);
void CloseFileOnUIThreadAfterCommitDirtyInCache(
const FileOperationCallback& callback,
DriveFileError error,
const std::string& resource_id,
const std::string& md5);
void CloseFileOnUIThreadFinalize(const FilePath& file_path,
const FileOperationCallback& callback,
DriveFileError result);
// Invoked upon completion of GetFileByPath initiated by Copy. If
// GetFileByPath reports no error, calls TransferRegularFile to transfer
// |local_file_path| to |remote_dest_file_path|.
//
// Can be called from UI thread. |callback| is run on the calling thread.
void OnGetFileCompleteForCopy(const FilePath& remote_dest_file_path,
const FileOperationCallback& callback,
DriveFileError error,
const FilePath& local_file_path,
const std::string& unused_mime_type,
DriveFileType file_type);
// Invoked upon completion of GetFileByPath initiated by
// TransferFileFromRemoteToLocal. If GetFileByPath reports no error, calls
// CopyLocalFileOnBlockingPool to copy |local_file_path| to
// |local_dest_file_path|.
//
// Can be called from UI thread. |callback| is run on the calling thread.
// |callback| must not be null.
void OnGetFileCompleteForTransferFile(const FilePath& local_dest_file_path,
const FileOperationCallback& callback,
DriveFileError error,
const FilePath& local_file_path,
const std::string& unused_mime_type,
DriveFileType file_type);
// Invoked upon completion of GetFileByPath initiated by OpenFile. If
// GetFileByPath is successful, calls MarkDirtyInCache to mark the cache
// file as dirty for the file identified by |file_info.resource_id| and
// |file_info.md5|.
//
// Can be called from UI thread. |callback| is run on the calling thread.
void OnGetFileCompleteForOpenFile(
const OpenFileCallback& callback,
const GetFileCompleteForOpenParams& file_info,
DriveFileError error,
const FilePath& file_path,
const std::string& mime_type,
DriveFileType file_type);
// Copies a document with |resource_id| to the directory at |dir_path|
// and names the copied document as |new_name|.
//
// Can be called from UI thread. |callback| is run on the calling thread.
// |callback| must not be null.
void CopyDocumentToDirectory(const FilePath& dir_path,
const std::string& resource_id,
const FilePath::StringType& new_name,
const FileOperationCallback& callback);
// Renames a file or directory at |file_path| to |new_name| in the same
// directory. |callback| will receive the new file path if the operation is
// successful. If the new name already exists in the same directory, the file
// name is uniquified by adding a parenthesized serial number like
// "foo (2).txt"
//
// Can be called from UI thread. |callback| is run on the calling thread.
// |callback| must not be null.
void Rename(const FilePath& file_path,
const FilePath::StringType& new_name,
const FileMoveCallback& callback);
// Part of Rename(). Called after GetEntryInfoByPath() is complete.
// |callback| must not be null.
void RenameAfterGetEntryInfo(const FilePath& file_path,
const FilePath::StringType& new_name,
const FileMoveCallback& callback,
DriveFileError error,
scoped_ptr<DriveEntryProto> entry_proto);
// Moves a file or directory at |file_path| in the root directory to
// another directory at |dir_path|. This function does nothing if
// |dir_path| points to the root directory.
//
// Can be called from UI thread. |callback| is run on the calling thread.
// |callback| must not be null.
void MoveEntryFromRootDirectory(const FilePath& directory_path,
const FileOperationCallback& callback,
DriveFileError error,
const FilePath& file_path);
// Part of MoveEntryFromRootDirectory(). Called after
// GetEntryInfoPairByPaths() is complete. |callback| must not be null.
void MoveEntryFromRootDirectoryAfterGetEntryInfoPair(
const FileOperationCallback& callback,
scoped_ptr<EntryInfoPairResult> result);
// Part of RemoveEntryFromNonRootDirectory(). Called after
// GetEntryInfoPairByPaths() is complete. |callback| must not be null.
void RemoveEntryFromNonRootDirectoryAfterEntryInfoPair(
const FileMoveCallback& callback,
scoped_ptr<EntryInfoPairResult> result);
// Removes a file or directory at |file_path| from the current directory if
// it's not in the root directory. This essentially moves an entry to the
// root directory on the server side.
//
// Can be called from UI thread. |callback| is run on the calling thread.
// |callback| must not be null.
void RemoveEntryFromNonRootDirectory(const FileMoveCallback& callback,
DriveFileError error,
const FilePath& file_path);
// A pass-through callback used for bridging from
// FileMoveCallback to FileOperationCallback.
void OnFilePathUpdated(const FileOperationCallback& cllback,
DriveFileError error,
const FilePath& file_path);
// Invoked upon completion of MarkDirtyInCache initiated by OpenFile. Invokes
// |callback| with |cache_file_path|, which is the path of the cache file
// ready for modification.
//
// Must be called on UI thread.
void OnMarkDirtyInCacheCompleteForOpenFile(const OpenFileCallback& callback,
DriveFileError error,
const FilePath& cache_file_path);
// Callback for handling document copy attempt.
// |callback| must not be null.
void OnCopyDocumentCompleted(const FilePath& dir_path,
const FileOperationCallback& callback,
GDataErrorCode status,
scoped_ptr<base::Value> data);
// Callback for handling account metadata fetch.
void OnGetAvailableSpace(const GetAvailableSpaceCallback& callback,
GDataErrorCode status,
scoped_ptr<base::Value> data);
// Callback for handling Drive V2 about resource fetch.
void OnGetAboutResource(const GetAvailableSpaceCallback& callback,
GDataErrorCode status,
scoped_ptr<base::Value> data);
// Callback for handling directory create requests. Adds the directory
// represented by |created_entry| to the local filesystem.
void AddNewDirectory(const CreateDirectoryParams& params,
GDataErrorCode status,
scoped_ptr<base::Value> created_entry);
// Callback for DriveResourceMetadata::AddEntryToDirectory. Continues the
// recursive creation of a directory path by calling CreateDirectory again.
void ContinueCreateDirectory(
const CreateDirectoryParams& params,
DriveFileError error,
const FilePath& moved_directory_path);
// Callback for handling file downloading requests.
void OnFileDownloaded(const GetFileFromCacheParams& params,
GDataErrorCode status,
const GURL& content_url,
const FilePath& downloaded_file_path);
// Unpins file if cache entry is pinned.
void UnpinIfPinned(const std::string& resource_id,
const std::string& md5,
bool success,
const DriveCacheEntry& cache_entry);
// Similar to OnFileDownloaded() but takes |has_enough_space| so we report
// an error in case we don't have enough disk space.
void OnFileDownloadedAndSpaceChecked(const GetFileFromCacheParams& params,
GDataErrorCode status,
const GURL& content_url,
const FilePath& downloaded_file_path,
bool* has_enough_space);
// Callback for handling internal StoreToCache() calls after downloading
// file content.
void OnDownloadStoredToCache(DriveFileError error,
const std::string& resource_id,
const std::string& md5);
// Callback for handling resource rename attempt. Renames a file or
// directory at |file_path| on the client side.
// |callback| must not be null.
void RenameEntryLocally(const FilePath& file_path,
const FilePath::StringType& new_name,
const FileMoveCallback& callback,
GDataErrorCode status,
const GURL& document_url);
// Moves entry specified by |file_path| to the directory specified by
// |dir_path| and calls |callback| asynchronously.
// |callback| must not be null.
void MoveEntryToDirectory(const FilePath& file_path,
const FilePath& directory_path,
const FileMoveCallback& callback,
GDataErrorCode status,
const GURL& document_url);
// Callback when an entry is moved to another directory on the client side.
// Notifies the directory change and runs |callback|.
// |callback| must not be null.
void NotifyAndRunFileMoveCallback(
const FileMoveCallback& callback,
DriveFileError error,
const FilePath& moved_file_path);
// Callback when an entry is moved to another directory on the client side.
// Notifies the directory change and runs |callback|.
// |callback| must not be null.
void NotifyAndRunFileOperationCallback(
const FileOperationCallback& callback,
DriveFileError error,
const FilePath& moved_file_path);
// FileMoveCallback for directory changes. Notifies of directory changes,
// and runs |callback| with |error|. |callback| may be null.
void OnDirectoryChangeFileMoveCallback(
const FileOperationCallback& callback,
DriveFileError error,
const FilePath& directory_path);
// Continues to add an uploaded file after existing entry has been deleted.
void ContinueAddUploadedFile(scoped_ptr<AddUploadedFileParams> params,
DriveFileError error,
const FilePath& file_path);
// Adds the uploaded file to the cache.
void AddUploadedFileToCache(scoped_ptr<AddUploadedFileParams> params,
DriveFileError error,
const FilePath& file_path);
// Finds the first missing parent directory of |directory_path|.
// |callback| must not be null.
void FindFirstMissingParentDirectory(
const FilePath& directory_path,
const FindFirstMissingParentDirectoryCallback& callback);
// Helper function for FindFirstMissingParentDirectory, for recursive search
// for first missing parent.
void FindFirstMissingParentDirectoryInternal(
scoped_ptr<FindFirstMissingParentDirectoryParams> params);
// Callback for ResourceMetadata::GetEntryInfoByPath from
// FindFirstMissingParentDirectory.
void ContinueFindFirstMissingParentDirectory(
scoped_ptr<FindFirstMissingParentDirectoryParams> params,
DriveFileError error,
scoped_ptr<DriveEntryProto> entry_proto);
// Callback for handling results of ReloadFeedFromServerIfNeeded() initiated
// from CheckForUpdates(). This callback checks whether feed is successfully
// reloaded, and in case of failure, restores the content origin of the root
// directory.
void OnUpdateChecked(ContentOrigin initial_origin,
DriveFileError error);
// Notifies that the initial load is finished and runs |callback|.
// |callback| must not be null.
void NotifyInitialLoadFinishedAndRun(const FileOperationCallback& callback,
DriveFileError error);
// Helper function that completes bookkeeping tasks related to
// completed file transfer.
void OnTransferCompleted(const FileOperationCallback& callback,
DriveFileError error,
const FilePath& drive_path,
const FilePath& file_path,
scoped_ptr<DocumentEntry> document_entry);
// Kicks off file upload once it receives |file_size| and |content_type|.
void StartFileUploadOnUIThread(const StartFileUploadParams& params,
DriveFileError* error,
int64* file_size,
std::string* content_type);
// Part of StartFileUploadOnUIThread(). Called after GetEntryInfoByPath()
// is complete.
void StartFileUploadOnUIThreadAfterGetEntryInfo(
const StartFileUploadParams& params,
int64 file_size,
std::string content_type,
DriveFileError error,
scoped_ptr<DriveEntryProto> entry_proto);
// Cache intermediate callbacks, that run on calling thread, for above cache
// tasks that were run on blocking pool.
// Helper function for internally handling responses from
// GetFileFromCacheByResourceIdAndMd5() calls during processing of
// GetFileByPath() request.
void OnGetFileFromCache(const GetFileFromCacheParams& params,
DriveFileError error,
const FilePath& cache_file_path);
// Callback for |drive_service_->GetDocumentEntry|.
// It is called before file download. If GetDocumentEntry was successful,
// file download procedure is started for the file. The file is downloaded
// from the content url extracted from the fetched metadata.
void OnGetDocumentEntry(const GetFileFromCacheParams& params,
GDataErrorCode status,
scoped_ptr<base::Value> data);
// Check available space using file size from the fetched metadata. Called
// from OnGetDocumentEntry after RefreshFile is complete.
void CheckForSpaceBeforeDownload(
const GetFileFromCacheParams& params,
int64 file_size,
const GURL& content_url,
DriveFileError error,
const FilePath& drive_file_path,
scoped_ptr<DriveEntryProto> entry_proto);
// Starts downloading a file if we have enough disk space indicated by
// |has_enough_space|.
void StartDownloadFileIfEnoughSpace(const GetFileFromCacheParams& params,
const GURL& content_url,
const FilePath& cache_file_path,
bool* has_enough_space);
// Changes state of hosted documents visibility, triggers directory refresh.
void SetHideHostedDocuments(bool hide);
// Initializes preference change observer.
void InitializePreferenceObserver();
// Part of GetEntryInfoByPathOnUIThread()
// 1) Called when the feed is loaded.
// 2) Called when an entry is found.
// |callback| must not be null.
void GetEntryInfoByPathOnUIThreadAfterLoad(
const FilePath& file_path,
const GetEntryInfoCallback& callback,
DriveFileError error);
void GetEntryInfoByPathOnUIThreadAfterGetEntry(
const GetEntryInfoCallback& callback,
DriveFileError error,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of ReadDirectoryByPathOnUIThread()
// 1) Called when the feed is loaded.
// 2) Called when an entry is found.
// |callback| must not be null.
void ReadDirectoryByPathOnUIThreadAfterLoad(
const FilePath& directory_path,
const ReadDirectoryWithSettingCallback& callback,
DriveFileError error);
void ReadDirectoryByPathOnUIThreadAfterRead(
const ReadDirectoryWithSettingCallback& callback,
DriveFileError error,
scoped_ptr<DriveEntryProtoVector> entries);
// Loads the feed from the cache or the server if not yet loaded. Runs
// |callback| upon the completion with the error code.
// |callback| must not be null.
void LoadFeedIfNeeded(const FileOperationCallback& callback);
// Gets the file at |file_path| from the cache (if found in the cache),
// or the server (if not found in the cache) after the file info is
// already resolved with GetEntryInfoByPath() or GetEntryInfoByResourceId().
// |get_file_callback| must not be null.
// |get_content_callback| may be null.
void GetResolvedFileByPath(
const FilePath& file_path,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of UpdateFileByResourceId(). Called when
// DriveDirectory::GetEntryInfoByResourceId() is complete.
// |callback| must not be null.
void UpdateFileByEntryInfo(
const FileOperationCallback& callback,
DriveFileError error,
const FilePath& drive_file_path,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of UpdateFileByResourceId().
// Called when DriveCache::GetFileOnUIThread() is completed for
// UpdateFileByResourceId().
// |callback| must not be null.
void OnGetFileCompleteForUpdateFile(const FileOperationCallback& callback,
const FilePath& drive_file_path,
scoped_ptr<DriveEntryProto> entry_proto,
DriveFileError error,
const FilePath& cache_file_path);
// Part of UpdateFileByResourceId().
// Callback for getting the size of the cache file in the blocking pool.
// |callback| must not be null.
void OnGetFileSizeCompleteForUpdateFile(
const FileOperationCallback& callback,
const FilePath& drive_file_path,
scoped_ptr<DriveEntryProto> entry_proto,
const FilePath& cache_file_path,
DriveFileError* error,
int64* file_size);
// Part of UpdateFileByResourceId().
// Called when DriveUploader::UploadUpdatedFile() is completed for
// UpdateFileByResourceId().
// |callback| must not be null.
void OnUpdatedFileUploaded(const FileOperationCallback& callback,
DriveFileError error,
const FilePath& gdata_path,
const FilePath& file_path,
scoped_ptr<DocumentEntry> document_entry);
// The following functions are used to forward calls to asynchronous public
// member functions to UI thread.
void SearchAsyncOnUIThread(const std::string& search_query,
const GURL& next_feed,
const SearchCallback& callback);
void OpenFileOnUIThread(const FilePath& file_path,
const OpenFileCallback& callback);
void CloseFileOnUIThread(const FilePath& file_path,
const FileOperationCallback& callback);
void CopyOnUIThread(const FilePath& src_file_path,
const FilePath& dest_file_path,
const FileOperationCallback& callback);
void MoveOnUIThread(const FilePath& src_file_path,
const FilePath& dest_file_path,
const FileOperationCallback& callback);
void RemoveOnUIThread(const FilePath& file_path,
bool is_recursive,
const FileOperationCallback& callback);
void CreateDirectoryOnUIThread(const FilePath& directory_path,
bool is_exclusive,
bool is_recursive,
const FileOperationCallback& callback);
void CreateFileOnUIThread(const FilePath& file_path,
bool is_exclusive,
const FileOperationCallback& callback);
void GetFileByPathOnUIThread(
const FilePath& file_path,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback);
void GetFileByResourceIdOnUIThread(
const std::string& resource_id,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback);
void UpdateFileByResourceIdOnUIThread(const std::string& resource_id,
const FileOperationCallback& callback);
void GetEntryInfoByPathOnUIThread(const FilePath& file_path,
const GetEntryInfoCallback& callback);
void GetEntryInfoByResourceIdOnUIThread(
const std::string& resource_id,
const GetEntryInfoWithFilePathCallback& callback);
void ReadDirectoryByPathOnUIThread(
const FilePath& file_path,
const ReadDirectoryWithSettingCallback& callback);
void RequestDirectoryRefreshOnUIThread(const FilePath& file_path);
void OnRequestDirectoryRefresh(const FilePath& directory_path,
scoped_ptr<LoadFeedParams> params,
DriveFileError error);
void GetAvailableSpaceOnUIThread(const GetAvailableSpaceCallback& callback);
void AddUploadedFileOnUIThread(UploadMode upload_mode,
const FilePath& directory_path,
scoped_ptr<DocumentEntry> doc_entry,
const FilePath& file_content_path,
DriveCache::FileOperationType cache_operation,
const base::Closure& callback);
void UpdateEntryDataOnUIThread(const UpdateEntryParams& params,
scoped_ptr<DocumentEntry> entry);
// Part of CreateDirectory(). Called after
// FindFirstMissingParentDirectory() is complete.
// |callback| must not be null.
void CreateDirectoryAfterFindFirstMissingPath(
const FilePath& directory_path,
bool is_exclusive,
bool is_recursive,
const FileOperationCallback& callback,
const FindFirstMissingParentDirectoryResult& result);
// Part of GetEntryInfoByResourceId(). Called after
// DriveResourceMetadata::GetEntryInfoByResourceId() is complete.
// |callback| must not be null.
void GetEntryInfoByResourceIdAfterGetEntry(
const GetEntryInfoWithFilePathCallback& callback,
DriveFileError error,
const FilePath& file_path,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of GetFileByResourceIdOnUIThread(). Called after
// DriveResourceMetadata::GetEntryInfoByResourceId() is complete.
// |get_file_callback| must not be null.
// |get_content_callback| may be null.
void GetFileByResourceIdAfterGetEntry(
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback,
DriveFileError error,
const FilePath& file_path,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of CopyOnUIThread(). Called after GetEntryInfoPairByPaths() is
// complete. |callback| must not be null.
void CopyOnUIThreadAfterGetEntryInfoPair(
const FilePath& dest_file_path,
const FileOperationCallback& callback,
scoped_ptr<EntryInfoPairResult> result);
// Part of MoveOnUIThread(). Called after GetEntryInfoPairByPaths() is
// complete. |callback| must not be null.
void MoveOnUIThreadAfterGetEntryInfoPair(
const FilePath& dest_file_path,
const FileOperationCallback& callback,
scoped_ptr<EntryInfoPairResult> result);
// Part of RequestDirectoryRefreshOnUIThread(). Called after
// GetEntryInfoByPath() is complete.
void RequestDirectoryRefreshOnUIThreadAfterGetEntryInfo(
const FilePath& file_path,
DriveFileError error,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of UpdateEntryDataOnUIThread(). Called after RefreshFile is complete.
void UpdateCacheEntryOnUIThread(
const UpdateEntryParams& params,
DriveFileError error,
const FilePath& drive_file_path,
scoped_ptr<DriveEntryProto> entry_proto);
// Part of GetEntryByResourceId and GetEntryByPath. Checks whether there is a
// local dirty cache for the entry, and if there is, replace the
// PlatformFileInfo part of the |entry_proto| with the locally modified info.
// |callback| must not be null.
void CheckLocalModificationAndRun(scoped_ptr<DriveEntryProto> entry_proto,
const GetEntryInfoCallback& callback);
void CheckLocalModificationAndRunAfterGetCacheEntry(
scoped_ptr<DriveEntryProto> entry_proto,
const GetEntryInfoCallback& callback,
bool success,
const DriveCacheEntry& cache_entry);
void CheckLocalModificationAndRunAfterGetCacheFile(
scoped_ptr<DriveEntryProto> entry_proto,
const GetEntryInfoCallback& callback,
DriveFileError error,
const FilePath& local_cache_path);
void CheckLocalModificationAndRunAfterGetFileInfo(
scoped_ptr<DriveEntryProto> entry_proto,
const GetEntryInfoCallback& callback,
base::PlatformFileInfo* file_info,
bool* get_file_info_result);
// All members should be accessed only on UI thread. Do not post tasks to
// other threads with base::Unretained(this).
scoped_ptr<DriveResourceMetadata> resource_metadata_;
// The profile hosts the DriveFileSystem via DriveSystemService.
Profile* profile_;
// The cache owned by DriveSystemService.
DriveCache* cache_;
// The uploader owned by DriveSystemService.
DriveUploaderInterface* uploader_;
// The document service owned by DriveSystemService.
DriveServiceInterface* drive_service_;
// The webapps registry owned by DriveSystemService.
DriveWebAppsRegistryInterface* webapps_registry_;
// Periodic timer for checking updates.
base::Timer update_timer_;
// True if hosted documents should be hidden.
bool hide_hosted_docs_;
// The set of paths opened by OpenFile but not yet closed by CloseFile.
std::set<FilePath> open_files_;
scoped_ptr<PrefChangeRegistrar> pref_registrar_;
// The loader is used to load the feeds.
scoped_ptr<GDataWapiFeedLoader> feed_loader_;
ObserverList<DriveFileSystemInterface::Observer> observers_;
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
scoped_ptr<DriveFunctionRemove> remove_function_;
// WeakPtrFactory and WeakPtr bound to the UI thread.
// Note: These should remain the last member so they'll be destroyed and
// invalidate the weak pointers before any other members are destroyed.
base::WeakPtrFactory<DriveFileSystem> ui_weak_ptr_factory_;
// Unlike other classes, we need this as we need this to redirect a task
// from IO thread to UI thread.
base::WeakPtr<DriveFileSystem> ui_weak_ptr_;
};
} // namespace gdata
#endif // CHROME_BROWSER_CHROMEOS_GDATA_DRIVE_FILE_SYSTEM_H_