1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_INTERFACE_H_ 6 #define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_INTERFACE_H_ 7 8 #include <string> 9 10 #include "base/callback.h" 11 #include "base/files/file.h" 12 #include "base/files/file_path.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/weak_ptr.h" 15 #include "storage/browser/fileapi/async_file_util.h" 16 17 class EventRouter; 18 19 namespace base { 20 class Time; 21 } // namespace base 22 23 namespace net { 24 class IOBuffer; 25 } // namespace net 26 27 namespace chromeos { 28 namespace file_system_provider { 29 30 class ProvidedFileSystemInfo; 31 class RequestManager; 32 33 // Represents metadata for either a file or a directory. Returned by GetMetadata 34 // method in ProvidedFileSystemInterface. 35 struct EntryMetadata { 36 EntryMetadata(); 37 ~EntryMetadata(); 38 39 bool is_directory; 40 std::string name; 41 int64 size; 42 base::Time modification_time; 43 std::string mime_type; 44 std::string thumbnail; 45 46 private: 47 DISALLOW_COPY_AND_ASSIGN(EntryMetadata); 48 }; 49 50 // Interface for a provided file system. Acts as a proxy between providers 51 // and clients. All of the request methods return an abort callback in order to 52 // terminate it while running. They must be called on the same thread as the 53 // request methods. The cancellation callback may be null if the operation 54 // fails synchronously. 55 class ProvidedFileSystemInterface { 56 public: 57 // Mode of opening a file. Used by OpenFile(). 58 enum OpenFileMode { OPEN_FILE_MODE_READ, OPEN_FILE_MODE_WRITE }; 59 60 // Extra fields to be fetched with metadata. 61 enum MetadataField { 62 METADATA_FIELD_DEFAULT = 0, 63 METADATA_FIELD_THUMBNAIL = 1 << 0 64 }; 65 66 typedef base::Callback<void(int file_handle, base::File::Error result)> 67 OpenFileCallback; 68 69 typedef base::Callback< 70 void(int chunk_length, bool has_more, base::File::Error result)> 71 ReadChunkReceivedCallback; 72 73 typedef base::Callback<void(scoped_ptr<EntryMetadata> entry_metadata, 74 base::File::Error result)> GetMetadataCallback; 75 76 typedef base::Callback<void( 77 const storage::AsyncFileUtil::StatusCallback& callback)> AbortCallback; 78 79 // Mask of fields requested from the GetMetadata() call. 80 typedef int MetadataFieldMask; 81 82 virtual ~ProvidedFileSystemInterface() {} 83 84 // Requests unmounting of the file system. The callback is called when the 85 // request is accepted or rejected, with an error code. 86 virtual AbortCallback RequestUnmount( 87 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 88 89 // Requests metadata of the passed |entry_path|. It can be either a file 90 // or a directory. All |fields| will be returned if supported. Note, that 91 // default fields are always returned. 92 virtual AbortCallback GetMetadata(const base::FilePath& entry_path, 93 MetadataFieldMask fields, 94 const GetMetadataCallback& callback) = 0; 95 96 // Requests enumerating entries from the passed |directory_path|. The callback 97 // can be called multiple times until |has_more| is set to false. 98 virtual AbortCallback ReadDirectory( 99 const base::FilePath& directory_path, 100 const storage::AsyncFileUtil::ReadDirectoryCallback& callback) = 0; 101 102 // Requests opening a file at |file_path|. If the file doesn't exist, then the 103 // operation will fail. 104 virtual AbortCallback OpenFile(const base::FilePath& file_path, 105 OpenFileMode mode, 106 const OpenFileCallback& callback) = 0; 107 108 // Requests closing a file, previously opened with OpenFile() as a file with 109 // |file_handle|. For either succes or error |callback| must be called. 110 virtual AbortCallback CloseFile( 111 int file_handle, 112 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 113 114 // Requests reading a file previously opened with |file_handle|. The callback 115 // can be called multiple times until |has_more| is set to false. On success 116 // it should return |length| bytes starting from |offset| in total. It can 117 // return less only in case EOF is encountered. 118 virtual AbortCallback ReadFile(int file_handle, 119 net::IOBuffer* buffer, 120 int64 offset, 121 int length, 122 const ReadChunkReceivedCallback& callback) = 0; 123 124 // Requests creating a directory. If |recursive| is passed, then all non 125 // existing directories on the path will be created. The operation will fail 126 // if the target directory already exists. 127 virtual AbortCallback CreateDirectory( 128 const base::FilePath& directory_path, 129 bool recursive, 130 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 131 132 // Requests creating a file. If the entry already exists, then the 133 // FILE_ERROR_EXISTS error must be returned. 134 virtual AbortCallback CreateFile( 135 const base::FilePath& file_path, 136 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 137 138 // Requests deleting a directory. If |recursive| is passed and the entry is 139 // a directory, then all contents of it (recursively) will be deleted too. 140 virtual AbortCallback DeleteEntry( 141 const base::FilePath& entry_path, 142 bool recursive, 143 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 144 145 // Requests copying an entry (recursively in case of a directory) within the 146 // same file system. 147 virtual AbortCallback CopyEntry( 148 const base::FilePath& source_path, 149 const base::FilePath& target_path, 150 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 151 152 // Requests moving an entry (recursively in case of a directory) within the 153 // same file system. 154 virtual AbortCallback MoveEntry( 155 const base::FilePath& source_path, 156 const base::FilePath& target_path, 157 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 158 159 // Requests truncating a file to the desired length. 160 virtual AbortCallback Truncate( 161 const base::FilePath& file_path, 162 int64 length, 163 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 164 165 // Requests writing to a file previously opened with |file_handle|. 166 virtual AbortCallback WriteFile( 167 int file_handle, 168 net::IOBuffer* buffer, 169 int64 offset, 170 int length, 171 const storage::AsyncFileUtil::StatusCallback& callback) = 0; 172 173 // Returns a provided file system info for this file system. 174 virtual const ProvidedFileSystemInfo& GetFileSystemInfo() const = 0; 175 176 // Returns a request manager for the file system. 177 virtual RequestManager* GetRequestManager() = 0; 178 179 // Returns a weak pointer to this object. 180 virtual base::WeakPtr<ProvidedFileSystemInterface> GetWeakPtr() = 0; 181 }; 182 183 } // namespace file_system_provider 184 } // namespace chromeos 185 186 #endif // CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_INTERFACE_H_ 187