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 #include "chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.h" 6 7 #include "base/callback.h" 8 #include "base/files/file.h" 9 #include "base/files/file_path.h" 10 #include "base/logging.h" 11 #include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" 12 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h" 13 #include "content/public/browser/browser_thread.h" 14 #include "webkit/browser/fileapi/file_system_operation_context.h" 15 #include "webkit/browser/fileapi/file_system_url.h" 16 #include "webkit/common/blob/shareable_file_reference.h" 17 18 using content::BrowserThread; 19 20 namespace chromeos { 21 namespace file_system_provider { 22 namespace internal { 23 namespace { 24 25 // Executes GetFileInfo on the UI thread. 26 void GetFileInfoOnUIThread( 27 scoped_ptr<fileapi::FileSystemOperationContext> context, 28 const fileapi::FileSystemURL& url, 29 const fileapi::AsyncFileUtil::GetFileInfoCallback& callback) { 30 util::FileSystemURLParser parser(url); 31 if (!parser.Parse()) { 32 callback.Run(base::File::FILE_ERROR_INVALID_OPERATION, base::File::Info()); 33 return; 34 } 35 36 parser.file_system()->GetMetadata(parser.file_path(), callback); 37 } 38 39 // Routes the response of GetFileInfo back to the IO thread. 40 void OnGetFileInfo(const fileapi::AsyncFileUtil::GetFileInfoCallback& callback, 41 base::File::Error result, 42 const base::File::Info& file_info) { 43 BrowserThread::PostTask( 44 BrowserThread::IO, FROM_HERE, base::Bind(callback, result, file_info)); 45 } 46 47 // Executes ReadDirectory on the UI thread. 48 void ReadDirectoryOnUIThread( 49 scoped_ptr<fileapi::FileSystemOperationContext> context, 50 const fileapi::FileSystemURL& url, 51 const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback) { 52 util::FileSystemURLParser parser(url); 53 if (!parser.Parse()) { 54 callback.Run(base::File::FILE_ERROR_INVALID_OPERATION, 55 fileapi::AsyncFileUtil::EntryList(), 56 false /* has_more */); 57 return; 58 } 59 60 parser.file_system()->ReadDirectory(parser.file_path(), callback); 61 } 62 63 // Routes the response of ReadDirectory back to the IO thread. 64 void OnReadDirectory( 65 const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback, 66 base::File::Error result, 67 const fileapi::AsyncFileUtil::EntryList& entry_list, 68 bool has_more) { 69 BrowserThread::PostTask(BrowserThread::IO, 70 FROM_HERE, 71 base::Bind(callback, result, entry_list, has_more)); 72 } 73 74 } // namespace 75 76 ProviderAsyncFileUtil::ProviderAsyncFileUtil() {} 77 78 ProviderAsyncFileUtil::~ProviderAsyncFileUtil() {} 79 80 void ProviderAsyncFileUtil::CreateOrOpen( 81 scoped_ptr<fileapi::FileSystemOperationContext> context, 82 const fileapi::FileSystemURL& url, 83 int file_flags, 84 const CreateOrOpenCallback& callback) { 85 DCHECK_CURRENTLY_ON(BrowserThread::IO); 86 if ((file_flags & base::File::FLAG_CREATE) || 87 (file_flags & base::File::FLAG_OPEN_ALWAYS) || 88 (file_flags & base::File::FLAG_CREATE_ALWAYS) || 89 (file_flags & base::File::FLAG_OPEN_TRUNCATED)) { 90 callback.Run(base::File(base::File::FILE_ERROR_ACCESS_DENIED), 91 base::Closure()); 92 return; 93 } 94 95 NOTIMPLEMENTED(); 96 callback.Run(base::File(base::File::FILE_ERROR_INVALID_OPERATION), 97 base::Closure()); 98 } 99 100 void ProviderAsyncFileUtil::EnsureFileExists( 101 scoped_ptr<fileapi::FileSystemOperationContext> context, 102 const fileapi::FileSystemURL& url, 103 const EnsureFileExistsCallback& callback) { 104 DCHECK_CURRENTLY_ON(BrowserThread::IO); 105 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED, false /* created */); 106 } 107 108 void ProviderAsyncFileUtil::CreateDirectory( 109 scoped_ptr<fileapi::FileSystemOperationContext> context, 110 const fileapi::FileSystemURL& url, 111 bool exclusive, 112 bool recursive, 113 const StatusCallback& callback) { 114 DCHECK_CURRENTLY_ON(BrowserThread::IO); 115 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 116 } 117 118 void ProviderAsyncFileUtil::GetFileInfo( 119 scoped_ptr<fileapi::FileSystemOperationContext> context, 120 const fileapi::FileSystemURL& url, 121 const GetFileInfoCallback& callback) { 122 DCHECK_CURRENTLY_ON(BrowserThread::IO); 123 BrowserThread::PostTask(BrowserThread::UI, 124 FROM_HERE, 125 base::Bind(&GetFileInfoOnUIThread, 126 base::Passed(&context), 127 url, 128 base::Bind(&OnGetFileInfo, callback))); 129 } 130 131 void ProviderAsyncFileUtil::ReadDirectory( 132 scoped_ptr<fileapi::FileSystemOperationContext> context, 133 const fileapi::FileSystemURL& url, 134 const ReadDirectoryCallback& callback) { 135 DCHECK_CURRENTLY_ON(BrowserThread::IO); 136 BrowserThread::PostTask(BrowserThread::UI, 137 FROM_HERE, 138 base::Bind(&ReadDirectoryOnUIThread, 139 base::Passed(&context), 140 url, 141 base::Bind(&OnReadDirectory, callback))); 142 } 143 144 void ProviderAsyncFileUtil::Touch( 145 scoped_ptr<fileapi::FileSystemOperationContext> context, 146 const fileapi::FileSystemURL& url, 147 const base::Time& last_access_time, 148 const base::Time& last_modified_time, 149 const StatusCallback& callback) { 150 DCHECK_CURRENTLY_ON(BrowserThread::IO); 151 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 152 } 153 154 void ProviderAsyncFileUtil::Truncate( 155 scoped_ptr<fileapi::FileSystemOperationContext> context, 156 const fileapi::FileSystemURL& url, 157 int64 length, 158 const StatusCallback& callback) { 159 DCHECK_CURRENTLY_ON(BrowserThread::IO); 160 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 161 } 162 163 void ProviderAsyncFileUtil::CopyFileLocal( 164 scoped_ptr<fileapi::FileSystemOperationContext> context, 165 const fileapi::FileSystemURL& src_url, 166 const fileapi::FileSystemURL& dest_url, 167 CopyOrMoveOption option, 168 const CopyFileProgressCallback& progress_callback, 169 const StatusCallback& callback) { 170 DCHECK_CURRENTLY_ON(BrowserThread::IO); 171 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 172 } 173 174 void ProviderAsyncFileUtil::MoveFileLocal( 175 scoped_ptr<fileapi::FileSystemOperationContext> context, 176 const fileapi::FileSystemURL& src_url, 177 const fileapi::FileSystemURL& dest_url, 178 CopyOrMoveOption option, 179 const StatusCallback& callback) { 180 DCHECK_CURRENTLY_ON(BrowserThread::IO); 181 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 182 } 183 184 void ProviderAsyncFileUtil::CopyInForeignFile( 185 scoped_ptr<fileapi::FileSystemOperationContext> context, 186 const base::FilePath& src_file_path, 187 const fileapi::FileSystemURL& dest_url, 188 const StatusCallback& callback) { 189 DCHECK_CURRENTLY_ON(BrowserThread::IO); 190 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 191 } 192 193 void ProviderAsyncFileUtil::DeleteFile( 194 scoped_ptr<fileapi::FileSystemOperationContext> context, 195 const fileapi::FileSystemURL& url, 196 const StatusCallback& callback) { 197 DCHECK_CURRENTLY_ON(BrowserThread::IO); 198 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 199 } 200 201 void ProviderAsyncFileUtil::DeleteDirectory( 202 scoped_ptr<fileapi::FileSystemOperationContext> context, 203 const fileapi::FileSystemURL& url, 204 const StatusCallback& callback) { 205 DCHECK_CURRENTLY_ON(BrowserThread::IO); 206 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 207 } 208 209 void ProviderAsyncFileUtil::DeleteRecursively( 210 scoped_ptr<fileapi::FileSystemOperationContext> context, 211 const fileapi::FileSystemURL& url, 212 const StatusCallback& callback) { 213 DCHECK_CURRENTLY_ON(BrowserThread::IO); 214 callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 215 } 216 217 void ProviderAsyncFileUtil::CreateSnapshotFile( 218 scoped_ptr<fileapi::FileSystemOperationContext> context, 219 const fileapi::FileSystemURL& url, 220 const CreateSnapshotFileCallback& callback) { 221 DCHECK_CURRENTLY_ON(BrowserThread::IO); 222 NOTIMPLEMENTED(); 223 callback.Run(base::File::FILE_ERROR_INVALID_OPERATION, 224 base::File::Info(), 225 base::FilePath(), 226 scoped_refptr<webkit_blob::ShareableFileReference>()); 227 } 228 229 } // namespace internal 230 } // namespace file_system_provider 231 } // namespace chromeos 232