blob: 770a13c8b045058169473e5218f12804d490dacc [file] [log] [blame]
// 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_INTERFACE_H_
#define CHROME_BROWSER_CHROMEOS_GDATA_DRIVE_FILE_SYSTEM_INTERFACE_H_
#include <string>
#include <vector>
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/chromeos/gdata/drive_cache.h"
#include "chrome/browser/chromeos/gdata/drive_resource_metadata.h"
#include "chrome/browser/google_apis/gdata_operations.h"
namespace gdata {
class DocumentEntry;
class DriveEntryProto;
typedef std::vector<DriveEntryProto> DriveEntryProtoVector;
// Information about search result returned by Search Async callback.
// This is data needed to create a file system entry that will be used by file
// browser.
struct SearchResultInfo {
SearchResultInfo(const FilePath& in_path, bool in_is_directory)
: path(in_path),
is_directory(in_is_directory) {
}
FilePath path;
bool is_directory;
};
// Used to get files from the file system.
typedef base::Callback<void(DriveFileError error,
const FilePath& file_path,
const std::string& mime_type,
DriveFileType file_type)> GetFileCallback;
// Used to read a directory from the file system.
// Similar to ReadDirectoryCallback but this one provides
// |hide_hosted_documents|
// If |error| is not DRIVE_FILE_OK, |entries| is set to NULL.
// |entries| are contents, both files and directories, of the directory.
typedef base::Callback<void(DriveFileError error,
bool hide_hosted_documents,
scoped_ptr<DriveEntryProtoVector> entries)>
ReadDirectoryWithSettingCallback;
// Used to get drive content search results.
// If |error| is not DRIVE_FILE_OK, |result_paths| is empty.
typedef base::Callback<void(
DriveFileError error,
const GURL& next_feed,
scoped_ptr<std::vector<SearchResultInfo> > result_paths)> SearchCallback;
// Used to open files from the file system. |file_path| is the path on the local
// file system for the opened file.
typedef base::Callback<void(DriveFileError error,
const FilePath& file_path)> OpenFileCallback;
// Used to get available space for the account from Drive.
typedef base::Callback<void(DriveFileError error,
int64 bytes_total,
int64 bytes_used)> GetAvailableSpaceCallback;
// Drive file system abstraction layer.
// The interface is defined to make DriveFileSystem mockable.
class DriveFileSystemInterface {
public:
virtual ~DriveFileSystemInterface() {}
// Used to notify events on the file system.
// All events are notified on UI thread.
class Observer {
public:
// Triggered when a content of a directory has been changed.
// |directory_path| is a virtual directory path (/drive/...) representing
// changed directory.
virtual void OnDirectoryChanged(const FilePath& directory_path) {}
// Triggered when the file system is initially loaded.
virtual void OnInitialLoadFinished() {}
// Triggered when a document feed is fetched. |num_accumulated_entries|
// tells the number of entries fetched so far.
virtual void OnDocumentFeedFetched(int num_accumulated_entries) {}
// Triggered when the feed from the server is loaded.
virtual void OnFeedFromServerLoaded() {}
// Triggered when the file system is mounted.
virtual void OnFileSystemMounted() {}
// Triggered when the file system is being unmounted.
virtual void OnFileSystemBeingUnmounted() {}
protected:
virtual ~Observer() {}
};
// Initializes the object. This function should be called before any
// other functions.
virtual void Initialize() = 0;
// Adds and removes the observer.
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
// Starts initial feed fetch from the server.
virtual void StartInitialFeedFetch() = 0;
// Starts and stops periodic updates.
virtual void StartUpdates() = 0;
virtual void StopUpdates() = 0;
// Notifies the file system was just mounted.
virtual void NotifyFileSystemMounted() = 0;
// Notifies the file system is going to be unmounted.
virtual void NotifyFileSystemToBeUnmounted() = 0;
// Checks for updates on the server.
virtual void CheckForUpdates() = 0;
// Finds an entry (file or directory) by using |resource_id|. This call
// does not initiate content refreshing.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void GetEntryInfoByResourceId(
const std::string& resource_id,
const GetEntryInfoWithFilePathCallback& callback) = 0;
// Initiates transfer of |remote_src_file_path| to |local_dest_file_path|.
// |remote_src_file_path| is the virtual source path on the Drive file system.
// |local_dest_file_path| is the destination path on the local file system.
//
// Must be called from *UI* thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void TransferFileFromRemoteToLocal(
const FilePath& remote_src_file_path,
const FilePath& local_dest_file_path,
const FileOperationCallback& callback) = 0;
// Initiates transfer of |local_src_file_path| to |remote_dest_file_path|.
// |local_src_file_path| must be a file 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.
// |callback| must not be null.
virtual void TransferFileFromLocalToRemote(
const FilePath& local_src_file_path,
const FilePath& remote_dest_file_path,
const FileOperationCallback& callback) = 0;
// Retrieves a file at the virtual path |file_path| on the Drive file system
// onto the cache, and mark it dirty. The local path to the cache file is
// returned to |callback|. After opening the file, both read and write
// on the file can be done with normal local file operations.
//
// |CloseFile| must be called when the modification to the cache is done.
// Otherwise, Drive file system does not pick up the file for uploading.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
virtual void OpenFile(const FilePath& file_path,
const OpenFileCallback& callback) = 0;
// Closes a file at the virtual path |file_path| on the Drive file system,
// which is opened via OpenFile(). It commits the dirty flag on the cache.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void CloseFile(const FilePath& file_path,
const FileOperationCallback& callback) = 0;
// Copies |src_file_path| to |dest_file_path| on the file system.
// |src_file_path| can be a hosted document (see limitations below).
// |dest_file_path| is expected to be of the same type of |src_file_path|
// (i.e. if |src_file_path| is a file, |dest_file_path| will be created as
// a file).
//
// This method also has the following assumptions/limitations that may be
// relaxed or addressed later:
// - |src_file_path| cannot be a regular file (i.e. non-hosted document)
// or a directory.
// - |dest_file_path| must not exist.
// - The parent of |dest_file_path| must already exist.
//
// The file entries represented by |src_file_path| and the parent directory
// of |dest_file_path| need to be present in the in-memory representation
// of the file system.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void Copy(const FilePath& src_file_path,
const FilePath& dest_file_path,
const FileOperationCallback& callback) = 0;
// Moves |src_file_path| to |dest_file_path| on the file system.
// |src_file_path| can be a file (regular or hosted document) or a directory.
// |dest_file_path| is expected to be of the same type of |src_file_path|
// (i.e. if |src_file_path| is a file, |dest_file_path| will be created as
// a file).
//
// This method also has the following assumptions/limitations that may be
// relaxed or addressed later:
// - |dest_file_path| must not exist.
// - The parent of |dest_file_path| must already exist.
//
// The file entries represented by |src_file_path| and the parent directory
// of |dest_file_path| need to be present in the in-memory representation
// of the file system.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void Move(const FilePath& src_file_path,
const FilePath& dest_file_path,
const FileOperationCallback& callback) = 0;
// Removes |file_path| from the file system. If |is_recursive| is set and
// |file_path| represents a directory, we will also delete all of its
// contained children elements. The file entry represented by |file_path|
// needs to be present in in-memory representation of the file system that
// in order to be removed.
//
// TODO(satorux): is_recursive is not supported yet. crbug.com/138282
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void Remove(const FilePath& file_path,
bool is_recursive,
const FileOperationCallback& callback) = 0;
// Creates new directory under |directory_path|. If |is_exclusive| is true,
// an error is raised in case a directory is already present at the
// |directory_path|. If |is_recursive| is true, the call creates parent
// directories as needed just like mkdir -p does.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void CreateDirectory(const FilePath& directory_path,
bool is_exclusive,
bool is_recursive,
const FileOperationCallback& callback) = 0;
// Creates a file at |file_path|. If the flag |is_exclusive| is true, an
// error is raised when a file already exists at the path. It is
// an error if a directory or a hosted document is already present at the
// path, or the parent directory of the path is not present yet.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread
// |callback| must not be null.
virtual void CreateFile(const FilePath& file_path,
bool is_exclusive,
const FileOperationCallback& callback) = 0;
// Gets |file_path| from the file system. The file entry represented by
// |file_path| needs to be present in in-memory representation of the file
// system in order to be retrieved. If the file is not cached, the file
// will be downloaded through GData API or Drive V2 API.
//
// Can be called from UI/IO thread. |get_file_callback| and
// |get_content_callback| are run on the calling thread.
// |get_file_callback| must not be null.
// |get_content_callback| may be null.
virtual void GetFileByPath(
const FilePath& file_path,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback) = 0;
// Gets a file by the given |resource_id| from the Drive server. Used for
// fetching pinned-but-not-fetched files.
//
// Can be called from UI/IO thread. |get_file_callback| and
// |get_content_callback| are run on the calling thread.
// |get_file_callback| must not be null.
// |get_content_callback| may be null.
virtual void GetFileByResourceId(
const std::string& resource_id,
const GetFileCallback& get_file_callback,
const GetContentCallback& get_content_callback) = 0;
// Updates a file by the given |resource_id| on the Drive server by
// uploading an updated version. Used for uploading dirty files. The file
// should already be present in the cache.
//
// TODO(satorux): As of now, the function only handles files with the dirty
// bit committed. We should eliminate the restriction. crbug.com/134558.
//
// Can be called from UI/IO thread. |callback| and is run on the calling
// thread. |callback| must not be null.
virtual void UpdateFileByResourceId(
const std::string& resource_id,
const FileOperationCallback& callback) = 0;
// Finds an entry (a file or a directory) by |file_path|. This call will also
// retrieve and refresh file system content from server and disk cache.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void GetEntryInfoByPath(const FilePath& file_path,
const GetEntryInfoCallback& callback) = 0;
// Finds and reads a directory by |file_path|. This call will also retrieve
// and refresh file system content from server and disk cache.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void ReadDirectoryByPath(
const FilePath& file_path,
const ReadDirectoryWithSettingCallback& callback) = 0;
// Requests a refresh of the directory pointed by |file_path| (i.e. fetches
// the latest metadata of files in the target directory).
//
// In particular, this function is used to get the latest thumbnail
// URLs. Thumbnail URLs change periodically even if contents of files are
// not changed, hence we should get the new thumbnail URLs manually if we
// detect that the existing thumbnail URLs are stale.
//
// Upon success, the metadata of files in the target directory is updated,
// and the change is notified via Observer::OnDirectoryChanged(). Note that
// this function ignores changes in directories in the target
// directory. Changes in directories are handled via the delta feeds.
//
// Can be called from UI/IO thread.
virtual void RequestDirectoryRefresh(const FilePath& file_path) = 0;
// Does server side content search for |search_query|.
// If |next_feed| is set, this is the feed url that will be fetched.
// Search results will be returned as a list of results' |SearchResultInfo|
// structs, which contains file's path and is_directory flag.
//
// Can be called from UI/IO thread. |callback| is run on the calling thread.
// |callback| must not be null.
virtual void Search(const std::string& search_query,
const GURL& next_feed,
const SearchCallback& callback) = 0;
// Fetches the user's Account Metadata to find out current quota information
// and returns it to the callback.
virtual void GetAvailableSpace(const GetAvailableSpaceCallback& callback) = 0;
// Adds a file entry from |doc_entry| under |directory_path|, and modifies
// the cache state.
//
// When uploading a new file, adds a new file entry, and store its content
// from |file_content_path| into the cache.
//
// When uploading an existing file, replaces the file entry with a new one,
// and clears the dirty bit in the cache.
//
// |callback| will be called on the UI thread upon completion of operation.
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) = 0;
// Updates the data associated with the file referenced by |resource_id| and
// |md5|. The data is copied from |file_content_path|.
//
// |callback| will be called on the UI thread upon completion of operation.
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) = 0;
};
} // namespace gdata
#endif // CHROME_BROWSER_CHROMEOS_GDATA_DRIVE_FILE_SYSTEM_INTERFACE_H_