| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h" | 5 #include "chrome/browser/chromeos/drive/fileapi/fileapi_worker.h" |
| 6 | 6 |
| 7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/task_runner_util.h" | 9 #include "base/task_runner_util.h" |
| 10 #include "base/threading/sequenced_worker_pool.h" | 10 #include "base/threading/sequenced_worker_pool.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 | 133 |
| 134 callback.Run(base::File::FILE_OK, file_info, local_path, scope_out_policy); | 134 callback.Run(base::File::FILE_OK, file_info, local_path, scope_out_policy); |
| 135 } | 135 } |
| 136 | 136 |
| 137 // Runs |callback| with arguments converted from |error| and |local_path|. | 137 // Runs |callback| with arguments converted from |error| and |local_path|. |
| 138 void RunCreateWritableSnapshotFileCallback( | 138 void RunCreateWritableSnapshotFileCallback( |
| 139 const CreateWritableSnapshotFileCallback& callback, | 139 const CreateWritableSnapshotFileCallback& callback, |
| 140 FileError error, | 140 FileError error, |
| 141 const base::FilePath& local_path, | 141 const base::FilePath& local_path, |
| 142 const base::Closure& close_callback) { | 142 const base::Closure& close_callback) { |
| 143 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 143 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 144 callback.Run(FileErrorToBaseFileError(error), local_path, close_callback); | 144 callback.Run(FileErrorToBaseFileError(error), local_path, close_callback); |
| 145 } | 145 } |
| 146 | 146 |
| 147 // Runs |callback| with |file|. | 147 // Runs |callback| with |file|. |
| 148 void RunOpenFileCallback(const OpenFileCallback& callback, | 148 void RunOpenFileCallback(const OpenFileCallback& callback, |
| 149 const base::Closure& close_callback, | 149 const base::Closure& close_callback, |
| 150 base::File file) { | 150 base::File file) { |
| 151 callback.Run(file.Pass(), close_callback); | 151 callback.Run(file.Pass(), close_callback); |
| 152 } | 152 } |
| 153 | 153 |
| 154 base::File OpenFile(const base::FilePath& path, int flags) { | 154 base::File OpenFile(const base::FilePath& path, int flags) { |
| 155 return base::File(path, flags); | 155 return base::File(path, flags); |
| 156 } | 156 } |
| 157 | 157 |
| 158 // Part of OpenFile(). Called after FileSystem::OpenFile(). | 158 // Part of OpenFile(). Called after FileSystem::OpenFile(). |
| 159 void OpenFileAfterFileSystemOpenFile(int file_flags, | 159 void OpenFileAfterFileSystemOpenFile(int file_flags, |
| 160 const OpenFileCallback& callback, | 160 const OpenFileCallback& callback, |
| 161 FileError error, | 161 FileError error, |
| 162 const base::FilePath& local_path, | 162 const base::FilePath& local_path, |
| 163 const base::Closure& close_callback) { | 163 const base::Closure& close_callback) { |
| 164 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 164 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 165 | 165 |
| 166 if (error != FILE_ERROR_OK) { | 166 if (error != FILE_ERROR_OK) { |
| 167 callback.Run(base::File(FileErrorToBaseFileError(error)), base::Closure()); | 167 callback.Run(base::File(FileErrorToBaseFileError(error)), base::Closure()); |
| 168 return; | 168 return; |
| 169 } | 169 } |
| 170 | 170 |
| 171 // Here, the file should be at |local_path|, but there may be timing issue. | 171 // Here, the file should be at |local_path|, but there may be timing issue. |
| 172 // Because the file is managed by Drive file system, so, in order to avoid | 172 // Because the file is managed by Drive file system, so, in order to avoid |
| 173 // unexpected file creation, CREATE, OPEN_ALWAYS and CREATE_ALWAYS are | 173 // unexpected file creation, CREATE, OPEN_ALWAYS and CREATE_ALWAYS are |
| 174 // translated into OPEN or OPEN_TRUNCATED, here. Keep OPEN and OPEN_TRUNCATED | 174 // translated into OPEN or OPEN_TRUNCATED, here. Keep OPEN and OPEN_TRUNCATED |
| (...skipping 12 matching lines...) Expand all Loading... |
| 187 bool posted = base::PostTaskAndReplyWithResult( | 187 bool posted = base::PostTaskAndReplyWithResult( |
| 188 BrowserThread::GetBlockingPool(), FROM_HERE, | 188 BrowserThread::GetBlockingPool(), FROM_HERE, |
| 189 base::Bind(&OpenFile, local_path, file_flags), | 189 base::Bind(&OpenFile, local_path, file_flags), |
| 190 base::Bind(&RunOpenFileCallback, callback, close_callback)); | 190 base::Bind(&RunOpenFileCallback, callback, close_callback)); |
| 191 DCHECK(posted); | 191 DCHECK(posted); |
| 192 } | 192 } |
| 193 | 193 |
| 194 } // namespace | 194 } // namespace |
| 195 | 195 |
| 196 FileSystemInterface* GetFileSystemFromUrl(const storage::FileSystemURL& url) { | 196 FileSystemInterface* GetFileSystemFromUrl(const storage::FileSystemURL& url) { |
| 197 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 197 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 198 | 198 |
| 199 Profile* profile = util::ExtractProfileFromPath(url.path()); | 199 Profile* profile = util::ExtractProfileFromPath(url.path()); |
| 200 return profile ? util::GetFileSystemByProfile(profile) : NULL; | 200 return profile ? util::GetFileSystemByProfile(profile) : NULL; |
| 201 } | 201 } |
| 202 | 202 |
| 203 void RunFileSystemCallback( | 203 void RunFileSystemCallback( |
| 204 const FileSystemGetter& file_system_getter, | 204 const FileSystemGetter& file_system_getter, |
| 205 const base::Callback<void(FileSystemInterface*)>& callback, | 205 const base::Callback<void(FileSystemInterface*)>& callback, |
| 206 const base::Closure& on_error_callback) { | 206 const base::Closure& on_error_callback) { |
| 207 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 207 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 208 FileSystemInterface* file_system = file_system_getter.Run(); | 208 FileSystemInterface* file_system = file_system_getter.Run(); |
| 209 | 209 |
| 210 if (!file_system) { | 210 if (!file_system) { |
| 211 if (!on_error_callback.is_null()) | 211 if (!on_error_callback.is_null()) |
| 212 on_error_callback.Run(); | 212 on_error_callback.Run(); |
| 213 return; | 213 return; |
| 214 } | 214 } |
| 215 | 215 |
| 216 callback.Run(file_system); | 216 callback.Run(file_system); |
| 217 } | 217 } |
| 218 | 218 |
| 219 void GetFileInfo(const base::FilePath& file_path, | 219 void GetFileInfo(const base::FilePath& file_path, |
| 220 const GetFileInfoCallback& callback, | 220 const GetFileInfoCallback& callback, |
| 221 FileSystemInterface* file_system) { | 221 FileSystemInterface* file_system) { |
| 222 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 222 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 223 file_system->GetResourceEntry( | 223 file_system->GetResourceEntry( |
| 224 file_path, | 224 file_path, |
| 225 base::Bind(&RunGetFileInfoCallback, callback)); | 225 base::Bind(&RunGetFileInfoCallback, callback)); |
| 226 } | 226 } |
| 227 | 227 |
| 228 void Copy(const base::FilePath& src_file_path, | 228 void Copy(const base::FilePath& src_file_path, |
| 229 const base::FilePath& dest_file_path, | 229 const base::FilePath& dest_file_path, |
| 230 bool preserve_last_modified, | 230 bool preserve_last_modified, |
| 231 const StatusCallback& callback, | 231 const StatusCallback& callback, |
| 232 FileSystemInterface* file_system) { | 232 FileSystemInterface* file_system) { |
| 233 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 233 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 234 file_system->Copy(src_file_path, dest_file_path, preserve_last_modified, | 234 file_system->Copy(src_file_path, dest_file_path, preserve_last_modified, |
| 235 base::Bind(&RunStatusCallbackByFileError, callback)); | 235 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 236 } | 236 } |
| 237 | 237 |
| 238 void Move(const base::FilePath& src_file_path, | 238 void Move(const base::FilePath& src_file_path, |
| 239 const base::FilePath& dest_file_path, | 239 const base::FilePath& dest_file_path, |
| 240 const StatusCallback& callback, | 240 const StatusCallback& callback, |
| 241 FileSystemInterface* file_system) { | 241 FileSystemInterface* file_system) { |
| 242 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 242 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 243 file_system->Move(src_file_path, dest_file_path, | 243 file_system->Move(src_file_path, dest_file_path, |
| 244 base::Bind(&RunStatusCallbackByFileError, callback)); | 244 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 245 } | 245 } |
| 246 | 246 |
| 247 void CopyInForeignFile(const base::FilePath& src_foreign_file_path, | 247 void CopyInForeignFile(const base::FilePath& src_foreign_file_path, |
| 248 const base::FilePath& dest_file_path, | 248 const base::FilePath& dest_file_path, |
| 249 const StatusCallback& callback, | 249 const StatusCallback& callback, |
| 250 FileSystemInterface* file_system) { | 250 FileSystemInterface* file_system) { |
| 251 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 251 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 252 file_system->TransferFileFromLocalToRemote( | 252 file_system->TransferFileFromLocalToRemote( |
| 253 src_foreign_file_path, dest_file_path, | 253 src_foreign_file_path, dest_file_path, |
| 254 base::Bind(&RunStatusCallbackByFileError, callback)); | 254 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 255 } | 255 } |
| 256 | 256 |
| 257 void ReadDirectory(const base::FilePath& file_path, | 257 void ReadDirectory(const base::FilePath& file_path, |
| 258 const ReadDirectoryCallback& callback, | 258 const ReadDirectoryCallback& callback, |
| 259 FileSystemInterface* file_system) { | 259 FileSystemInterface* file_system) { |
| 260 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 260 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 261 file_system->ReadDirectory( | 261 file_system->ReadDirectory( |
| 262 file_path, | 262 file_path, |
| 263 base::Bind(&RunReadDirectoryCallbackWithEntries, callback), | 263 base::Bind(&RunReadDirectoryCallbackWithEntries, callback), |
| 264 base::Bind(&RunReadDirectoryCallbackOnCompletion, callback)); | 264 base::Bind(&RunReadDirectoryCallbackOnCompletion, callback)); |
| 265 } | 265 } |
| 266 | 266 |
| 267 void Remove(const base::FilePath& file_path, | 267 void Remove(const base::FilePath& file_path, |
| 268 bool is_recursive, | 268 bool is_recursive, |
| 269 const StatusCallback& callback, | 269 const StatusCallback& callback, |
| 270 FileSystemInterface* file_system) { | 270 FileSystemInterface* file_system) { |
| 271 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 271 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 272 file_system->Remove(file_path, is_recursive, | 272 file_system->Remove(file_path, is_recursive, |
| 273 base::Bind(&RunStatusCallbackByFileError, callback)); | 273 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 274 } | 274 } |
| 275 | 275 |
| 276 void CreateDirectory(const base::FilePath& file_path, | 276 void CreateDirectory(const base::FilePath& file_path, |
| 277 bool is_exclusive, | 277 bool is_exclusive, |
| 278 bool is_recursive, | 278 bool is_recursive, |
| 279 const StatusCallback& callback, | 279 const StatusCallback& callback, |
| 280 FileSystemInterface* file_system) { | 280 FileSystemInterface* file_system) { |
| 281 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 281 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 282 file_system->CreateDirectory( | 282 file_system->CreateDirectory( |
| 283 file_path, is_exclusive, is_recursive, | 283 file_path, is_exclusive, is_recursive, |
| 284 base::Bind(&RunStatusCallbackByFileError, callback)); | 284 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void CreateFile(const base::FilePath& file_path, | 287 void CreateFile(const base::FilePath& file_path, |
| 288 bool is_exclusive, | 288 bool is_exclusive, |
| 289 const StatusCallback& callback, | 289 const StatusCallback& callback, |
| 290 FileSystemInterface* file_system) { | 290 FileSystemInterface* file_system) { |
| 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 291 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 292 file_system->CreateFile(file_path, is_exclusive, | 292 file_system->CreateFile(file_path, is_exclusive, |
| 293 std::string(), // no mime type; guess from file_path | 293 std::string(), // no mime type; guess from file_path |
| 294 base::Bind(&RunStatusCallbackByFileError, callback)); | 294 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 295 } | 295 } |
| 296 | 296 |
| 297 void Truncate(const base::FilePath& file_path, | 297 void Truncate(const base::FilePath& file_path, |
| 298 int64 length, | 298 int64 length, |
| 299 const StatusCallback& callback, | 299 const StatusCallback& callback, |
| 300 FileSystemInterface* file_system) { | 300 FileSystemInterface* file_system) { |
| 301 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 301 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 302 file_system->TruncateFile( | 302 file_system->TruncateFile( |
| 303 file_path, length, | 303 file_path, length, |
| 304 base::Bind(&RunStatusCallbackByFileError, callback)); | 304 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 305 } | 305 } |
| 306 | 306 |
| 307 void CreateSnapshotFile(const base::FilePath& file_path, | 307 void CreateSnapshotFile(const base::FilePath& file_path, |
| 308 const CreateSnapshotFileCallback& callback, | 308 const CreateSnapshotFileCallback& callback, |
| 309 FileSystemInterface* file_system) { | 309 FileSystemInterface* file_system) { |
| 310 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 310 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 311 file_system->GetFile(file_path, | 311 file_system->GetFile(file_path, |
| 312 base::Bind(&RunCreateSnapshotFileCallback, callback)); | 312 base::Bind(&RunCreateSnapshotFileCallback, callback)); |
| 313 } | 313 } |
| 314 | 314 |
| 315 void CreateWritableSnapshotFile( | 315 void CreateWritableSnapshotFile( |
| 316 const base::FilePath& file_path, | 316 const base::FilePath& file_path, |
| 317 const CreateWritableSnapshotFileCallback& callback, | 317 const CreateWritableSnapshotFileCallback& callback, |
| 318 FileSystemInterface* file_system) { | 318 FileSystemInterface* file_system) { |
| 319 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 319 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 320 file_system->OpenFile( | 320 file_system->OpenFile( |
| 321 file_path, | 321 file_path, |
| 322 OPEN_FILE, | 322 OPEN_FILE, |
| 323 std::string(), // no mime type; we never create a new file here. | 323 std::string(), // no mime type; we never create a new file here. |
| 324 base::Bind(&RunCreateWritableSnapshotFileCallback, callback)); | 324 base::Bind(&RunCreateWritableSnapshotFileCallback, callback)); |
| 325 } | 325 } |
| 326 | 326 |
| 327 void OpenFile(const base::FilePath& file_path, | 327 void OpenFile(const base::FilePath& file_path, |
| 328 int file_flags, | 328 int file_flags, |
| 329 const OpenFileCallback& callback, | 329 const OpenFileCallback& callback, |
| 330 FileSystemInterface* file_system) { | 330 FileSystemInterface* file_system) { |
| 331 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 331 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 332 | 332 |
| 333 // Returns an error if any unsupported flag is found. | 333 // Returns an error if any unsupported flag is found. |
| 334 if (file_flags & ~(base::File::FLAG_OPEN | | 334 if (file_flags & ~(base::File::FLAG_OPEN | |
| 335 base::File::FLAG_CREATE | | 335 base::File::FLAG_CREATE | |
| 336 base::File::FLAG_OPEN_ALWAYS | | 336 base::File::FLAG_OPEN_ALWAYS | |
| 337 base::File::FLAG_CREATE_ALWAYS | | 337 base::File::FLAG_CREATE_ALWAYS | |
| 338 base::File::FLAG_OPEN_TRUNCATED | | 338 base::File::FLAG_OPEN_TRUNCATED | |
| 339 base::File::FLAG_READ | | 339 base::File::FLAG_READ | |
| 340 base::File::FLAG_WRITE | | 340 base::File::FLAG_WRITE | |
| 341 base::File::FLAG_WRITE_ATTRIBUTES | | 341 base::File::FLAG_WRITE_ATTRIBUTES | |
| (...skipping 10 matching lines...) Expand all Loading... |
| 352 file_path, GetOpenMode(file_flags), | 352 file_path, GetOpenMode(file_flags), |
| 353 std::string(), // no mime type; guess from file_path | 353 std::string(), // no mime type; guess from file_path |
| 354 base::Bind(&OpenFileAfterFileSystemOpenFile, file_flags, callback)); | 354 base::Bind(&OpenFileAfterFileSystemOpenFile, file_flags, callback)); |
| 355 } | 355 } |
| 356 | 356 |
| 357 void TouchFile(const base::FilePath& file_path, | 357 void TouchFile(const base::FilePath& file_path, |
| 358 const base::Time& last_access_time, | 358 const base::Time& last_access_time, |
| 359 const base::Time& last_modified_time, | 359 const base::Time& last_modified_time, |
| 360 const StatusCallback& callback, | 360 const StatusCallback& callback, |
| 361 FileSystemInterface* file_system) { | 361 FileSystemInterface* file_system) { |
| 362 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 362 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 363 file_system->TouchFile(file_path, last_access_time, last_modified_time, | 363 file_system->TouchFile(file_path, last_access_time, last_modified_time, |
| 364 base::Bind(&RunStatusCallbackByFileError, callback)); | 364 base::Bind(&RunStatusCallbackByFileError, callback)); |
| 365 | 365 |
| 366 } | 366 } |
| 367 | 367 |
| 368 } // namespace fileapi_internal | 368 } // namespace fileapi_internal |
| 369 } // namespace drive | 369 } // namespace drive |
| OLD | NEW |