OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "webkit/browser/fileapi/obfuscated_file_util.h" | 5 #include "webkit/browser/fileapi/obfuscated_file_util.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 | 99 |
100 enum IsolatedOriginStatus { | 100 enum IsolatedOriginStatus { |
101 kIsolatedOriginMatch, | 101 kIsolatedOriginMatch, |
102 kIsolatedOriginDontMatch, | 102 kIsolatedOriginDontMatch, |
103 kIsolatedOriginStatusMax, | 103 kIsolatedOriginStatusMax, |
104 }; | 104 }; |
105 | 105 |
106 } // namespace | 106 } // namespace |
107 | 107 |
108 using base::PlatformFile; | 108 using base::PlatformFile; |
109 using base::PlatformFileError; | |
110 | 109 |
111 class ObfuscatedFileEnumerator | 110 class ObfuscatedFileEnumerator |
112 : public FileSystemFileUtil::AbstractFileEnumerator { | 111 : public FileSystemFileUtil::AbstractFileEnumerator { |
113 public: | 112 public: |
114 ObfuscatedFileEnumerator( | 113 ObfuscatedFileEnumerator( |
115 SandboxDirectoryDatabase* db, | 114 SandboxDirectoryDatabase* db, |
116 FileSystemOperationContext* context, | 115 FileSystemOperationContext* context, |
117 ObfuscatedFileUtil* obfuscated_file_util, | 116 ObfuscatedFileUtil* obfuscated_file_util, |
118 const FileSystemURL& root_url, | 117 const FileSystemURL& root_url, |
119 bool recursive) | 118 bool recursive) |
(...skipping 18 matching lines...) Expand all Loading... |
138 virtual base::FilePath Next() OVERRIDE { | 137 virtual base::FilePath Next() OVERRIDE { |
139 ProcessRecurseQueue(); | 138 ProcessRecurseQueue(); |
140 if (display_stack_.empty()) | 139 if (display_stack_.empty()) |
141 return base::FilePath(); | 140 return base::FilePath(); |
142 | 141 |
143 current_file_id_ = display_stack_.back(); | 142 current_file_id_ = display_stack_.back(); |
144 display_stack_.pop_back(); | 143 display_stack_.pop_back(); |
145 | 144 |
146 FileInfo file_info; | 145 FileInfo file_info; |
147 base::FilePath platform_file_path; | 146 base::FilePath platform_file_path; |
148 base::PlatformFileError error = | 147 base::File::Error error = |
149 obfuscated_file_util_->GetFileInfoInternal( | 148 obfuscated_file_util_->GetFileInfoInternal( |
150 db_, context_, root_url_, current_file_id_, | 149 db_, context_, root_url_, current_file_id_, |
151 &file_info, ¤t_platform_file_info_, &platform_file_path); | 150 &file_info, ¤t_platform_file_info_, &platform_file_path); |
152 if (error != base::PLATFORM_FILE_OK) | 151 if (error != base::File::FILE_OK) |
153 return Next(); | 152 return Next(); |
154 | 153 |
155 base::FilePath virtual_path = | 154 base::FilePath virtual_path = |
156 current_parent_virtual_path_.Append(file_info.name); | 155 current_parent_virtual_path_.Append(file_info.name); |
157 if (recursive_ && file_info.is_directory()) { | 156 if (recursive_ && file_info.is_directory()) { |
158 FileRecord record = { current_file_id_, virtual_path }; | 157 FileRecord record = { current_file_id_, virtual_path }; |
159 recurse_queue_.push(record); | 158 recurse_queue_.push(record); |
160 } | 159 } |
161 return virtual_path; | 160 return virtual_path; |
162 } | 161 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 FileSystemOperationContext* context_; | 197 FileSystemOperationContext* context_; |
199 ObfuscatedFileUtil* obfuscated_file_util_; | 198 ObfuscatedFileUtil* obfuscated_file_util_; |
200 FileSystemURL root_url_; | 199 FileSystemURL root_url_; |
201 bool recursive_; | 200 bool recursive_; |
202 | 201 |
203 std::queue<FileRecord> recurse_queue_; | 202 std::queue<FileRecord> recurse_queue_; |
204 std::vector<FileId> display_stack_; | 203 std::vector<FileId> display_stack_; |
205 base::FilePath current_parent_virtual_path_; | 204 base::FilePath current_parent_virtual_path_; |
206 | 205 |
207 FileId current_file_id_; | 206 FileId current_file_id_; |
208 base::PlatformFileInfo current_platform_file_info_; | 207 base::File::Info current_platform_file_info_; |
209 }; | 208 }; |
210 | 209 |
211 class ObfuscatedOriginEnumerator | 210 class ObfuscatedOriginEnumerator |
212 : public ObfuscatedFileUtil::AbstractOriginEnumerator { | 211 : public ObfuscatedFileUtil::AbstractOriginEnumerator { |
213 public: | 212 public: |
214 typedef SandboxOriginDatabase::OriginRecord OriginRecord; | 213 typedef SandboxOriginDatabase::OriginRecord OriginRecord; |
215 ObfuscatedOriginEnumerator( | 214 ObfuscatedOriginEnumerator( |
216 SandboxOriginDatabaseInterface* origin_database, | 215 SandboxOriginDatabaseInterface* origin_database, |
217 const base::FilePath& base_file_path) | 216 const base::FilePath& base_file_path) |
218 : base_file_path_(base_file_path) { | 217 : base_file_path_(base_file_path) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 file_task_runner_(file_task_runner), | 264 file_task_runner_(file_task_runner), |
266 get_type_string_for_url_(get_type_string_for_url), | 265 get_type_string_for_url_(get_type_string_for_url), |
267 known_type_strings_(known_type_strings), | 266 known_type_strings_(known_type_strings), |
268 sandbox_delegate_(sandbox_delegate) { | 267 sandbox_delegate_(sandbox_delegate) { |
269 } | 268 } |
270 | 269 |
271 ObfuscatedFileUtil::~ObfuscatedFileUtil() { | 270 ObfuscatedFileUtil::~ObfuscatedFileUtil() { |
272 DropDatabases(); | 271 DropDatabases(); |
273 } | 272 } |
274 | 273 |
275 PlatformFileError ObfuscatedFileUtil::CreateOrOpen( | 274 base::File::Error ObfuscatedFileUtil::CreateOrOpen( |
276 FileSystemOperationContext* context, | 275 FileSystemOperationContext* context, |
277 const FileSystemURL& url, int file_flags, | 276 const FileSystemURL& url, int file_flags, |
278 PlatformFile* file_handle, bool* created) { | 277 PlatformFile* file_handle, bool* created) { |
279 PlatformFileError error = CreateOrOpenInternal(context, url, file_flags, | 278 base::File::Error error = CreateOrOpenInternal(context, url, file_flags, |
280 file_handle, created); | 279 file_handle, created); |
281 if (*file_handle != base::kInvalidPlatformFileValue && | 280 if (*file_handle != base::kInvalidPlatformFileValue && |
282 file_flags & base::PLATFORM_FILE_WRITE && | 281 file_flags & base::PLATFORM_FILE_WRITE && |
283 context->quota_limit_type() == quota::kQuotaLimitTypeUnlimited && | 282 context->quota_limit_type() == quota::kQuotaLimitTypeUnlimited && |
284 sandbox_delegate_) { | 283 sandbox_delegate_) { |
285 DCHECK_EQ(base::PLATFORM_FILE_OK, error); | 284 DCHECK_EQ(base::File::FILE_OK, error); |
286 sandbox_delegate_->StickyInvalidateUsageCache(url.origin(), url.type()); | 285 sandbox_delegate_->StickyInvalidateUsageCache(url.origin(), url.type()); |
287 } | 286 } |
288 return error; | 287 return error; |
289 } | 288 } |
290 | 289 |
291 PlatformFileError ObfuscatedFileUtil::Close( | 290 base::File::Error ObfuscatedFileUtil::Close( |
292 FileSystemOperationContext* context, | 291 FileSystemOperationContext* context, |
293 base::PlatformFile file) { | 292 base::PlatformFile file) { |
294 return NativeFileUtil::Close(file); | 293 return NativeFileUtil::Close(file); |
295 } | 294 } |
296 | 295 |
297 PlatformFileError ObfuscatedFileUtil::EnsureFileExists( | 296 base::File::Error ObfuscatedFileUtil::EnsureFileExists( |
298 FileSystemOperationContext* context, | 297 FileSystemOperationContext* context, |
299 const FileSystemURL& url, | 298 const FileSystemURL& url, |
300 bool* created) { | 299 bool* created) { |
301 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); | 300 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); |
302 if (!db) | 301 if (!db) |
303 return base::PLATFORM_FILE_ERROR_FAILED; | 302 return base::File::FILE_ERROR_FAILED; |
304 | 303 |
305 FileId file_id; | 304 FileId file_id; |
306 if (db->GetFileWithPath(url.path(), &file_id)) { | 305 if (db->GetFileWithPath(url.path(), &file_id)) { |
307 FileInfo file_info; | 306 FileInfo file_info; |
308 if (!db->GetFileInfo(file_id, &file_info)) { | 307 if (!db->GetFileInfo(file_id, &file_info)) { |
309 NOTREACHED(); | 308 NOTREACHED(); |
310 return base::PLATFORM_FILE_ERROR_FAILED; | 309 return base::File::FILE_ERROR_FAILED; |
311 } | 310 } |
312 if (file_info.is_directory()) | 311 if (file_info.is_directory()) |
313 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; | 312 return base::File::FILE_ERROR_NOT_A_FILE; |
314 if (created) | 313 if (created) |
315 *created = false; | 314 *created = false; |
316 return base::PLATFORM_FILE_OK; | 315 return base::File::FILE_OK; |
317 } | 316 } |
318 FileId parent_id; | 317 FileId parent_id; |
319 if (!db->GetFileWithPath(VirtualPath::DirName(url.path()), &parent_id)) | 318 if (!db->GetFileWithPath(VirtualPath::DirName(url.path()), &parent_id)) |
320 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 319 return base::File::FILE_ERROR_NOT_FOUND; |
321 | 320 |
322 FileInfo file_info; | 321 FileInfo file_info; |
323 InitFileInfo(&file_info, parent_id, | 322 InitFileInfo(&file_info, parent_id, |
324 VirtualPath::BaseName(url.path()).value()); | 323 VirtualPath::BaseName(url.path()).value()); |
325 | 324 |
326 int64 growth = UsageForPath(file_info.name.size()); | 325 int64 growth = UsageForPath(file_info.name.size()); |
327 if (!AllocateQuota(context, growth)) | 326 if (!AllocateQuota(context, growth)) |
328 return base::PLATFORM_FILE_ERROR_NO_SPACE; | 327 return base::File::FILE_ERROR_NO_SPACE; |
329 PlatformFileError error = CreateFile( | 328 base::File::Error error = CreateFile( |
330 context, base::FilePath(), url, &file_info, 0, NULL); | 329 context, base::FilePath(), url, &file_info, 0, NULL); |
331 if (created && base::PLATFORM_FILE_OK == error) { | 330 if (created && base::File::FILE_OK == error) { |
332 *created = true; | 331 *created = true; |
333 UpdateUsage(context, url, growth); | 332 UpdateUsage(context, url, growth); |
334 context->change_observers()->Notify( | 333 context->change_observers()->Notify( |
335 &FileChangeObserver::OnCreateFile, MakeTuple(url)); | 334 &FileChangeObserver::OnCreateFile, MakeTuple(url)); |
336 } | 335 } |
337 return error; | 336 return error; |
338 } | 337 } |
339 | 338 |
340 PlatformFileError ObfuscatedFileUtil::CreateDirectory( | 339 base::File::Error ObfuscatedFileUtil::CreateDirectory( |
341 FileSystemOperationContext* context, | 340 FileSystemOperationContext* context, |
342 const FileSystemURL& url, | 341 const FileSystemURL& url, |
343 bool exclusive, | 342 bool exclusive, |
344 bool recursive) { | 343 bool recursive) { |
345 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); | 344 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); |
346 if (!db) | 345 if (!db) |
347 return base::PLATFORM_FILE_ERROR_FAILED; | 346 return base::File::FILE_ERROR_FAILED; |
348 | 347 |
349 FileId file_id; | 348 FileId file_id; |
350 if (db->GetFileWithPath(url.path(), &file_id)) { | 349 if (db->GetFileWithPath(url.path(), &file_id)) { |
351 FileInfo file_info; | 350 FileInfo file_info; |
352 if (exclusive) | 351 if (exclusive) |
353 return base::PLATFORM_FILE_ERROR_EXISTS; | 352 return base::File::FILE_ERROR_EXISTS; |
354 if (!db->GetFileInfo(file_id, &file_info)) { | 353 if (!db->GetFileInfo(file_id, &file_info)) { |
355 NOTREACHED(); | 354 NOTREACHED(); |
356 return base::PLATFORM_FILE_ERROR_FAILED; | 355 return base::File::FILE_ERROR_FAILED; |
357 } | 356 } |
358 if (!file_info.is_directory()) | 357 if (!file_info.is_directory()) |
359 return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; | 358 return base::File::FILE_ERROR_NOT_A_DIRECTORY; |
360 return base::PLATFORM_FILE_OK; | 359 return base::File::FILE_OK; |
361 } | 360 } |
362 | 361 |
363 std::vector<base::FilePath::StringType> components; | 362 std::vector<base::FilePath::StringType> components; |
364 VirtualPath::GetComponents(url.path(), &components); | 363 VirtualPath::GetComponents(url.path(), &components); |
365 FileId parent_id = 0; | 364 FileId parent_id = 0; |
366 size_t index; | 365 size_t index; |
367 for (index = 0; index < components.size(); ++index) { | 366 for (index = 0; index < components.size(); ++index) { |
368 base::FilePath::StringType name = components[index]; | 367 base::FilePath::StringType name = components[index]; |
369 if (name == FILE_PATH_LITERAL("/")) | 368 if (name == FILE_PATH_LITERAL("/")) |
370 continue; | 369 continue; |
371 if (!db->GetChildWithName(parent_id, name, &parent_id)) | 370 if (!db->GetChildWithName(parent_id, name, &parent_id)) |
372 break; | 371 break; |
373 } | 372 } |
374 if (!db->IsDirectory(parent_id)) | 373 if (!db->IsDirectory(parent_id)) |
375 return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; | 374 return base::File::FILE_ERROR_NOT_A_DIRECTORY; |
376 if (!recursive && components.size() - index > 1) | 375 if (!recursive && components.size() - index > 1) |
377 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 376 return base::File::FILE_ERROR_NOT_FOUND; |
378 bool first = true; | 377 bool first = true; |
379 for (; index < components.size(); ++index) { | 378 for (; index < components.size(); ++index) { |
380 FileInfo file_info; | 379 FileInfo file_info; |
381 file_info.name = components[index]; | 380 file_info.name = components[index]; |
382 if (file_info.name == FILE_PATH_LITERAL("/")) | 381 if (file_info.name == FILE_PATH_LITERAL("/")) |
383 continue; | 382 continue; |
384 file_info.modification_time = base::Time::Now(); | 383 file_info.modification_time = base::Time::Now(); |
385 file_info.parent_id = parent_id; | 384 file_info.parent_id = parent_id; |
386 int64 growth = UsageForPath(file_info.name.size()); | 385 int64 growth = UsageForPath(file_info.name.size()); |
387 if (!AllocateQuota(context, growth)) | 386 if (!AllocateQuota(context, growth)) |
388 return base::PLATFORM_FILE_ERROR_NO_SPACE; | 387 return base::File::FILE_ERROR_NO_SPACE; |
389 base::PlatformFileError error = db->AddFileInfo(file_info, &parent_id); | 388 base::File::Error error = db->AddFileInfo(file_info, &parent_id); |
390 if (error != base::PLATFORM_FILE_OK) | 389 if (error != base::File::FILE_OK) |
391 return error; | 390 return error; |
392 UpdateUsage(context, url, growth); | 391 UpdateUsage(context, url, growth); |
393 context->change_observers()->Notify( | 392 context->change_observers()->Notify( |
394 &FileChangeObserver::OnCreateDirectory, MakeTuple(url)); | 393 &FileChangeObserver::OnCreateDirectory, MakeTuple(url)); |
395 if (first) { | 394 if (first) { |
396 first = false; | 395 first = false; |
397 TouchDirectory(db, file_info.parent_id); | 396 TouchDirectory(db, file_info.parent_id); |
398 } | 397 } |
399 } | 398 } |
400 return base::PLATFORM_FILE_OK; | 399 return base::File::FILE_OK; |
401 } | 400 } |
402 | 401 |
403 PlatformFileError ObfuscatedFileUtil::GetFileInfo( | 402 base::File::Error ObfuscatedFileUtil::GetFileInfo( |
404 FileSystemOperationContext* context, | 403 FileSystemOperationContext* context, |
405 const FileSystemURL& url, | 404 const FileSystemURL& url, |
406 base::PlatformFileInfo* file_info, | 405 base::File::Info* file_info, |
407 base::FilePath* platform_file_path) { | 406 base::FilePath* platform_file_path) { |
408 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, false); | 407 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, false); |
409 if (!db) | 408 if (!db) |
410 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 409 return base::File::FILE_ERROR_NOT_FOUND; |
411 FileId file_id; | 410 FileId file_id; |
412 if (!db->GetFileWithPath(url.path(), &file_id)) | 411 if (!db->GetFileWithPath(url.path(), &file_id)) |
413 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 412 return base::File::FILE_ERROR_NOT_FOUND; |
414 FileInfo local_info; | 413 FileInfo local_info; |
415 return GetFileInfoInternal(db, context, url, | 414 return GetFileInfoInternal(db, context, url, |
416 file_id, &local_info, | 415 file_id, &local_info, |
417 file_info, platform_file_path); | 416 file_info, platform_file_path); |
418 } | 417 } |
419 | 418 |
420 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> | 419 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> |
421 ObfuscatedFileUtil::CreateFileEnumerator( | 420 ObfuscatedFileUtil::CreateFileEnumerator( |
422 FileSystemOperationContext* context, | 421 FileSystemOperationContext* context, |
423 const FileSystemURL& root_url) { | 422 const FileSystemURL& root_url) { |
424 return CreateFileEnumerator(context, root_url, false /* recursive */); | 423 return CreateFileEnumerator(context, root_url, false /* recursive */); |
425 } | 424 } |
426 | 425 |
427 PlatformFileError ObfuscatedFileUtil::GetLocalFilePath( | 426 base::File::Error ObfuscatedFileUtil::GetLocalFilePath( |
428 FileSystemOperationContext* context, | 427 FileSystemOperationContext* context, |
429 const FileSystemURL& url, | 428 const FileSystemURL& url, |
430 base::FilePath* local_path) { | 429 base::FilePath* local_path) { |
431 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, false); | 430 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, false); |
432 if (!db) | 431 if (!db) |
433 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 432 return base::File::FILE_ERROR_NOT_FOUND; |
434 FileId file_id; | 433 FileId file_id; |
435 if (!db->GetFileWithPath(url.path(), &file_id)) | 434 if (!db->GetFileWithPath(url.path(), &file_id)) |
436 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 435 return base::File::FILE_ERROR_NOT_FOUND; |
437 FileInfo file_info; | 436 FileInfo file_info; |
438 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) { | 437 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) { |
439 NOTREACHED(); | 438 NOTREACHED(); |
440 // Directories have no local file path. | 439 // Directories have no local file path. |
441 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 440 return base::File::FILE_ERROR_NOT_FOUND; |
442 } | 441 } |
443 *local_path = DataPathToLocalPath(url, file_info.data_path); | 442 *local_path = DataPathToLocalPath(url, file_info.data_path); |
444 | 443 |
445 if (local_path->empty()) | 444 if (local_path->empty()) |
446 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 445 return base::File::FILE_ERROR_NOT_FOUND; |
447 return base::PLATFORM_FILE_OK; | 446 return base::File::FILE_OK; |
448 } | 447 } |
449 | 448 |
450 PlatformFileError ObfuscatedFileUtil::Touch( | 449 base::File::Error ObfuscatedFileUtil::Touch( |
451 FileSystemOperationContext* context, | 450 FileSystemOperationContext* context, |
452 const FileSystemURL& url, | 451 const FileSystemURL& url, |
453 const base::Time& last_access_time, | 452 const base::Time& last_access_time, |
454 const base::Time& last_modified_time) { | 453 const base::Time& last_modified_time) { |
455 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, false); | 454 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, false); |
456 if (!db) | 455 if (!db) |
457 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 456 return base::File::FILE_ERROR_NOT_FOUND; |
458 FileId file_id; | 457 FileId file_id; |
459 if (!db->GetFileWithPath(url.path(), &file_id)) | 458 if (!db->GetFileWithPath(url.path(), &file_id)) |
460 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 459 return base::File::FILE_ERROR_NOT_FOUND; |
461 | 460 |
462 FileInfo file_info; | 461 FileInfo file_info; |
463 if (!db->GetFileInfo(file_id, &file_info)) { | 462 if (!db->GetFileInfo(file_id, &file_info)) { |
464 NOTREACHED(); | 463 NOTREACHED(); |
465 return base::PLATFORM_FILE_ERROR_FAILED; | 464 return base::File::FILE_ERROR_FAILED; |
466 } | 465 } |
467 if (file_info.is_directory()) { | 466 if (file_info.is_directory()) { |
468 if (!db->UpdateModificationTime(file_id, last_modified_time)) | 467 if (!db->UpdateModificationTime(file_id, last_modified_time)) |
469 return base::PLATFORM_FILE_ERROR_FAILED; | 468 return base::File::FILE_ERROR_FAILED; |
470 return base::PLATFORM_FILE_OK; | 469 return base::File::FILE_OK; |
471 } | 470 } |
472 return NativeFileUtil::Touch( | 471 return NativeFileUtil::Touch( |
473 DataPathToLocalPath(url, file_info.data_path), | 472 DataPathToLocalPath(url, file_info.data_path), |
474 last_access_time, last_modified_time); | 473 last_access_time, last_modified_time); |
475 } | 474 } |
476 | 475 |
477 PlatformFileError ObfuscatedFileUtil::Truncate( | 476 base::File::Error ObfuscatedFileUtil::Truncate( |
478 FileSystemOperationContext* context, | 477 FileSystemOperationContext* context, |
479 const FileSystemURL& url, | 478 const FileSystemURL& url, |
480 int64 length) { | 479 int64 length) { |
481 base::PlatformFileInfo file_info; | 480 base::File::Info file_info; |
482 base::FilePath local_path; | 481 base::FilePath local_path; |
483 base::PlatformFileError error = | 482 base::File::Error error = |
484 GetFileInfo(context, url, &file_info, &local_path); | 483 GetFileInfo(context, url, &file_info, &local_path); |
485 if (error != base::PLATFORM_FILE_OK) | 484 if (error != base::File::FILE_OK) |
486 return error; | 485 return error; |
487 | 486 |
488 int64 growth = length - file_info.size; | 487 int64 growth = length - file_info.size; |
489 if (!AllocateQuota(context, growth)) | 488 if (!AllocateQuota(context, growth)) |
490 return base::PLATFORM_FILE_ERROR_NO_SPACE; | 489 return base::File::FILE_ERROR_NO_SPACE; |
491 error = NativeFileUtil::Truncate(local_path, length); | 490 error = NativeFileUtil::Truncate(local_path, length); |
492 if (error == base::PLATFORM_FILE_OK) { | 491 if (error == base::File::FILE_OK) { |
493 UpdateUsage(context, url, growth); | 492 UpdateUsage(context, url, growth); |
494 context->change_observers()->Notify( | 493 context->change_observers()->Notify( |
495 &FileChangeObserver::OnModifyFile, MakeTuple(url)); | 494 &FileChangeObserver::OnModifyFile, MakeTuple(url)); |
496 } | 495 } |
497 return error; | 496 return error; |
498 } | 497 } |
499 | 498 |
500 PlatformFileError ObfuscatedFileUtil::CopyOrMoveFile( | 499 base::File::Error ObfuscatedFileUtil::CopyOrMoveFile( |
501 FileSystemOperationContext* context, | 500 FileSystemOperationContext* context, |
502 const FileSystemURL& src_url, | 501 const FileSystemURL& src_url, |
503 const FileSystemURL& dest_url, | 502 const FileSystemURL& dest_url, |
504 CopyOrMoveOption option, | 503 CopyOrMoveOption option, |
505 bool copy) { | 504 bool copy) { |
506 // Cross-filesystem copies and moves should be handled via CopyInForeignFile. | 505 // Cross-filesystem copies and moves should be handled via CopyInForeignFile. |
507 DCHECK(src_url.origin() == dest_url.origin()); | 506 DCHECK(src_url.origin() == dest_url.origin()); |
508 DCHECK(src_url.type() == dest_url.type()); | 507 DCHECK(src_url.type() == dest_url.type()); |
509 | 508 |
510 SandboxDirectoryDatabase* db = GetDirectoryDatabase(src_url, true); | 509 SandboxDirectoryDatabase* db = GetDirectoryDatabase(src_url, true); |
511 if (!db) | 510 if (!db) |
512 return base::PLATFORM_FILE_ERROR_FAILED; | 511 return base::File::FILE_ERROR_FAILED; |
513 | 512 |
514 FileId src_file_id; | 513 FileId src_file_id; |
515 if (!db->GetFileWithPath(src_url.path(), &src_file_id)) | 514 if (!db->GetFileWithPath(src_url.path(), &src_file_id)) |
516 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 515 return base::File::FILE_ERROR_NOT_FOUND; |
517 | 516 |
518 FileId dest_file_id; | 517 FileId dest_file_id; |
519 bool overwrite = db->GetFileWithPath(dest_url.path(), | 518 bool overwrite = db->GetFileWithPath(dest_url.path(), |
520 &dest_file_id); | 519 &dest_file_id); |
521 | 520 |
522 FileInfo src_file_info; | 521 FileInfo src_file_info; |
523 base::PlatformFileInfo src_platform_file_info; | 522 base::File::Info src_platform_file_info; |
524 base::FilePath src_local_path; | 523 base::FilePath src_local_path; |
525 base::PlatformFileError error = GetFileInfoInternal( | 524 base::File::Error error = GetFileInfoInternal( |
526 db, context, src_url, src_file_id, | 525 db, context, src_url, src_file_id, |
527 &src_file_info, &src_platform_file_info, &src_local_path); | 526 &src_file_info, &src_platform_file_info, &src_local_path); |
528 if (error != base::PLATFORM_FILE_OK) | 527 if (error != base::File::FILE_OK) |
529 return error; | 528 return error; |
530 if (src_file_info.is_directory()) | 529 if (src_file_info.is_directory()) |
531 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; | 530 return base::File::FILE_ERROR_NOT_A_FILE; |
532 | 531 |
533 FileInfo dest_file_info; | 532 FileInfo dest_file_info; |
534 base::PlatformFileInfo dest_platform_file_info; // overwrite case only | 533 base::File::Info dest_platform_file_info; // overwrite case only |
535 base::FilePath dest_local_path; // overwrite case only | 534 base::FilePath dest_local_path; // overwrite case only |
536 if (overwrite) { | 535 if (overwrite) { |
537 base::PlatformFileError error = GetFileInfoInternal( | 536 base::File::Error error = GetFileInfoInternal( |
538 db, context, dest_url, dest_file_id, | 537 db, context, dest_url, dest_file_id, |
539 &dest_file_info, &dest_platform_file_info, &dest_local_path); | 538 &dest_file_info, &dest_platform_file_info, &dest_local_path); |
540 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) | 539 if (error == base::File::FILE_ERROR_NOT_FOUND) |
541 overwrite = false; // fallback to non-overwrite case | 540 overwrite = false; // fallback to non-overwrite case |
542 else if (error != base::PLATFORM_FILE_OK) | 541 else if (error != base::File::FILE_OK) |
543 return error; | 542 return error; |
544 else if (dest_file_info.is_directory()) | 543 else if (dest_file_info.is_directory()) |
545 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; | 544 return base::File::FILE_ERROR_INVALID_OPERATION; |
546 } | 545 } |
547 if (!overwrite) { | 546 if (!overwrite) { |
548 FileId dest_parent_id; | 547 FileId dest_parent_id; |
549 if (!db->GetFileWithPath(VirtualPath::DirName(dest_url.path()), | 548 if (!db->GetFileWithPath(VirtualPath::DirName(dest_url.path()), |
550 &dest_parent_id)) { | 549 &dest_parent_id)) { |
551 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 550 return base::File::FILE_ERROR_NOT_FOUND; |
552 } | 551 } |
553 | 552 |
554 dest_file_info = src_file_info; | 553 dest_file_info = src_file_info; |
555 dest_file_info.parent_id = dest_parent_id; | 554 dest_file_info.parent_id = dest_parent_id; |
556 dest_file_info.name = | 555 dest_file_info.name = |
557 VirtualPath::BaseName(dest_url.path()).value(); | 556 VirtualPath::BaseName(dest_url.path()).value(); |
558 } | 557 } |
559 | 558 |
560 int64 growth = 0; | 559 int64 growth = 0; |
561 if (copy) | 560 if (copy) |
562 growth += src_platform_file_info.size; | 561 growth += src_platform_file_info.size; |
563 else | 562 else |
564 growth -= UsageForPath(src_file_info.name.size()); | 563 growth -= UsageForPath(src_file_info.name.size()); |
565 if (overwrite) | 564 if (overwrite) |
566 growth -= dest_platform_file_info.size; | 565 growth -= dest_platform_file_info.size; |
567 else | 566 else |
568 growth += UsageForPath(dest_file_info.name.size()); | 567 growth += UsageForPath(dest_file_info.name.size()); |
569 if (!AllocateQuota(context, growth)) | 568 if (!AllocateQuota(context, growth)) |
570 return base::PLATFORM_FILE_ERROR_NO_SPACE; | 569 return base::File::FILE_ERROR_NO_SPACE; |
571 | 570 |
572 /* | 571 /* |
573 * Copy-with-overwrite | 572 * Copy-with-overwrite |
574 * Just overwrite data file | 573 * Just overwrite data file |
575 * Copy-without-overwrite | 574 * Copy-without-overwrite |
576 * Copy backing file | 575 * Copy backing file |
577 * Create new metadata pointing to new backing file. | 576 * Create new metadata pointing to new backing file. |
578 * Move-with-overwrite | 577 * Move-with-overwrite |
579 * transaction: | 578 * transaction: |
580 * Remove source entry. | 579 * Remove source entry. |
581 * Point target entry to source entry's backing file. | 580 * Point target entry to source entry's backing file. |
582 * Delete target entry's old backing file | 581 * Delete target entry's old backing file |
583 * Move-without-overwrite | 582 * Move-without-overwrite |
584 * Just update metadata | 583 * Just update metadata |
585 */ | 584 */ |
586 error = base::PLATFORM_FILE_ERROR_FAILED; | 585 error = base::File::FILE_ERROR_FAILED; |
587 if (copy) { | 586 if (copy) { |
588 if (overwrite) { | 587 if (overwrite) { |
589 error = NativeFileUtil::CopyOrMoveFile( | 588 error = NativeFileUtil::CopyOrMoveFile( |
590 src_local_path, | 589 src_local_path, |
591 dest_local_path, | 590 dest_local_path, |
592 option, | 591 option, |
593 fileapi::NativeFileUtil::CopyOrMoveModeForDestination( | 592 fileapi::NativeFileUtil::CopyOrMoveModeForDestination( |
594 dest_url, true /* copy */)); | 593 dest_url, true /* copy */)); |
595 } else { // non-overwrite | 594 } else { // non-overwrite |
596 error = CreateFile(context, src_local_path, | 595 error = CreateFile(context, src_local_path, |
597 dest_url, &dest_file_info, 0, NULL); | 596 dest_url, &dest_file_info, 0, NULL); |
598 } | 597 } |
599 } else { | 598 } else { |
600 if (overwrite) { | 599 if (overwrite) { |
601 if (db->OverwritingMoveFile(src_file_id, dest_file_id)) { | 600 if (db->OverwritingMoveFile(src_file_id, dest_file_id)) { |
602 if (base::PLATFORM_FILE_OK != | 601 if (base::File::FILE_OK != |
603 NativeFileUtil::DeleteFile(dest_local_path)) | 602 NativeFileUtil::DeleteFile(dest_local_path)) |
604 LOG(WARNING) << "Leaked a backing file."; | 603 LOG(WARNING) << "Leaked a backing file."; |
605 error = base::PLATFORM_FILE_OK; | 604 error = base::File::FILE_OK; |
606 } else { | 605 } else { |
607 error = base::PLATFORM_FILE_ERROR_FAILED; | 606 error = base::File::FILE_ERROR_FAILED; |
608 } | 607 } |
609 } else { // non-overwrite | 608 } else { // non-overwrite |
610 if (db->UpdateFileInfo(src_file_id, dest_file_info)) | 609 if (db->UpdateFileInfo(src_file_id, dest_file_info)) |
611 error = base::PLATFORM_FILE_OK; | 610 error = base::File::FILE_OK; |
612 else | 611 else |
613 error = base::PLATFORM_FILE_ERROR_FAILED; | 612 error = base::File::FILE_ERROR_FAILED; |
614 } | 613 } |
615 } | 614 } |
616 | 615 |
617 if (error != base::PLATFORM_FILE_OK) | 616 if (error != base::File::FILE_OK) |
618 return error; | 617 return error; |
619 | 618 |
620 if (overwrite) { | 619 if (overwrite) { |
621 context->change_observers()->Notify( | 620 context->change_observers()->Notify( |
622 &FileChangeObserver::OnModifyFile, | 621 &FileChangeObserver::OnModifyFile, |
623 MakeTuple(dest_url)); | 622 MakeTuple(dest_url)); |
624 } else { | 623 } else { |
625 context->change_observers()->Notify( | 624 context->change_observers()->Notify( |
626 &FileChangeObserver::OnCreateFileFrom, | 625 &FileChangeObserver::OnCreateFileFrom, |
627 MakeTuple(dest_url, src_url)); | 626 MakeTuple(dest_url, src_url)); |
628 } | 627 } |
629 | 628 |
630 if (!copy) { | 629 if (!copy) { |
631 context->change_observers()->Notify( | 630 context->change_observers()->Notify( |
632 &FileChangeObserver::OnRemoveFile, MakeTuple(src_url)); | 631 &FileChangeObserver::OnRemoveFile, MakeTuple(src_url)); |
633 TouchDirectory(db, src_file_info.parent_id); | 632 TouchDirectory(db, src_file_info.parent_id); |
634 } | 633 } |
635 | 634 |
636 TouchDirectory(db, dest_file_info.parent_id); | 635 TouchDirectory(db, dest_file_info.parent_id); |
637 | 636 |
638 UpdateUsage(context, dest_url, growth); | 637 UpdateUsage(context, dest_url, growth); |
639 return error; | 638 return error; |
640 } | 639 } |
641 | 640 |
642 PlatformFileError ObfuscatedFileUtil::CopyInForeignFile( | 641 base::File::Error ObfuscatedFileUtil::CopyInForeignFile( |
643 FileSystemOperationContext* context, | 642 FileSystemOperationContext* context, |
644 const base::FilePath& src_file_path, | 643 const base::FilePath& src_file_path, |
645 const FileSystemURL& dest_url) { | 644 const FileSystemURL& dest_url) { |
646 SandboxDirectoryDatabase* db = GetDirectoryDatabase(dest_url, true); | 645 SandboxDirectoryDatabase* db = GetDirectoryDatabase(dest_url, true); |
647 if (!db) | 646 if (!db) |
648 return base::PLATFORM_FILE_ERROR_FAILED; | 647 return base::File::FILE_ERROR_FAILED; |
649 | 648 |
650 base::File::Info src_platform_file_info; | 649 base::File::Info src_platform_file_info; |
651 if (!base::GetFileInfo(src_file_path, &src_platform_file_info)) | 650 if (!base::GetFileInfo(src_file_path, &src_platform_file_info)) |
652 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 651 return base::File::FILE_ERROR_NOT_FOUND; |
653 | 652 |
654 FileId dest_file_id; | 653 FileId dest_file_id; |
655 bool overwrite = db->GetFileWithPath(dest_url.path(), | 654 bool overwrite = db->GetFileWithPath(dest_url.path(), |
656 &dest_file_id); | 655 &dest_file_id); |
657 | 656 |
658 FileInfo dest_file_info; | 657 FileInfo dest_file_info; |
659 base::PlatformFileInfo dest_platform_file_info; // overwrite case only | 658 base::File::Info dest_platform_file_info; // overwrite case only |
660 if (overwrite) { | 659 if (overwrite) { |
661 base::FilePath dest_local_path; | 660 base::FilePath dest_local_path; |
662 base::PlatformFileError error = GetFileInfoInternal( | 661 base::File::Error error = GetFileInfoInternal( |
663 db, context, dest_url, dest_file_id, | 662 db, context, dest_url, dest_file_id, |
664 &dest_file_info, &dest_platform_file_info, &dest_local_path); | 663 &dest_file_info, &dest_platform_file_info, &dest_local_path); |
665 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) | 664 if (error == base::File::FILE_ERROR_NOT_FOUND) |
666 overwrite = false; // fallback to non-overwrite case | 665 overwrite = false; // fallback to non-overwrite case |
667 else if (error != base::PLATFORM_FILE_OK) | 666 else if (error != base::File::FILE_OK) |
668 return error; | 667 return error; |
669 else if (dest_file_info.is_directory()) | 668 else if (dest_file_info.is_directory()) |
670 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; | 669 return base::File::FILE_ERROR_INVALID_OPERATION; |
671 } | 670 } |
672 if (!overwrite) { | 671 if (!overwrite) { |
673 FileId dest_parent_id; | 672 FileId dest_parent_id; |
674 if (!db->GetFileWithPath(VirtualPath::DirName(dest_url.path()), | 673 if (!db->GetFileWithPath(VirtualPath::DirName(dest_url.path()), |
675 &dest_parent_id)) { | 674 &dest_parent_id)) { |
676 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 675 return base::File::FILE_ERROR_NOT_FOUND; |
677 } | 676 } |
678 if (!dest_file_info.is_directory()) | 677 if (!dest_file_info.is_directory()) |
679 return base::PLATFORM_FILE_ERROR_FAILED; | 678 return base::File::FILE_ERROR_FAILED; |
680 InitFileInfo(&dest_file_info, dest_parent_id, | 679 InitFileInfo(&dest_file_info, dest_parent_id, |
681 VirtualPath::BaseName(dest_url.path()).value()); | 680 VirtualPath::BaseName(dest_url.path()).value()); |
682 } | 681 } |
683 | 682 |
684 int64 growth = src_platform_file_info.size; | 683 int64 growth = src_platform_file_info.size; |
685 if (overwrite) | 684 if (overwrite) |
686 growth -= dest_platform_file_info.size; | 685 growth -= dest_platform_file_info.size; |
687 else | 686 else |
688 growth += UsageForPath(dest_file_info.name.size()); | 687 growth += UsageForPath(dest_file_info.name.size()); |
689 if (!AllocateQuota(context, growth)) | 688 if (!AllocateQuota(context, growth)) |
690 return base::PLATFORM_FILE_ERROR_NO_SPACE; | 689 return base::File::FILE_ERROR_NO_SPACE; |
691 | 690 |
692 base::PlatformFileError error; | 691 base::File::Error error; |
693 if (overwrite) { | 692 if (overwrite) { |
694 base::FilePath dest_local_path = | 693 base::FilePath dest_local_path = |
695 DataPathToLocalPath(dest_url, dest_file_info.data_path); | 694 DataPathToLocalPath(dest_url, dest_file_info.data_path); |
696 error = NativeFileUtil::CopyOrMoveFile( | 695 error = NativeFileUtil::CopyOrMoveFile( |
697 src_file_path, dest_local_path, | 696 src_file_path, dest_local_path, |
698 FileSystemOperation::OPTION_NONE, | 697 FileSystemOperation::OPTION_NONE, |
699 fileapi::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, | 698 fileapi::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, |
700 true /* copy */)); | 699 true /* copy */)); |
701 } else { | 700 } else { |
702 error = CreateFile(context, src_file_path, | 701 error = CreateFile(context, src_file_path, |
703 dest_url, &dest_file_info, 0, NULL); | 702 dest_url, &dest_file_info, 0, NULL); |
704 } | 703 } |
705 | 704 |
706 if (error != base::PLATFORM_FILE_OK) | 705 if (error != base::File::FILE_OK) |
707 return error; | 706 return error; |
708 | 707 |
709 if (overwrite) { | 708 if (overwrite) { |
710 context->change_observers()->Notify( | 709 context->change_observers()->Notify( |
711 &FileChangeObserver::OnModifyFile, MakeTuple(dest_url)); | 710 &FileChangeObserver::OnModifyFile, MakeTuple(dest_url)); |
712 } else { | 711 } else { |
713 context->change_observers()->Notify( | 712 context->change_observers()->Notify( |
714 &FileChangeObserver::OnCreateFile, MakeTuple(dest_url)); | 713 &FileChangeObserver::OnCreateFile, MakeTuple(dest_url)); |
715 } | 714 } |
716 | 715 |
717 UpdateUsage(context, dest_url, growth); | 716 UpdateUsage(context, dest_url, growth); |
718 TouchDirectory(db, dest_file_info.parent_id); | 717 TouchDirectory(db, dest_file_info.parent_id); |
719 return base::PLATFORM_FILE_OK; | 718 return base::File::FILE_OK; |
720 } | 719 } |
721 | 720 |
722 PlatformFileError ObfuscatedFileUtil::DeleteFile( | 721 base::File::Error ObfuscatedFileUtil::DeleteFile( |
723 FileSystemOperationContext* context, | 722 FileSystemOperationContext* context, |
724 const FileSystemURL& url) { | 723 const FileSystemURL& url) { |
725 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); | 724 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); |
726 if (!db) | 725 if (!db) |
727 return base::PLATFORM_FILE_ERROR_FAILED; | 726 return base::File::FILE_ERROR_FAILED; |
728 FileId file_id; | 727 FileId file_id; |
729 if (!db->GetFileWithPath(url.path(), &file_id)) | 728 if (!db->GetFileWithPath(url.path(), &file_id)) |
730 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 729 return base::File::FILE_ERROR_NOT_FOUND; |
731 | 730 |
732 FileInfo file_info; | 731 FileInfo file_info; |
733 base::PlatformFileInfo platform_file_info; | 732 base::File::Info platform_file_info; |
734 base::FilePath local_path; | 733 base::FilePath local_path; |
735 base::PlatformFileError error = GetFileInfoInternal( | 734 base::File::Error error = GetFileInfoInternal( |
736 db, context, url, file_id, &file_info, &platform_file_info, &local_path); | 735 db, context, url, file_id, &file_info, &platform_file_info, &local_path); |
737 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND && | 736 if (error != base::File::FILE_ERROR_NOT_FOUND && |
738 error != base::PLATFORM_FILE_OK) | 737 error != base::File::FILE_OK) |
739 return error; | 738 return error; |
740 | 739 |
741 if (file_info.is_directory()) | 740 if (file_info.is_directory()) |
742 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; | 741 return base::File::FILE_ERROR_NOT_A_FILE; |
743 | 742 |
744 int64 growth = -UsageForPath(file_info.name.size()) - platform_file_info.size; | 743 int64 growth = -UsageForPath(file_info.name.size()) - platform_file_info.size; |
745 AllocateQuota(context, growth); | 744 AllocateQuota(context, growth); |
746 if (!db->RemoveFileInfo(file_id)) { | 745 if (!db->RemoveFileInfo(file_id)) { |
747 NOTREACHED(); | 746 NOTREACHED(); |
748 return base::PLATFORM_FILE_ERROR_FAILED; | 747 return base::File::FILE_ERROR_FAILED; |
749 } | 748 } |
750 UpdateUsage(context, url, growth); | 749 UpdateUsage(context, url, growth); |
751 TouchDirectory(db, file_info.parent_id); | 750 TouchDirectory(db, file_info.parent_id); |
752 | 751 |
753 context->change_observers()->Notify( | 752 context->change_observers()->Notify( |
754 &FileChangeObserver::OnRemoveFile, MakeTuple(url)); | 753 &FileChangeObserver::OnRemoveFile, MakeTuple(url)); |
755 | 754 |
756 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) | 755 if (error == base::File::FILE_ERROR_NOT_FOUND) |
757 return base::PLATFORM_FILE_OK; | 756 return base::File::FILE_OK; |
758 | 757 |
759 error = NativeFileUtil::DeleteFile(local_path); | 758 error = NativeFileUtil::DeleteFile(local_path); |
760 if (base::PLATFORM_FILE_OK != error) | 759 if (base::File::FILE_OK != error) |
761 LOG(WARNING) << "Leaked a backing file."; | 760 LOG(WARNING) << "Leaked a backing file."; |
762 return base::PLATFORM_FILE_OK; | 761 return base::File::FILE_OK; |
763 } | 762 } |
764 | 763 |
765 PlatformFileError ObfuscatedFileUtil::DeleteDirectory( | 764 base::File::Error ObfuscatedFileUtil::DeleteDirectory( |
766 FileSystemOperationContext* context, | 765 FileSystemOperationContext* context, |
767 const FileSystemURL& url) { | 766 const FileSystemURL& url) { |
768 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); | 767 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); |
769 if (!db) | 768 if (!db) |
770 return base::PLATFORM_FILE_ERROR_FAILED; | 769 return base::File::FILE_ERROR_FAILED; |
771 | 770 |
772 FileId file_id; | 771 FileId file_id; |
773 if (!db->GetFileWithPath(url.path(), &file_id)) | 772 if (!db->GetFileWithPath(url.path(), &file_id)) |
774 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 773 return base::File::FILE_ERROR_NOT_FOUND; |
775 FileInfo file_info; | 774 FileInfo file_info; |
776 if (!db->GetFileInfo(file_id, &file_info)) { | 775 if (!db->GetFileInfo(file_id, &file_info)) { |
777 NOTREACHED(); | 776 NOTREACHED(); |
778 return base::PLATFORM_FILE_ERROR_FAILED; | 777 return base::File::FILE_ERROR_FAILED; |
779 } | 778 } |
780 if (!file_info.is_directory()) | 779 if (!file_info.is_directory()) |
781 return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; | 780 return base::File::FILE_ERROR_NOT_A_DIRECTORY; |
782 if (!db->RemoveFileInfo(file_id)) | 781 if (!db->RemoveFileInfo(file_id)) |
783 return base::PLATFORM_FILE_ERROR_NOT_EMPTY; | 782 return base::File::FILE_ERROR_NOT_EMPTY; |
784 int64 growth = -UsageForPath(file_info.name.size()); | 783 int64 growth = -UsageForPath(file_info.name.size()); |
785 AllocateQuota(context, growth); | 784 AllocateQuota(context, growth); |
786 UpdateUsage(context, url, growth); | 785 UpdateUsage(context, url, growth); |
787 TouchDirectory(db, file_info.parent_id); | 786 TouchDirectory(db, file_info.parent_id); |
788 context->change_observers()->Notify( | 787 context->change_observers()->Notify( |
789 &FileChangeObserver::OnRemoveDirectory, MakeTuple(url)); | 788 &FileChangeObserver::OnRemoveDirectory, MakeTuple(url)); |
790 return base::PLATFORM_FILE_OK; | 789 return base::File::FILE_OK; |
791 } | 790 } |
792 | 791 |
793 webkit_blob::ScopedFile ObfuscatedFileUtil::CreateSnapshotFile( | 792 webkit_blob::ScopedFile ObfuscatedFileUtil::CreateSnapshotFile( |
794 FileSystemOperationContext* context, | 793 FileSystemOperationContext* context, |
795 const FileSystemURL& url, | 794 const FileSystemURL& url, |
796 base::PlatformFileError* error, | 795 base::File::Error* error, |
797 base::PlatformFileInfo* file_info, | 796 base::File::Info* file_info, |
798 base::FilePath* platform_path) { | 797 base::FilePath* platform_path) { |
799 // We're just returning the local file information. | 798 // We're just returning the local file information. |
800 *error = GetFileInfo(context, url, file_info, platform_path); | 799 *error = GetFileInfo(context, url, file_info, platform_path); |
801 if (*error == base::PLATFORM_FILE_OK && file_info->is_directory) { | 800 if (*error == base::File::FILE_OK && file_info->is_directory) { |
802 *file_info = base::PlatformFileInfo(); | 801 *file_info = base::File::Info(); |
803 *error = base::PLATFORM_FILE_ERROR_NOT_A_FILE; | 802 *error = base::File::FILE_ERROR_NOT_A_FILE; |
804 } | 803 } |
805 return webkit_blob::ScopedFile(); | 804 return webkit_blob::ScopedFile(); |
806 } | 805 } |
807 | 806 |
808 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> | 807 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> |
809 ObfuscatedFileUtil::CreateFileEnumerator( | 808 ObfuscatedFileUtil::CreateFileEnumerator( |
810 FileSystemOperationContext* context, | 809 FileSystemOperationContext* context, |
811 const FileSystemURL& root_url, | 810 const FileSystemURL& root_url, |
812 bool recursive) { | 811 bool recursive) { |
813 SandboxDirectoryDatabase* db = GetDirectoryDatabase(root_url, false); | 812 SandboxDirectoryDatabase* db = GetDirectoryDatabase(root_url, false); |
(...skipping 25 matching lines...) Expand all Loading... |
839 // TODO(ericu): This could easily be made faster with help from the database. | 838 // TODO(ericu): This could easily be made faster with help from the database. |
840 if (!db->ListChildren(file_id, &children)) | 839 if (!db->ListChildren(file_id, &children)) |
841 return true; | 840 return true; |
842 return children.empty(); | 841 return children.empty(); |
843 } | 842 } |
844 | 843 |
845 base::FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType( | 844 base::FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType( |
846 const GURL& origin, | 845 const GURL& origin, |
847 const std::string& type_string, | 846 const std::string& type_string, |
848 bool create, | 847 bool create, |
849 base::PlatformFileError* error_code) { | 848 base::File::Error* error_code) { |
850 base::FilePath origin_dir = GetDirectoryForOrigin(origin, create, error_code); | 849 base::FilePath origin_dir = GetDirectoryForOrigin(origin, create, error_code); |
851 if (origin_dir.empty()) | 850 if (origin_dir.empty()) |
852 return base::FilePath(); | 851 return base::FilePath(); |
853 if (type_string.empty()) | 852 if (type_string.empty()) |
854 return origin_dir; | 853 return origin_dir; |
855 base::FilePath path = origin_dir.AppendASCII(type_string); | 854 base::FilePath path = origin_dir.AppendASCII(type_string); |
856 base::PlatformFileError error = base::PLATFORM_FILE_OK; | 855 base::File::Error error = base::File::FILE_OK; |
857 if (!base::DirectoryExists(path) && | 856 if (!base::DirectoryExists(path) && |
858 (!create || !base::CreateDirectory(path))) { | 857 (!create || !base::CreateDirectory(path))) { |
859 error = create ? | 858 error = create ? |
860 base::PLATFORM_FILE_ERROR_FAILED : | 859 base::File::FILE_ERROR_FAILED : |
861 base::PLATFORM_FILE_ERROR_NOT_FOUND; | 860 base::File::FILE_ERROR_NOT_FOUND; |
862 } | 861 } |
863 | 862 |
864 if (error_code) | 863 if (error_code) |
865 *error_code = error; | 864 *error_code = error; |
866 return path; | 865 return path; |
867 } | 866 } |
868 | 867 |
869 bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType( | 868 bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType( |
870 const GURL& origin, | 869 const GURL& origin, |
871 const std::string& type_string) { | 870 const std::string& type_string) { |
872 base::PlatformFileError error = base::PLATFORM_FILE_OK; | 871 base::File::Error error = base::File::FILE_OK; |
873 base::FilePath origin_type_path = GetDirectoryForOriginAndType( | 872 base::FilePath origin_type_path = GetDirectoryForOriginAndType( |
874 origin, type_string, false, &error); | 873 origin, type_string, false, &error); |
875 if (origin_type_path.empty()) | 874 if (origin_type_path.empty()) |
876 return true; | 875 return true; |
877 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND) { | 876 if (error != base::File::FILE_ERROR_NOT_FOUND) { |
878 // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase. | 877 // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase. |
879 // We ignore its error now since 1) it doesn't matter the final result, and | 878 // We ignore its error now since 1) it doesn't matter the final result, and |
880 // 2) it always returns false in Windows because of LevelDB's | 879 // 2) it always returns false in Windows because of LevelDB's |
881 // implementation. | 880 // implementation. |
882 // Information about failure would be useful for debugging. | 881 // Information about failure would be useful for debugging. |
883 if (!type_string.empty()) | 882 if (!type_string.empty()) |
884 DestroyDirectoryDatabase(origin, type_string); | 883 DestroyDirectoryDatabase(origin, type_string); |
885 if (!base::DeleteFile(origin_type_path, true /* recursive */)) | 884 if (!base::DeleteFile(origin_type_path, true /* recursive */)) |
886 return false; | 885 return false; |
887 } | 886 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 std::string key = GetDirectoryDatabaseKey(origin, type_string); | 932 std::string key = GetDirectoryDatabaseKey(origin, type_string); |
934 if (key.empty()) | 933 if (key.empty()) |
935 return true; | 934 return true; |
936 DirectoryMap::iterator iter = directories_.find(key); | 935 DirectoryMap::iterator iter = directories_.find(key); |
937 if (iter != directories_.end()) { | 936 if (iter != directories_.end()) { |
938 SandboxDirectoryDatabase* database = iter->second; | 937 SandboxDirectoryDatabase* database = iter->second; |
939 directories_.erase(iter); | 938 directories_.erase(iter); |
940 delete database; | 939 delete database; |
941 } | 940 } |
942 | 941 |
943 PlatformFileError error = base::PLATFORM_FILE_OK; | 942 base::File::Error error = base::File::FILE_OK; |
944 base::FilePath path = GetDirectoryForOriginAndType( | 943 base::FilePath path = GetDirectoryForOriginAndType( |
945 origin, type_string, false, &error); | 944 origin, type_string, false, &error); |
946 if (path.empty() || error == base::PLATFORM_FILE_ERROR_NOT_FOUND) | 945 if (path.empty() || error == base::File::FILE_ERROR_NOT_FOUND) |
947 return true; | 946 return true; |
948 return SandboxDirectoryDatabase::DestroyDatabase(path); | 947 return SandboxDirectoryDatabase::DestroyDatabase(path); |
949 } | 948 } |
950 | 949 |
951 // static | 950 // static |
952 int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) { | 951 int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) { |
953 return UsageForPath(VirtualPath::BaseName(path).value().size()); | 952 return UsageForPath(VirtualPath::BaseName(path).value().size()); |
954 } | 953 } |
955 | 954 |
956 void ObfuscatedFileUtil::MaybePrepopulateDatabase( | 955 void ObfuscatedFileUtil::MaybePrepopulateDatabase( |
957 const std::vector<std::string>& type_strings_to_prepopulate) { | 956 const std::vector<std::string>& type_strings_to_prepopulate) { |
958 SandboxPrioritizedOriginDatabase database(file_system_directory_); | 957 SandboxPrioritizedOriginDatabase database(file_system_directory_); |
959 std::string origin_string = database.GetPrimaryOrigin(); | 958 std::string origin_string = database.GetPrimaryOrigin(); |
960 if (origin_string.empty() || !database.HasOriginPath(origin_string)) | 959 if (origin_string.empty() || !database.HasOriginPath(origin_string)) |
961 return; | 960 return; |
962 const GURL origin = webkit_database::GetOriginFromIdentifier(origin_string); | 961 const GURL origin = webkit_database::GetOriginFromIdentifier(origin_string); |
963 | 962 |
964 // Prepopulate the directory database(s) if and only if this instance | 963 // Prepopulate the directory database(s) if and only if this instance |
965 // has primary origin and the directory database is already there. | 964 // has primary origin and the directory database is already there. |
966 for (size_t i = 0; i < type_strings_to_prepopulate.size(); ++i) { | 965 for (size_t i = 0; i < type_strings_to_prepopulate.size(); ++i) { |
967 const std::string type_string = type_strings_to_prepopulate[i]; | 966 const std::string type_string = type_strings_to_prepopulate[i]; |
968 // Only handles known types. | 967 // Only handles known types. |
969 if (!ContainsKey(known_type_strings_, type_string)) | 968 if (!ContainsKey(known_type_strings_, type_string)) |
970 continue; | 969 continue; |
971 PlatformFileError error = base::PLATFORM_FILE_ERROR_FAILED; | 970 base::File::Error error = base::File::FILE_ERROR_FAILED; |
972 base::FilePath path = GetDirectoryForOriginAndType( | 971 base::FilePath path = GetDirectoryForOriginAndType( |
973 origin, type_string, false, &error); | 972 origin, type_string, false, &error); |
974 if (error != base::PLATFORM_FILE_OK) | 973 if (error != base::File::FILE_OK) |
975 continue; | 974 continue; |
976 scoped_ptr<SandboxDirectoryDatabase> db(new SandboxDirectoryDatabase(path)); | 975 scoped_ptr<SandboxDirectoryDatabase> db(new SandboxDirectoryDatabase(path)); |
977 if (db->Init(SandboxDirectoryDatabase::FAIL_ON_CORRUPTION)) { | 976 if (db->Init(SandboxDirectoryDatabase::FAIL_ON_CORRUPTION)) { |
978 directories_[GetDirectoryDatabaseKey(origin, type_string)] = db.release(); | 977 directories_[GetDirectoryDatabaseKey(origin, type_string)] = db.release(); |
979 MarkUsed(); | 978 MarkUsed(); |
980 // Don't populate more than one database, as it may rather hurt | 979 // Don't populate more than one database, as it may rather hurt |
981 // performance. | 980 // performance. |
982 break; | 981 break; |
983 } | 982 } |
984 } | 983 } |
985 } | 984 } |
986 | 985 |
987 base::FilePath ObfuscatedFileUtil::GetDirectoryForURL( | 986 base::FilePath ObfuscatedFileUtil::GetDirectoryForURL( |
988 const FileSystemURL& url, | 987 const FileSystemURL& url, |
989 bool create, | 988 bool create, |
990 base::PlatformFileError* error_code) { | 989 base::File::Error* error_code) { |
991 return GetDirectoryForOriginAndType( | 990 return GetDirectoryForOriginAndType( |
992 url.origin(), CallGetTypeStringForURL(url), create, error_code); | 991 url.origin(), CallGetTypeStringForURL(url), create, error_code); |
993 } | 992 } |
994 | 993 |
995 std::string ObfuscatedFileUtil::CallGetTypeStringForURL( | 994 std::string ObfuscatedFileUtil::CallGetTypeStringForURL( |
996 const FileSystemURL& url) { | 995 const FileSystemURL& url) { |
997 DCHECK(!get_type_string_for_url_.is_null()); | 996 DCHECK(!get_type_string_for_url_.is_null()); |
998 return get_type_string_for_url_.Run(url); | 997 return get_type_string_for_url_.Run(url); |
999 } | 998 } |
1000 | 999 |
1001 PlatformFileError ObfuscatedFileUtil::GetFileInfoInternal( | 1000 base::File::Error ObfuscatedFileUtil::GetFileInfoInternal( |
1002 SandboxDirectoryDatabase* db, | 1001 SandboxDirectoryDatabase* db, |
1003 FileSystemOperationContext* context, | 1002 FileSystemOperationContext* context, |
1004 const FileSystemURL& url, | 1003 const FileSystemURL& url, |
1005 FileId file_id, | 1004 FileId file_id, |
1006 FileInfo* local_info, | 1005 FileInfo* local_info, |
1007 base::PlatformFileInfo* file_info, | 1006 base::File::Info* file_info, |
1008 base::FilePath* platform_file_path) { | 1007 base::FilePath* platform_file_path) { |
1009 DCHECK(db); | 1008 DCHECK(db); |
1010 DCHECK(context); | 1009 DCHECK(context); |
1011 DCHECK(file_info); | 1010 DCHECK(file_info); |
1012 DCHECK(platform_file_path); | 1011 DCHECK(platform_file_path); |
1013 | 1012 |
1014 if (!db->GetFileInfo(file_id, local_info)) { | 1013 if (!db->GetFileInfo(file_id, local_info)) { |
1015 NOTREACHED(); | 1014 NOTREACHED(); |
1016 return base::PLATFORM_FILE_ERROR_FAILED; | 1015 return base::File::FILE_ERROR_FAILED; |
1017 } | 1016 } |
1018 | 1017 |
1019 if (local_info->is_directory()) { | 1018 if (local_info->is_directory()) { |
1020 file_info->size = 0; | 1019 file_info->size = 0; |
1021 file_info->is_directory = true; | 1020 file_info->is_directory = true; |
1022 file_info->is_symbolic_link = false; | 1021 file_info->is_symbolic_link = false; |
1023 file_info->last_modified = local_info->modification_time; | 1022 file_info->last_modified = local_info->modification_time; |
1024 *platform_file_path = base::FilePath(); | 1023 *platform_file_path = base::FilePath(); |
1025 // We don't fill in ctime or atime. | 1024 // We don't fill in ctime or atime. |
1026 return base::PLATFORM_FILE_OK; | 1025 return base::File::FILE_OK; |
1027 } | 1026 } |
1028 if (local_info->data_path.empty()) | 1027 if (local_info->data_path.empty()) |
1029 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; | 1028 return base::File::FILE_ERROR_INVALID_OPERATION; |
1030 base::FilePath local_path = DataPathToLocalPath(url, local_info->data_path); | 1029 base::FilePath local_path = DataPathToLocalPath(url, local_info->data_path); |
1031 base::PlatformFileError error = NativeFileUtil::GetFileInfo( | 1030 base::File::Error error = NativeFileUtil::GetFileInfo( |
1032 local_path, file_info); | 1031 local_path, file_info); |
1033 // We should not follow symbolic links in sandboxed file system. | 1032 // We should not follow symbolic links in sandboxed file system. |
1034 if (base::IsLink(local_path)) { | 1033 if (base::IsLink(local_path)) { |
1035 LOG(WARNING) << "Found a symbolic file."; | 1034 LOG(WARNING) << "Found a symbolic file."; |
1036 error = base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1035 error = base::File::FILE_ERROR_NOT_FOUND; |
1037 } | 1036 } |
1038 if (error == base::PLATFORM_FILE_OK) { | 1037 if (error == base::File::FILE_OK) { |
1039 *platform_file_path = local_path; | 1038 *platform_file_path = local_path; |
1040 } else if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) { | 1039 } else if (error == base::File::FILE_ERROR_NOT_FOUND) { |
1041 LOG(WARNING) << "Lost a backing file."; | 1040 LOG(WARNING) << "Lost a backing file."; |
1042 InvalidateUsageCache(context, url.origin(), url.type()); | 1041 InvalidateUsageCache(context, url.origin(), url.type()); |
1043 if (!db->RemoveFileInfo(file_id)) | 1042 if (!db->RemoveFileInfo(file_id)) |
1044 return base::PLATFORM_FILE_ERROR_FAILED; | 1043 return base::File::FILE_ERROR_FAILED; |
1045 } | 1044 } |
1046 return error; | 1045 return error; |
1047 } | 1046 } |
1048 | 1047 |
1049 PlatformFileError ObfuscatedFileUtil::CreateFile( | 1048 base::File::Error ObfuscatedFileUtil::CreateFile( |
1050 FileSystemOperationContext* context, | 1049 FileSystemOperationContext* context, |
1051 const base::FilePath& src_file_path, | 1050 const base::FilePath& src_file_path, |
1052 const FileSystemURL& dest_url, | 1051 const FileSystemURL& dest_url, |
1053 FileInfo* dest_file_info, int file_flags, PlatformFile* handle) { | 1052 FileInfo* dest_file_info, int file_flags, PlatformFile* handle) { |
1054 if (handle) | 1053 if (handle) |
1055 *handle = base::kInvalidPlatformFileValue; | 1054 *handle = base::kInvalidPlatformFileValue; |
1056 SandboxDirectoryDatabase* db = GetDirectoryDatabase(dest_url, true); | 1055 SandboxDirectoryDatabase* db = GetDirectoryDatabase(dest_url, true); |
1057 | 1056 |
1058 PlatformFileError error = base::PLATFORM_FILE_OK; | 1057 base::File::Error error = base::File::FILE_OK; |
1059 base::FilePath root = GetDirectoryForURL(dest_url, false, &error); | 1058 base::FilePath root = GetDirectoryForURL(dest_url, false, &error); |
1060 if (error != base::PLATFORM_FILE_OK) | 1059 if (error != base::File::FILE_OK) |
1061 return error; | 1060 return error; |
1062 | 1061 |
1063 base::FilePath dest_local_path; | 1062 base::FilePath dest_local_path; |
1064 error = GenerateNewLocalPath(db, context, dest_url, &dest_local_path); | 1063 error = GenerateNewLocalPath(db, context, dest_url, &dest_local_path); |
1065 if (error != base::PLATFORM_FILE_OK) | 1064 if (error != base::File::FILE_OK) |
1066 return error; | 1065 return error; |
1067 | 1066 |
1068 bool created = false; | 1067 bool created = false; |
1069 if (!src_file_path.empty()) { | 1068 if (!src_file_path.empty()) { |
1070 DCHECK(!file_flags); | 1069 DCHECK(!file_flags); |
1071 DCHECK(!handle); | 1070 DCHECK(!handle); |
1072 error = NativeFileUtil::CopyOrMoveFile( | 1071 error = NativeFileUtil::CopyOrMoveFile( |
1073 src_file_path, dest_local_path, | 1072 src_file_path, dest_local_path, |
1074 FileSystemOperation::OPTION_NONE, | 1073 FileSystemOperation::OPTION_NONE, |
1075 fileapi::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, | 1074 fileapi::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, |
1076 true /* copy */)); | 1075 true /* copy */)); |
1077 created = true; | 1076 created = true; |
1078 } else { | 1077 } else { |
1079 if (base::PathExists(dest_local_path)) { | 1078 if (base::PathExists(dest_local_path)) { |
1080 if (!base::DeleteFile(dest_local_path, true /* recursive */)) { | 1079 if (!base::DeleteFile(dest_local_path, true /* recursive */)) { |
1081 NOTREACHED(); | 1080 NOTREACHED(); |
1082 return base::PLATFORM_FILE_ERROR_FAILED; | 1081 return base::File::FILE_ERROR_FAILED; |
1083 } | 1082 } |
1084 LOG(WARNING) << "A stray file detected"; | 1083 LOG(WARNING) << "A stray file detected"; |
1085 InvalidateUsageCache(context, dest_url.origin(), dest_url.type()); | 1084 InvalidateUsageCache(context, dest_url.origin(), dest_url.type()); |
1086 } | 1085 } |
1087 | 1086 |
1088 if (handle) { | 1087 if (handle) { |
1089 error = NativeFileUtil::CreateOrOpen( | 1088 error = NativeFileUtil::CreateOrOpen( |
1090 dest_local_path, file_flags, handle, &created); | 1089 dest_local_path, file_flags, handle, &created); |
1091 // If this succeeds, we must close handle on any subsequent error. | 1090 // If this succeeds, we must close handle on any subsequent error. |
1092 } else { | 1091 } else { |
1093 DCHECK(!file_flags); // file_flags is only used by CreateOrOpen. | 1092 DCHECK(!file_flags); // file_flags is only used by CreateOrOpen. |
1094 error = NativeFileUtil::EnsureFileExists(dest_local_path, &created); | 1093 error = NativeFileUtil::EnsureFileExists(dest_local_path, &created); |
1095 } | 1094 } |
1096 } | 1095 } |
1097 if (error != base::PLATFORM_FILE_OK) | 1096 if (error != base::File::FILE_OK) |
1098 return error; | 1097 return error; |
1099 | 1098 |
1100 if (!created) { | 1099 if (!created) { |
1101 NOTREACHED(); | 1100 NOTREACHED(); |
1102 if (handle) { | 1101 if (handle) { |
1103 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); | 1102 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); |
1104 base::ClosePlatformFile(*handle); | 1103 base::ClosePlatformFile(*handle); |
1105 base::DeleteFile(dest_local_path, false /* recursive */); | 1104 base::DeleteFile(dest_local_path, false /* recursive */); |
1106 *handle = base::kInvalidPlatformFileValue; | 1105 *handle = base::kInvalidPlatformFileValue; |
1107 } | 1106 } |
1108 return base::PLATFORM_FILE_ERROR_FAILED; | 1107 return base::File::FILE_ERROR_FAILED; |
1109 } | 1108 } |
1110 | 1109 |
1111 // This removes the root, including the trailing slash, leaving a relative | 1110 // This removes the root, including the trailing slash, leaving a relative |
1112 // path. | 1111 // path. |
1113 dest_file_info->data_path = base::FilePath( | 1112 dest_file_info->data_path = base::FilePath( |
1114 dest_local_path.value().substr(root.value().length() + 1)); | 1113 dest_local_path.value().substr(root.value().length() + 1)); |
1115 | 1114 |
1116 FileId file_id; | 1115 FileId file_id; |
1117 error = db->AddFileInfo(*dest_file_info, &file_id); | 1116 error = db->AddFileInfo(*dest_file_info, &file_id); |
1118 if (error != base::PLATFORM_FILE_OK) { | 1117 if (error != base::File::FILE_OK) { |
1119 if (handle) { | 1118 if (handle) { |
1120 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); | 1119 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); |
1121 base::ClosePlatformFile(*handle); | 1120 base::ClosePlatformFile(*handle); |
1122 *handle = base::kInvalidPlatformFileValue; | 1121 *handle = base::kInvalidPlatformFileValue; |
1123 } | 1122 } |
1124 base::DeleteFile(dest_local_path, false /* recursive */); | 1123 base::DeleteFile(dest_local_path, false /* recursive */); |
1125 return error; | 1124 return error; |
1126 } | 1125 } |
1127 TouchDirectory(db, dest_file_info->parent_id); | 1126 TouchDirectory(db, dest_file_info->parent_id); |
1128 | 1127 |
1129 return base::PLATFORM_FILE_OK; | 1128 return base::File::FILE_OK; |
1130 } | 1129 } |
1131 | 1130 |
1132 base::FilePath ObfuscatedFileUtil::DataPathToLocalPath( | 1131 base::FilePath ObfuscatedFileUtil::DataPathToLocalPath( |
1133 const FileSystemURL& url, const base::FilePath& data_path) { | 1132 const FileSystemURL& url, const base::FilePath& data_path) { |
1134 PlatformFileError error = base::PLATFORM_FILE_OK; | 1133 base::File::Error error = base::File::FILE_OK; |
1135 base::FilePath root = GetDirectoryForURL(url, false, &error); | 1134 base::FilePath root = GetDirectoryForURL(url, false, &error); |
1136 if (error != base::PLATFORM_FILE_OK) | 1135 if (error != base::File::FILE_OK) |
1137 return base::FilePath(); | 1136 return base::FilePath(); |
1138 return root.Append(data_path); | 1137 return root.Append(data_path); |
1139 } | 1138 } |
1140 | 1139 |
1141 std::string ObfuscatedFileUtil::GetDirectoryDatabaseKey( | 1140 std::string ObfuscatedFileUtil::GetDirectoryDatabaseKey( |
1142 const GURL& origin, const std::string& type_string) { | 1141 const GURL& origin, const std::string& type_string) { |
1143 if (type_string.empty()) { | 1142 if (type_string.empty()) { |
1144 LOG(WARNING) << "Unknown filesystem type requested:" << type_string; | 1143 LOG(WARNING) << "Unknown filesystem type requested:" << type_string; |
1145 return std::string(); | 1144 return std::string(); |
1146 } | 1145 } |
(...skipping 12 matching lines...) Expand all Loading... |
1159 url.origin(), CallGetTypeStringForURL(url)); | 1158 url.origin(), CallGetTypeStringForURL(url)); |
1160 if (key.empty()) | 1159 if (key.empty()) |
1161 return NULL; | 1160 return NULL; |
1162 | 1161 |
1163 DirectoryMap::iterator iter = directories_.find(key); | 1162 DirectoryMap::iterator iter = directories_.find(key); |
1164 if (iter != directories_.end()) { | 1163 if (iter != directories_.end()) { |
1165 MarkUsed(); | 1164 MarkUsed(); |
1166 return iter->second; | 1165 return iter->second; |
1167 } | 1166 } |
1168 | 1167 |
1169 PlatformFileError error = base::PLATFORM_FILE_OK; | 1168 base::File::Error error = base::File::FILE_OK; |
1170 base::FilePath path = GetDirectoryForURL(url, create, &error); | 1169 base::FilePath path = GetDirectoryForURL(url, create, &error); |
1171 if (error != base::PLATFORM_FILE_OK) { | 1170 if (error != base::File::FILE_OK) { |
1172 LOG(WARNING) << "Failed to get origin+type directory: " | 1171 LOG(WARNING) << "Failed to get origin+type directory: " |
1173 << url.DebugString() << " error:" << error; | 1172 << url.DebugString() << " error:" << error; |
1174 return NULL; | 1173 return NULL; |
1175 } | 1174 } |
1176 MarkUsed(); | 1175 MarkUsed(); |
1177 SandboxDirectoryDatabase* database = new SandboxDirectoryDatabase(path); | 1176 SandboxDirectoryDatabase* database = new SandboxDirectoryDatabase(path); |
1178 directories_[key] = database; | 1177 directories_[key] = database; |
1179 return database; | 1178 return database; |
1180 } | 1179 } |
1181 | 1180 |
1182 base::FilePath ObfuscatedFileUtil::GetDirectoryForOrigin( | 1181 base::FilePath ObfuscatedFileUtil::GetDirectoryForOrigin( |
1183 const GURL& origin, bool create, base::PlatformFileError* error_code) { | 1182 const GURL& origin, bool create, base::File::Error* error_code) { |
1184 if (!InitOriginDatabase(origin, create)) { | 1183 if (!InitOriginDatabase(origin, create)) { |
1185 if (error_code) { | 1184 if (error_code) { |
1186 *error_code = create ? | 1185 *error_code = create ? |
1187 base::PLATFORM_FILE_ERROR_FAILED : | 1186 base::File::FILE_ERROR_FAILED : |
1188 base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1187 base::File::FILE_ERROR_NOT_FOUND; |
1189 } | 1188 } |
1190 return base::FilePath(); | 1189 return base::FilePath(); |
1191 } | 1190 } |
1192 base::FilePath directory_name; | 1191 base::FilePath directory_name; |
1193 std::string id = webkit_database::GetIdentifierFromOrigin(origin); | 1192 std::string id = webkit_database::GetIdentifierFromOrigin(origin); |
1194 | 1193 |
1195 bool exists_in_db = origin_database_->HasOriginPath(id); | 1194 bool exists_in_db = origin_database_->HasOriginPath(id); |
1196 if (!exists_in_db && !create) { | 1195 if (!exists_in_db && !create) { |
1197 if (error_code) | 1196 if (error_code) |
1198 *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1197 *error_code = base::File::FILE_ERROR_NOT_FOUND; |
1199 return base::FilePath(); | 1198 return base::FilePath(); |
1200 } | 1199 } |
1201 if (!origin_database_->GetPathForOrigin(id, &directory_name)) { | 1200 if (!origin_database_->GetPathForOrigin(id, &directory_name)) { |
1202 if (error_code) | 1201 if (error_code) |
1203 *error_code = base::PLATFORM_FILE_ERROR_FAILED; | 1202 *error_code = base::File::FILE_ERROR_FAILED; |
1204 return base::FilePath(); | 1203 return base::FilePath(); |
1205 } | 1204 } |
1206 | 1205 |
1207 base::FilePath path = file_system_directory_.Append(directory_name); | 1206 base::FilePath path = file_system_directory_.Append(directory_name); |
1208 bool exists_in_fs = base::DirectoryExists(path); | 1207 bool exists_in_fs = base::DirectoryExists(path); |
1209 if (!exists_in_db && exists_in_fs) { | 1208 if (!exists_in_db && exists_in_fs) { |
1210 if (!base::DeleteFile(path, true)) { | 1209 if (!base::DeleteFile(path, true)) { |
1211 if (error_code) | 1210 if (error_code) |
1212 *error_code = base::PLATFORM_FILE_ERROR_FAILED; | 1211 *error_code = base::File::FILE_ERROR_FAILED; |
1213 return base::FilePath(); | 1212 return base::FilePath(); |
1214 } | 1213 } |
1215 exists_in_fs = false; | 1214 exists_in_fs = false; |
1216 } | 1215 } |
1217 | 1216 |
1218 if (!exists_in_fs) { | 1217 if (!exists_in_fs) { |
1219 if (!create || !base::CreateDirectory(path)) { | 1218 if (!create || !base::CreateDirectory(path)) { |
1220 if (error_code) | 1219 if (error_code) |
1221 *error_code = create ? | 1220 *error_code = create ? |
1222 base::PLATFORM_FILE_ERROR_FAILED : | 1221 base::File::FILE_ERROR_FAILED : |
1223 base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1222 base::File::FILE_ERROR_NOT_FOUND; |
1224 return base::FilePath(); | 1223 return base::FilePath(); |
1225 } | 1224 } |
1226 } | 1225 } |
1227 | 1226 |
1228 if (error_code) | 1227 if (error_code) |
1229 *error_code = base::PLATFORM_FILE_OK; | 1228 *error_code = base::File::FILE_OK; |
1230 | 1229 |
1231 return path; | 1230 return path; |
1232 } | 1231 } |
1233 | 1232 |
1234 void ObfuscatedFileUtil::InvalidateUsageCache( | 1233 void ObfuscatedFileUtil::InvalidateUsageCache( |
1235 FileSystemOperationContext* context, | 1234 FileSystemOperationContext* context, |
1236 const GURL& origin, | 1235 const GURL& origin, |
1237 FileSystemType type) { | 1236 FileSystemType type) { |
1238 if (sandbox_delegate_) | 1237 if (sandbox_delegate_) |
1239 sandbox_delegate_->InvalidateUsageCache(origin, type); | 1238 sandbox_delegate_->InvalidateUsageCache(origin, type); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1294 file_system_directory_, | 1293 file_system_directory_, |
1295 prioritized_origin_database->GetSandboxOriginDatabase()); | 1294 prioritized_origin_database->GetSandboxOriginDatabase()); |
1296 } | 1295 } |
1297 | 1296 |
1298 prioritized_origin_database->InitializePrimaryOrigin( | 1297 prioritized_origin_database->InitializePrimaryOrigin( |
1299 isolated_origin_string); | 1298 isolated_origin_string); |
1300 | 1299 |
1301 return true; | 1300 return true; |
1302 } | 1301 } |
1303 | 1302 |
1304 PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath( | 1303 base::File::Error ObfuscatedFileUtil::GenerateNewLocalPath( |
1305 SandboxDirectoryDatabase* db, | 1304 SandboxDirectoryDatabase* db, |
1306 FileSystemOperationContext* context, | 1305 FileSystemOperationContext* context, |
1307 const FileSystemURL& url, | 1306 const FileSystemURL& url, |
1308 base::FilePath* local_path) { | 1307 base::FilePath* local_path) { |
1309 DCHECK(local_path); | 1308 DCHECK(local_path); |
1310 int64 number; | 1309 int64 number; |
1311 if (!db || !db->GetNextInteger(&number)) | 1310 if (!db || !db->GetNextInteger(&number)) |
1312 return base::PLATFORM_FILE_ERROR_FAILED; | 1311 return base::File::FILE_ERROR_FAILED; |
1313 | 1312 |
1314 PlatformFileError error = base::PLATFORM_FILE_OK; | 1313 base::File::Error error = base::File::FILE_OK; |
1315 base::FilePath new_local_path = GetDirectoryForURL(url, false, &error); | 1314 base::FilePath new_local_path = GetDirectoryForURL(url, false, &error); |
1316 if (error != base::PLATFORM_FILE_OK) | 1315 if (error != base::File::FILE_OK) |
1317 return base::PLATFORM_FILE_ERROR_FAILED; | 1316 return base::File::FILE_ERROR_FAILED; |
1318 | 1317 |
1319 // We use the third- and fourth-to-last digits as the directory. | 1318 // We use the third- and fourth-to-last digits as the directory. |
1320 int64 directory_number = number % 10000 / 100; | 1319 int64 directory_number = number % 10000 / 100; |
1321 new_local_path = new_local_path.AppendASCII( | 1320 new_local_path = new_local_path.AppendASCII( |
1322 base::StringPrintf("%02" PRId64, directory_number)); | 1321 base::StringPrintf("%02" PRId64, directory_number)); |
1323 | 1322 |
1324 error = NativeFileUtil::CreateDirectory( | 1323 error = NativeFileUtil::CreateDirectory( |
1325 new_local_path, false /* exclusive */, false /* recursive */); | 1324 new_local_path, false /* exclusive */, false /* recursive */); |
1326 if (error != base::PLATFORM_FILE_OK) | 1325 if (error != base::File::FILE_OK) |
1327 return error; | 1326 return error; |
1328 | 1327 |
1329 *local_path = | 1328 *local_path = |
1330 new_local_path.AppendASCII(base::StringPrintf("%08" PRId64, number)); | 1329 new_local_path.AppendASCII(base::StringPrintf("%08" PRId64, number)); |
1331 return base::PLATFORM_FILE_OK; | 1330 return base::File::FILE_OK; |
1332 } | 1331 } |
1333 | 1332 |
1334 PlatformFileError ObfuscatedFileUtil::CreateOrOpenInternal( | 1333 base::File::Error ObfuscatedFileUtil::CreateOrOpenInternal( |
1335 FileSystemOperationContext* context, | 1334 FileSystemOperationContext* context, |
1336 const FileSystemURL& url, int file_flags, | 1335 const FileSystemURL& url, int file_flags, |
1337 PlatformFile* file_handle, bool* created) { | 1336 PlatformFile* file_handle, bool* created) { |
1338 DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE | | 1337 DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE | |
1339 base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ | | 1338 base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ | |
1340 base::PLATFORM_FILE_EXCLUSIVE_WRITE))); | 1339 base::PLATFORM_FILE_EXCLUSIVE_WRITE))); |
1341 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); | 1340 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); |
1342 if (!db) | 1341 if (!db) |
1343 return base::PLATFORM_FILE_ERROR_FAILED; | 1342 return base::File::FILE_ERROR_FAILED; |
1344 FileId file_id; | 1343 FileId file_id; |
1345 if (!db->GetFileWithPath(url.path(), &file_id)) { | 1344 if (!db->GetFileWithPath(url.path(), &file_id)) { |
1346 // The file doesn't exist. | 1345 // The file doesn't exist. |
1347 if (!(file_flags & (base::PLATFORM_FILE_CREATE | | 1346 if (!(file_flags & (base::PLATFORM_FILE_CREATE | |
1348 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS))) | 1347 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS))) |
1349 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1348 return base::File::FILE_ERROR_NOT_FOUND; |
1350 FileId parent_id; | 1349 FileId parent_id; |
1351 if (!db->GetFileWithPath(VirtualPath::DirName(url.path()), | 1350 if (!db->GetFileWithPath(VirtualPath::DirName(url.path()), |
1352 &parent_id)) | 1351 &parent_id)) |
1353 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1352 return base::File::FILE_ERROR_NOT_FOUND; |
1354 FileInfo file_info; | 1353 FileInfo file_info; |
1355 InitFileInfo(&file_info, parent_id, | 1354 InitFileInfo(&file_info, parent_id, |
1356 VirtualPath::BaseName(url.path()).value()); | 1355 VirtualPath::BaseName(url.path()).value()); |
1357 | 1356 |
1358 int64 growth = UsageForPath(file_info.name.size()); | 1357 int64 growth = UsageForPath(file_info.name.size()); |
1359 if (!AllocateQuota(context, growth)) | 1358 if (!AllocateQuota(context, growth)) |
1360 return base::PLATFORM_FILE_ERROR_NO_SPACE; | 1359 return base::File::FILE_ERROR_NO_SPACE; |
1361 PlatformFileError error = CreateFile( | 1360 base::File::Error error = CreateFile( |
1362 context, base::FilePath(), | 1361 context, base::FilePath(), |
1363 url, &file_info, file_flags, file_handle); | 1362 url, &file_info, file_flags, file_handle); |
1364 if (created && base::PLATFORM_FILE_OK == error) { | 1363 if (created && base::File::FILE_OK == error) { |
1365 *created = true; | 1364 *created = true; |
1366 UpdateUsage(context, url, growth); | 1365 UpdateUsage(context, url, growth); |
1367 context->change_observers()->Notify( | 1366 context->change_observers()->Notify( |
1368 &FileChangeObserver::OnCreateFile, MakeTuple(url)); | 1367 &FileChangeObserver::OnCreateFile, MakeTuple(url)); |
1369 } | 1368 } |
1370 return error; | 1369 return error; |
1371 } | 1370 } |
1372 | 1371 |
1373 if (file_flags & base::PLATFORM_FILE_CREATE) | 1372 if (file_flags & base::PLATFORM_FILE_CREATE) |
1374 return base::PLATFORM_FILE_ERROR_EXISTS; | 1373 return base::File::FILE_ERROR_EXISTS; |
1375 | 1374 |
1376 base::PlatformFileInfo platform_file_info; | 1375 base::File::Info platform_file_info; |
1377 base::FilePath local_path; | 1376 base::FilePath local_path; |
1378 FileInfo file_info; | 1377 FileInfo file_info; |
1379 base::PlatformFileError error = GetFileInfoInternal( | 1378 base::File::Error error = GetFileInfoInternal( |
1380 db, context, url, file_id, &file_info, &platform_file_info, &local_path); | 1379 db, context, url, file_id, &file_info, &platform_file_info, &local_path); |
1381 if (error != base::PLATFORM_FILE_OK) | 1380 if (error != base::File::FILE_OK) |
1382 return error; | 1381 return error; |
1383 if (file_info.is_directory()) | 1382 if (file_info.is_directory()) |
1384 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; | 1383 return base::File::FILE_ERROR_NOT_A_FILE; |
1385 | 1384 |
1386 int64 delta = 0; | 1385 int64 delta = 0; |
1387 if (file_flags & (base::PLATFORM_FILE_CREATE_ALWAYS | | 1386 if (file_flags & (base::PLATFORM_FILE_CREATE_ALWAYS | |
1388 base::PLATFORM_FILE_OPEN_TRUNCATED)) { | 1387 base::PLATFORM_FILE_OPEN_TRUNCATED)) { |
1389 // The file exists and we're truncating. | 1388 // The file exists and we're truncating. |
1390 delta = -platform_file_info.size; | 1389 delta = -platform_file_info.size; |
1391 AllocateQuota(context, delta); | 1390 AllocateQuota(context, delta); |
1392 } | 1391 } |
1393 | 1392 |
1394 error = NativeFileUtil::CreateOrOpen( | 1393 error = NativeFileUtil::CreateOrOpen( |
1395 local_path, file_flags, file_handle, created); | 1394 local_path, file_flags, file_handle, created); |
1396 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) { | 1395 if (error == base::File::FILE_ERROR_NOT_FOUND) { |
1397 // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. | 1396 // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. |
1398 // TODO(tzik): Delete database entry after ensuring the file lost. | 1397 // TODO(tzik): Delete database entry after ensuring the file lost. |
1399 InvalidateUsageCache(context, url.origin(), url.type()); | 1398 InvalidateUsageCache(context, url.origin(), url.type()); |
1400 LOG(WARNING) << "Lost a backing file."; | 1399 LOG(WARNING) << "Lost a backing file."; |
1401 error = base::PLATFORM_FILE_ERROR_FAILED; | 1400 error = base::File::FILE_ERROR_FAILED; |
1402 } | 1401 } |
1403 | 1402 |
1404 // If truncating we need to update the usage. | 1403 // If truncating we need to update the usage. |
1405 if (error == base::PLATFORM_FILE_OK && delta) { | 1404 if (error == base::File::FILE_OK && delta) { |
1406 UpdateUsage(context, url, delta); | 1405 UpdateUsage(context, url, delta); |
1407 context->change_observers()->Notify( | 1406 context->change_observers()->Notify( |
1408 &FileChangeObserver::OnModifyFile, MakeTuple(url)); | 1407 &FileChangeObserver::OnModifyFile, MakeTuple(url)); |
1409 } | 1408 } |
1410 return error; | 1409 return error; |
1411 } | 1410 } |
1412 | 1411 |
1413 bool ObfuscatedFileUtil::HasIsolatedStorage(const GURL& origin) { | 1412 bool ObfuscatedFileUtil::HasIsolatedStorage(const GURL& origin) { |
1414 return special_storage_policy_.get() && | 1413 return special_storage_policy_.get() && |
1415 special_storage_policy_->HasIsolatedStorage(origin); | 1414 special_storage_policy_->HasIsolatedStorage(origin); |
1416 } | 1415 } |
1417 | 1416 |
1418 } // namespace fileapi | 1417 } // namespace fileapi |
OLD | NEW |