| // 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_ |