Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Side by Side Diff: webkit/fileapi/obfuscated_file_system_file_util.cc

Issue 7307013: Do not create a new directory database for read operations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/fileapi/obfuscated_file_system_file_util.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/fileapi/obfuscated_file_system_file_util.h" 5 #include "webkit/fileapi/obfuscated_file_system_file_util.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 DropDatabases(); 62 DropDatabases();
63 } 63 }
64 64
65 PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen( 65 PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen(
66 FileSystemOperationContext* context, 66 FileSystemOperationContext* context,
67 const FilePath& virtual_path, int file_flags, 67 const FilePath& virtual_path, int file_flags,
68 PlatformFile* file_handle, bool* created) { 68 PlatformFile* file_handle, bool* created) {
69 DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE | 69 DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE |
70 base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ | 70 base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ |
71 base::PLATFORM_FILE_EXCLUSIVE_WRITE))); 71 base::PLATFORM_FILE_EXCLUSIVE_WRITE)));
72 FileSystemDirectoryDatabase* db = 72 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
73 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 73 context->src_origin_url(), context->src_type(), true);
74 if (!db) 74 if (!db)
75 return base::PLATFORM_FILE_ERROR_FAILED; 75 return base::PLATFORM_FILE_ERROR_FAILED;
76 FileId file_id; 76 FileId file_id;
77 if (!db->GetFileWithPath(virtual_path, &file_id)) { 77 if (!db->GetFileWithPath(virtual_path, &file_id)) {
78 // The file doesn't exist. 78 // The file doesn't exist.
79 if (!(file_flags & (base::PLATFORM_FILE_CREATE | 79 if (!(file_flags & (base::PLATFORM_FILE_CREATE |
80 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS))) 80 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS)))
81 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 81 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
82 FileId parent_id; 82 FileId parent_id;
83 if (!db->GetFileWithPath(virtual_path.DirName(), &parent_id)) 83 if (!db->GetFileWithPath(virtual_path.DirName(), &parent_id))
(...skipping 20 matching lines...) Expand all
104 FilePath data_path = DataPathToLocalPath(context->src_origin_url(), 104 FilePath data_path = DataPathToLocalPath(context->src_origin_url(),
105 context->src_type(), file_info.data_path); 105 context->src_type(), file_info.data_path);
106 return QuotaFileUtil::GetInstance()->CreateOrOpen( 106 return QuotaFileUtil::GetInstance()->CreateOrOpen(
107 context, data_path, file_flags, file_handle, created); 107 context, data_path, file_flags, file_handle, created);
108 } 108 }
109 109
110 PlatformFileError ObfuscatedFileSystemFileUtil::EnsureFileExists( 110 PlatformFileError ObfuscatedFileSystemFileUtil::EnsureFileExists(
111 FileSystemOperationContext* context, 111 FileSystemOperationContext* context,
112 const FilePath& virtual_path, 112 const FilePath& virtual_path,
113 bool* created) { 113 bool* created) {
114 FileSystemDirectoryDatabase* db = 114 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
115 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 115 context->src_origin_url(), context->src_type(), true);
116 if (!db) 116 if (!db)
117 return base::PLATFORM_FILE_ERROR_FAILED; 117 return base::PLATFORM_FILE_ERROR_FAILED;
118 FileId file_id; 118 FileId file_id;
119 if (db->GetFileWithPath(virtual_path, &file_id)) { 119 if (db->GetFileWithPath(virtual_path, &file_id)) {
120 FileInfo file_info; 120 FileInfo file_info;
121 if (!db->GetFileInfo(file_id, &file_info)) { 121 if (!db->GetFileInfo(file_id, &file_info)) {
122 NOTREACHED(); 122 NOTREACHED();
123 return base::PLATFORM_FILE_ERROR_FAILED; 123 return base::PLATFORM_FILE_ERROR_FAILED;
124 } 124 }
125 if (file_info.is_directory()) 125 if (file_info.is_directory())
(...skipping 27 matching lines...) Expand all
153 153
154 *local_path = path; 154 *local_path = path;
155 return base::PLATFORM_FILE_OK; 155 return base::PLATFORM_FILE_OK;
156 } 156 }
157 157
158 PlatformFileError ObfuscatedFileSystemFileUtil::GetFileInfo( 158 PlatformFileError ObfuscatedFileSystemFileUtil::GetFileInfo(
159 FileSystemOperationContext* context, 159 FileSystemOperationContext* context,
160 const FilePath& virtual_path, 160 const FilePath& virtual_path,
161 base::PlatformFileInfo* file_info, 161 base::PlatformFileInfo* file_info,
162 FilePath* platform_file_path) { 162 FilePath* platform_file_path) {
163 FileSystemDirectoryDatabase* db = 163 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
164 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 164 context->src_origin_url(), context->src_type(), false);
165 if (!db) 165 if (!db)
166 return base::PLATFORM_FILE_ERROR_FAILED; 166 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
167 FileId file_id; 167 FileId file_id;
168 if (!db->GetFileWithPath(virtual_path, &file_id)) 168 if (!db->GetFileWithPath(virtual_path, &file_id))
169 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 169 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
170 FileInfo local_info; 170 FileInfo local_info;
171 if (!db->GetFileInfo(file_id, &local_info)) { 171 if (!db->GetFileInfo(file_id, &local_info)) {
172 NOTREACHED(); 172 NOTREACHED();
173 return base::PLATFORM_FILE_ERROR_FAILED; 173 return base::PLATFORM_FILE_ERROR_FAILED;
174 } 174 }
175 if (local_info.is_directory()) { 175 if (local_info.is_directory()) {
176 file_info->is_directory = true; 176 file_info->is_directory = true;
177 file_info->is_symbolic_link = false; 177 file_info->is_symbolic_link = false;
178 file_info->last_modified = local_info.modification_time; 178 file_info->last_modified = local_info.modification_time;
179 *platform_file_path = FilePath(); 179 *platform_file_path = FilePath();
180 // We don't fill in ctime or atime. 180 // We don't fill in ctime or atime.
181 return base::PLATFORM_FILE_OK; 181 return base::PLATFORM_FILE_OK;
182 } 182 }
183 if (local_info.data_path.empty()) 183 if (local_info.data_path.empty())
184 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; 184 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
185 FilePath data_path = DataPathToLocalPath(context->src_origin_url(), 185 FilePath data_path = DataPathToLocalPath(context->src_origin_url(),
186 context->src_type(), local_info.data_path); 186 context->src_type(), local_info.data_path);
187 return QuotaFileUtil::GetInstance()->GetFileInfo( 187 return QuotaFileUtil::GetInstance()->GetFileInfo(
188 context, data_path, file_info, platform_file_path); 188 context, data_path, file_info, platform_file_path);
189 } 189 }
190 190
191 PlatformFileError ObfuscatedFileSystemFileUtil::ReadDirectory( 191 PlatformFileError ObfuscatedFileSystemFileUtil::ReadDirectory(
192 FileSystemOperationContext* context, 192 FileSystemOperationContext* context,
193 const FilePath& virtual_path, 193 const FilePath& virtual_path,
194 std::vector<base::FileUtilProxy::Entry>* entries) { 194 std::vector<base::FileUtilProxy::Entry>* entries) {
195 // TODO(kkanetkar): Implement directory read in multiple chunks. 195 // TODO(kkanetkar): Implement directory read in multiple chunks.
196 FileSystemDirectoryDatabase* db = 196 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
197 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 197 context->src_origin_url(), context->src_type(), false);
198 if (!db) 198 if (!db) {
199 return base::PLATFORM_FILE_ERROR_FAILED; 199 if (virtual_path.empty() ||
200 virtual_path.value() == FILE_PATH_LITERAL("/")) {
201 // It's the root directory and the database hasn't been initialized yet.
202 entries->clear();
203 return base::PLATFORM_FILE_OK;
204 }
205 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
206 }
200 FileId file_id; 207 FileId file_id;
201 if (!db->GetFileWithPath(virtual_path, &file_id)) 208 if (!db->GetFileWithPath(virtual_path, &file_id))
202 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 209 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
203 FileInfo file_info; 210 FileInfo file_info;
204 if (!db->GetFileInfo(file_id, &file_info)) { 211 if (!db->GetFileInfo(file_id, &file_info)) {
205 DCHECK(!file_id); 212 DCHECK(!file_id);
206 // It's the root directory and the database hasn't been initialized yet. 213 // It's the root directory and the database hasn't been initialized yet.
207 entries->clear(); 214 entries->clear();
208 return base::PLATFORM_FILE_OK; 215 return base::PLATFORM_FILE_OK;
209 } 216 }
(...skipping 16 matching lines...) Expand all
226 entries->push_back(entry); 233 entries->push_back(entry);
227 } 234 }
228 return base::PLATFORM_FILE_OK; 235 return base::PLATFORM_FILE_OK;
229 } 236 }
230 237
231 PlatformFileError ObfuscatedFileSystemFileUtil::CreateDirectory( 238 PlatformFileError ObfuscatedFileSystemFileUtil::CreateDirectory(
232 FileSystemOperationContext* context, 239 FileSystemOperationContext* context,
233 const FilePath& virtual_path, 240 const FilePath& virtual_path,
234 bool exclusive, 241 bool exclusive,
235 bool recursive) { 242 bool recursive) {
236 FileSystemDirectoryDatabase* db = 243 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
237 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 244 context->src_origin_url(), context->src_type(), true);
238 if (!db) 245 if (!db)
239 return base::PLATFORM_FILE_ERROR_FAILED; 246 return base::PLATFORM_FILE_ERROR_FAILED;
240 FileId file_id; 247 FileId file_id;
241 if (db->GetFileWithPath(virtual_path, &file_id)) { 248 if (db->GetFileWithPath(virtual_path, &file_id)) {
242 FileInfo file_info; 249 FileInfo file_info;
243 if (exclusive) 250 if (exclusive)
244 return base::PLATFORM_FILE_ERROR_EXISTS; 251 return base::PLATFORM_FILE_ERROR_EXISTS;
245 if (!db->GetFileInfo(file_id, &file_info)) { 252 if (!db->GetFileInfo(file_id, &file_info)) {
246 NOTREACHED(); 253 NOTREACHED();
247 return base::PLATFORM_FILE_ERROR_FAILED; 254 return base::PLATFORM_FILE_ERROR_FAILED;
(...skipping 29 matching lines...) Expand all
277 } 284 }
278 } 285 }
279 return base::PLATFORM_FILE_OK; 286 return base::PLATFORM_FILE_OK;
280 } 287 }
281 288
282 PlatformFileError ObfuscatedFileSystemFileUtil::CopyOrMoveFile( 289 PlatformFileError ObfuscatedFileSystemFileUtil::CopyOrMoveFile(
283 FileSystemOperationContext* context, 290 FileSystemOperationContext* context,
284 const FilePath& src_file_path, 291 const FilePath& src_file_path,
285 const FilePath& dest_file_path, 292 const FilePath& dest_file_path,
286 bool copy) { 293 bool copy) {
287 FileSystemDirectoryDatabase* db = 294 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
288 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 295 context->src_origin_url(), context->src_type(), true);
289 if (!db) 296 if (!db)
290 return base::PLATFORM_FILE_ERROR_FAILED; 297 return base::PLATFORM_FILE_ERROR_FAILED;
291 FileId src_file_id; 298 FileId src_file_id;
292 if (!db->GetFileWithPath(src_file_path, &src_file_id)) 299 if (!db->GetFileWithPath(src_file_path, &src_file_id))
293 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 300 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
294 FileId dest_file_id; 301 FileId dest_file_id;
295 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id); 302 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id);
296 FileInfo src_file_info; 303 FileInfo src_file_info;
297 FileInfo dest_file_info; 304 FileInfo dest_file_info;
298 if (!db->GetFileInfo(src_file_id, &src_file_info) || 305 if (!db->GetFileInfo(src_file_id, &src_file_info) ||
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 } 372 }
366 } 373 }
367 NOTREACHED(); 374 NOTREACHED();
368 return base::PLATFORM_FILE_ERROR_FAILED; 375 return base::PLATFORM_FILE_ERROR_FAILED;
369 } 376 }
370 377
371 PlatformFileError ObfuscatedFileSystemFileUtil::CopyInForeignFile( 378 PlatformFileError ObfuscatedFileSystemFileUtil::CopyInForeignFile(
372 FileSystemOperationContext* context, 379 FileSystemOperationContext* context,
373 const FilePath& src_file_path, 380 const FilePath& src_file_path,
374 const FilePath& dest_file_path) { 381 const FilePath& dest_file_path) {
375 FileSystemDirectoryDatabase* db = 382 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
376 GetDirectoryDatabase(context->dest_origin_url(), context->dest_type()); 383 context->dest_origin_url(), context->dest_type(), true);
377 if (!db) 384 if (!db)
378 return base::PLATFORM_FILE_ERROR_FAILED; 385 return base::PLATFORM_FILE_ERROR_FAILED;
379 FileId dest_file_id; 386 FileId dest_file_id;
380 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id); 387 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id);
381 FileInfo dest_file_info; 388 FileInfo dest_file_info;
382 if (overwrite) { 389 if (overwrite) {
383 if (!db->GetFileInfo(dest_file_id, &dest_file_info) || 390 if (!db->GetFileInfo(dest_file_id, &dest_file_info) ||
384 dest_file_info.is_directory()) { 391 dest_file_info.is_directory()) {
385 NOTREACHED(); 392 NOTREACHED();
386 return base::PLATFORM_FILE_ERROR_FAILED; 393 return base::PLATFORM_FILE_ERROR_FAILED;
(...skipping 12 matching lines...) Expand all
399 dest_file_path.BaseName().value()); 406 dest_file_path.BaseName().value());
400 return CreateFile(context, context->dest_origin_url(), 407 return CreateFile(context, context->dest_origin_url(),
401 context->dest_type(), src_file_path, &dest_file_info, 0, NULL); 408 context->dest_type(), src_file_path, &dest_file_info, 0, NULL);
402 } 409 }
403 return base::PLATFORM_FILE_ERROR_FAILED; 410 return base::PLATFORM_FILE_ERROR_FAILED;
404 } 411 }
405 412
406 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteFile( 413 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteFile(
407 FileSystemOperationContext* context, 414 FileSystemOperationContext* context,
408 const FilePath& virtual_path) { 415 const FilePath& virtual_path) {
409 FileSystemDirectoryDatabase* db = 416 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
410 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 417 context->src_origin_url(), context->src_type(), true);
411 if (!db) 418 if (!db)
412 return base::PLATFORM_FILE_ERROR_FAILED; 419 return base::PLATFORM_FILE_ERROR_FAILED;
413 FileId file_id; 420 FileId file_id;
414 if (!db->GetFileWithPath(virtual_path, &file_id)) 421 if (!db->GetFileWithPath(virtual_path, &file_id))
415 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 422 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
416 FileInfo file_info; 423 FileInfo file_info;
417 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) { 424 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) {
418 NOTREACHED(); 425 NOTREACHED();
419 return base::PLATFORM_FILE_ERROR_FAILED; 426 return base::PLATFORM_FILE_ERROR_FAILED;
420 } 427 }
421 if (!db->RemoveFileInfo(file_id)) { 428 if (!db->RemoveFileInfo(file_id)) {
422 NOTREACHED(); 429 NOTREACHED();
423 return base::PLATFORM_FILE_ERROR_FAILED; 430 return base::PLATFORM_FILE_ERROR_FAILED;
424 } 431 }
425 FilePath data_path = DataPathToLocalPath(context->src_origin_url(), 432 FilePath data_path = DataPathToLocalPath(context->src_origin_url(),
426 context->src_type(), file_info.data_path); 433 context->src_type(), file_info.data_path);
427 if (base::PLATFORM_FILE_OK != 434 if (base::PLATFORM_FILE_OK !=
428 QuotaFileUtil::GetInstance()->DeleteFile(context, data_path)) 435 QuotaFileUtil::GetInstance()->DeleteFile(context, data_path))
429 LOG(WARNING) << "Leaked a backing file."; 436 LOG(WARNING) << "Leaked a backing file.";
430 return base::PLATFORM_FILE_OK; 437 return base::PLATFORM_FILE_OK;
431 } 438 }
432 439
433 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteSingleDirectory( 440 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteSingleDirectory(
434 FileSystemOperationContext* context, 441 FileSystemOperationContext* context,
435 const FilePath& virtual_path) { 442 const FilePath& virtual_path) {
436 FileSystemDirectoryDatabase* db = 443 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
437 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 444 context->src_origin_url(), context->src_type(), true);
438 if (!db) 445 if (!db)
439 return base::PLATFORM_FILE_ERROR_FAILED; 446 return base::PLATFORM_FILE_ERROR_FAILED;
440 FileId file_id; 447 FileId file_id;
441 if (!db->GetFileWithPath(virtual_path, &file_id)) 448 if (!db->GetFileWithPath(virtual_path, &file_id))
442 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 449 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
443 FileInfo file_info; 450 FileInfo file_info;
444 if (!db->GetFileInfo(file_id, &file_info) || !file_info.is_directory()) { 451 if (!db->GetFileInfo(file_id, &file_info) || !file_info.is_directory()) {
445 NOTREACHED(); 452 NOTREACHED();
446 return base::PLATFORM_FILE_ERROR_FAILED; 453 return base::PLATFORM_FILE_ERROR_FAILED;
447 } 454 }
448 if (!db->RemoveFileInfo(file_id)) 455 if (!db->RemoveFileInfo(file_id))
449 return base::PLATFORM_FILE_ERROR_NOT_EMPTY; 456 return base::PLATFORM_FILE_ERROR_NOT_EMPTY;
450 return base::PLATFORM_FILE_OK; 457 return base::PLATFORM_FILE_OK;
451 } 458 }
452 459
453 PlatformFileError ObfuscatedFileSystemFileUtil::Touch( 460 PlatformFileError ObfuscatedFileSystemFileUtil::Touch(
454 FileSystemOperationContext* context, 461 FileSystemOperationContext* context,
455 const FilePath& virtual_path, 462 const FilePath& virtual_path,
456 const base::Time& last_access_time, 463 const base::Time& last_access_time,
457 const base::Time& last_modified_time) { 464 const base::Time& last_modified_time) {
458 FileSystemDirectoryDatabase* db = 465 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
459 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 466 context->src_origin_url(), context->src_type(), true);
460 if (!db) 467 if (!db)
461 return base::PLATFORM_FILE_ERROR_FAILED; 468 return base::PLATFORM_FILE_ERROR_FAILED;
462 FileId file_id; 469 FileId file_id;
463 if (db->GetFileWithPath(virtual_path, &file_id)) { 470 if (db->GetFileWithPath(virtual_path, &file_id)) {
464 FileInfo file_info; 471 FileInfo file_info;
465 if (!db->GetFileInfo(file_id, &file_info)) { 472 if (!db->GetFileInfo(file_id, &file_info)) {
466 NOTREACHED(); 473 NOTREACHED();
467 return base::PLATFORM_FILE_ERROR_FAILED; 474 return base::PLATFORM_FILE_ERROR_FAILED;
468 } 475 }
469 if (file_info.is_directory()) { 476 if (file_info.is_directory()) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 virtual_path); 512 virtual_path);
506 if (local_path.empty()) 513 if (local_path.empty())
507 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 514 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
508 return QuotaFileUtil::GetInstance()->Truncate( 515 return QuotaFileUtil::GetInstance()->Truncate(
509 context, local_path, length); 516 context, local_path, length);
510 } 517 }
511 518
512 bool ObfuscatedFileSystemFileUtil::PathExists( 519 bool ObfuscatedFileSystemFileUtil::PathExists(
513 FileSystemOperationContext* context, 520 FileSystemOperationContext* context,
514 const FilePath& virtual_path) { 521 const FilePath& virtual_path) {
515 FileSystemDirectoryDatabase* db = 522 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
516 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 523 context->src_origin_url(), context->src_type(), false);
517 if (!db) 524 if (!db)
518 return false; 525 return false;
519 FileId file_id; 526 FileId file_id;
520 return db->GetFileWithPath(virtual_path, &file_id); 527 return db->GetFileWithPath(virtual_path, &file_id);
521 } 528 }
522 529
523 bool ObfuscatedFileSystemFileUtil::DirectoryExists( 530 bool ObfuscatedFileSystemFileUtil::DirectoryExists(
524 FileSystemOperationContext* context, 531 FileSystemOperationContext* context,
525 const FilePath& virtual_path) { 532 const FilePath& virtual_path) {
526 FileSystemDirectoryDatabase* db = 533 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
michaeln 2011/07/05 19:10:12 What if the query is about the root directory, sho
kinuko 2011/07/06 07:44:14 Good question, and I don't have a good answer eith
527 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 534 context->src_origin_url(), context->src_type(), false);
528 if (!db) 535 if (!db)
529 return false; 536 return false;
530 FileId file_id; 537 FileId file_id;
531 if (!db->GetFileWithPath(virtual_path, &file_id)) 538 if (!db->GetFileWithPath(virtual_path, &file_id))
532 return false; 539 return false;
533 FileInfo file_info; 540 FileInfo file_info;
534 if (!db->GetFileInfo(file_id, &file_info)) { 541 if (!db->GetFileInfo(file_id, &file_info)) {
535 NOTREACHED(); 542 NOTREACHED();
536 return false; 543 return false;
537 } 544 }
538 return file_info.is_directory(); 545 return file_info.is_directory();
539 } 546 }
540 547
541 bool ObfuscatedFileSystemFileUtil::IsDirectoryEmpty( 548 bool ObfuscatedFileSystemFileUtil::IsDirectoryEmpty(
542 FileSystemOperationContext* context, 549 FileSystemOperationContext* context,
543 const FilePath& virtual_path) { 550 const FilePath& virtual_path) {
544 FileSystemDirectoryDatabase* db = 551 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
545 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 552 context->src_origin_url(), context->src_type(), false);
546 if (!db) 553 if (!db)
547 return false; 554 return true; // Not a great answer, but it's what others do.
548 FileId file_id; 555 FileId file_id;
549 if (!db->GetFileWithPath(virtual_path, &file_id)) 556 if (!db->GetFileWithPath(virtual_path, &file_id))
550 return true; // Not a great answer, but it's what others do. 557 return true; // Ditto.
551 FileInfo file_info; 558 FileInfo file_info;
552 if (!db->GetFileInfo(file_id, &file_info)) { 559 if (!db->GetFileInfo(file_id, &file_info)) {
553 DCHECK(!file_id); 560 DCHECK(!file_id);
554 // It's the root directory and the database hasn't been initialized yet. 561 // It's the root directory and the database hasn't been initialized yet.
555 return true; 562 return true;
556 } 563 }
557 if (!file_info.is_directory()) 564 if (!file_info.is_directory())
558 return true; 565 return true;
559 std::vector<FileId> children; 566 std::vector<FileId> children;
560 // TODO(ericu): This could easily be made faster with help from the database. 567 // TODO(ericu): This could easily be made faster with help from the database.
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 692
686 InitOriginDatabase(false); 693 InitOriginDatabase(false);
687 return new ObfuscatedFileSystemOriginEnumerator( 694 return new ObfuscatedFileSystemOriginEnumerator(
688 origin_database_.get(), file_system_directory_); 695 origin_database_.get(), file_system_directory_);
689 } 696 }
690 697
691 FileSystemFileUtil::AbstractFileEnumerator* 698 FileSystemFileUtil::AbstractFileEnumerator*
692 ObfuscatedFileSystemFileUtil::CreateFileEnumerator( 699 ObfuscatedFileSystemFileUtil::CreateFileEnumerator(
693 FileSystemOperationContext* context, 700 FileSystemOperationContext* context,
694 const FilePath& root_path) { 701 const FilePath& root_path) {
695 FileSystemDirectoryDatabase* db = 702 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
696 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 703 context->src_origin_url(), context->src_type(), false);
697 if (!db) 704 if (!db)
698 return new FileSystemFileUtil::EmptyFileEnumerator(); 705 return new FileSystemFileUtil::EmptyFileEnumerator();
699 return new ObfuscatedFileSystemFileEnumerator(db, root_path); 706 return new ObfuscatedFileSystemFileEnumerator(db, root_path);
700 } 707 }
701 708
702 PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( 709 PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile(
703 FileSystemOperationContext* context, 710 FileSystemOperationContext* context,
704 const GURL& origin_url, FileSystemType type, const FilePath& source_path, 711 const GURL& origin_url, FileSystemType type, const FilePath& source_path,
705 FileInfo* file_info, int file_flags, PlatformFile* handle) { 712 FileInfo* file_info, int file_flags, PlatformFile* handle) {
706 if (handle) 713 if (handle)
707 *handle = base::kInvalidPlatformFileValue; 714 *handle = base::kInvalidPlatformFileValue;
708 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(origin_url, type); 715 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
716 origin_url, type, true);
709 int64 number; 717 int64 number;
710 if (!db || !db->GetNextInteger(&number)) 718 if (!db || !db->GetNextInteger(&number))
711 return base::PLATFORM_FILE_ERROR_FAILED; 719 return base::PLATFORM_FILE_ERROR_FAILED;
712 // We use the third- and fourth-to-last digits as the directory. 720 // We use the third- and fourth-to-last digits as the directory.
713 int64 directory_number = number % 10000 / 100; 721 int64 directory_number = number % 10000 / 100;
714 FilePath path = 722 FilePath path =
715 GetDirectoryForOriginAndType(origin_url, type, false); 723 GetDirectoryForOriginAndType(origin_url, type, false);
716 if (path.empty()) 724 if (path.empty())
717 return base::PLATFORM_FILE_ERROR_FAILED; 725 return base::PLATFORM_FILE_ERROR_FAILED;
718 726
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
767 return base::PLATFORM_FILE_ERROR_FAILED; 775 return base::PLATFORM_FILE_ERROR_FAILED;
768 } 776 }
769 777
770 return base::PLATFORM_FILE_OK; 778 return base::PLATFORM_FILE_OK;
771 } 779 }
772 780
773 FilePath ObfuscatedFileSystemFileUtil::GetLocalPath( 781 FilePath ObfuscatedFileSystemFileUtil::GetLocalPath(
774 const GURL& origin_url, 782 const GURL& origin_url,
775 FileSystemType type, 783 FileSystemType type,
776 const FilePath& virtual_path) { 784 const FilePath& virtual_path) {
777 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(origin_url, type); 785 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
786 origin_url, type, false);
778 if (!db) 787 if (!db)
779 return FilePath(); 788 return FilePath();
780 FileId file_id; 789 FileId file_id;
781 if (!db->GetFileWithPath(virtual_path, &file_id)) 790 if (!db->GetFileWithPath(virtual_path, &file_id))
782 return FilePath(); 791 return FilePath();
783 FileInfo file_info; 792 FileInfo file_info;
784 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) { 793 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) {
785 NOTREACHED(); 794 NOTREACHED();
786 return FilePath(); // Directories have no local path. 795 return FilePath(); // Directories have no local path.
787 } 796 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 return path; 831 return path;
823 } 832 }
824 833
825 bool ObfuscatedFileSystemFileUtil::MigrateFromOldSandbox( 834 bool ObfuscatedFileSystemFileUtil::MigrateFromOldSandbox(
826 const GURL& origin_url, FileSystemType type, const FilePath& src_root) { 835 const GURL& origin_url, FileSystemType type, const FilePath& src_root) {
827 if (!DestroyDirectoryDatabase(origin_url, type)) 836 if (!DestroyDirectoryDatabase(origin_url, type))
828 return false; 837 return false;
829 FilePath dest_root = GetDirectoryForOriginAndType(origin_url, type, true); 838 FilePath dest_root = GetDirectoryForOriginAndType(origin_url, type, true);
830 if (dest_root.empty()) 839 if (dest_root.empty())
831 return false; 840 return false;
832 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(origin_url, type); 841 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
842 origin_url, type, false);
833 if (!db) 843 if (!db)
834 return false; 844 return false;
835 845
836 file_util::FileEnumerator file_enum(src_root, true, 846 file_util::FileEnumerator file_enum(src_root, true,
837 static_cast<file_util::FileEnumerator::FILE_TYPE>( 847 static_cast<file_util::FileEnumerator::FILE_TYPE>(
838 file_util::FileEnumerator::FILES | 848 file_util::FileEnumerator::FILES |
839 file_util::FileEnumerator::DIRECTORIES)); 849 file_util::FileEnumerator::DIRECTORIES));
840 FilePath src_full_path; 850 FilePath src_full_path;
841 size_t root_path_length = src_root.value().length() + 1; // +1 for the slash 851 size_t root_path_length = src_root.value().length() + 1; // +1 for the slash
842 while (!(src_full_path = file_enum.Next()).empty()) { 852 while (!(src_full_path = file_enum.Next()).empty()) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 return root; 931 return root;
922 // This removes the root, including the trailing slash, leaving a relative 932 // This removes the root, including the trailing slash, leaving a relative
923 // path. 933 // path.
924 return FilePath(local_path.value().substr(root.value().length() + 1)); 934 return FilePath(local_path.value().substr(root.value().length() + 1));
925 } 935 }
926 936
927 // TODO: How to do the whole validation-without-creation thing? We may not have 937 // TODO: How to do the whole validation-without-creation thing? We may not have
928 // quota even to create the database. Ah, in that case don't even get here? 938 // quota even to create the database. Ah, in that case don't even get here?
929 // Still doesn't answer the quota issue, though. 939 // Still doesn't answer the quota issue, though.
930 FileSystemDirectoryDatabase* ObfuscatedFileSystemFileUtil::GetDirectoryDatabase( 940 FileSystemDirectoryDatabase* ObfuscatedFileSystemFileUtil::GetDirectoryDatabase(
931 const GURL& origin, FileSystemType type) { 941 const GURL& origin, FileSystemType type, bool create) {
932
933 MarkUsed();
934 std::string type_string = 942 std::string type_string =
935 FileSystemPathManager::GetFileSystemTypeString(type); 943 FileSystemPathManager::GetFileSystemTypeString(type);
936 if (type_string.empty()) { 944 if (type_string.empty()) {
937 LOG(WARNING) << "Unknown filesystem type requested:" << type; 945 LOG(WARNING) << "Unknown filesystem type requested:" << type;
938 return NULL; 946 return NULL;
939 } 947 }
940 std::string key = GetOriginIdentifierFromURL(origin) + type_string; 948 std::string key = GetOriginIdentifierFromURL(origin) + type_string;
941 DirectoryMap::iterator iter = directories_.find(key); 949 DirectoryMap::iterator iter = directories_.find(key);
942 if (iter != directories_.end()) 950 if (iter != directories_.end()) {
951 MarkUsed();
943 return iter->second; 952 return iter->second;
953 }
944 954
945 FilePath path = GetDirectoryForOriginAndType(origin, type, true); 955 FilePath path = GetDirectoryForOriginAndType(origin, type, create);
946 if (path.empty()) 956 if (path.empty())
947 return NULL; 957 return NULL;
948 if (!file_util::DirectoryExists(path)) { 958 if (!file_util::DirectoryExists(path)) {
949 if (!file_util::CreateDirectory(path)) { 959 if (!file_util::CreateDirectory(path)) {
950 LOG(WARNING) << "Failed to origin+type directory: " << path.value(); 960 LOG(WARNING) << "Failed to origin+type directory: " << path.value();
951 return NULL; 961 return NULL;
952 } 962 }
953 } 963 }
964 MarkUsed();
954 path = path.AppendASCII(kDirectoryDatabaseName); 965 path = path.AppendASCII(kDirectoryDatabaseName);
955 FileSystemDirectoryDatabase* database = new FileSystemDirectoryDatabase(path); 966 FileSystemDirectoryDatabase* database = new FileSystemDirectoryDatabase(path);
956 directories_[key] = database; 967 directories_[key] = database;
957 return database; 968 return database;
958 } 969 }
959 970
960 void ObfuscatedFileSystemFileUtil::MarkUsed() { 971 void ObfuscatedFileSystemFileUtil::MarkUsed() {
961 if (timer_.IsRunning()) 972 if (timer_.IsRunning())
962 timer_.Reset(); 973 timer_.Reset();
963 else 974 else
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 return false; 1015 return false;
1005 } 1016 }
1006 origin_database_.reset( 1017 origin_database_.reset(
1007 new FileSystemOriginDatabase( 1018 new FileSystemOriginDatabase(
1008 file_system_directory_.AppendASCII(kOriginDatabaseName))); 1019 file_system_directory_.AppendASCII(kOriginDatabaseName)));
1009 } 1020 }
1010 return true; 1021 return true;
1011 } 1022 }
1012 1023
1013 } // namespace fileapi 1024 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/obfuscated_file_system_file_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698