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

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

Issue 7489038: Merge 91814 - Do not create a new directory database for read operations. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/782/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 23 matching lines...) Expand all
34 34
35 void InitFileInfo( 35 void InitFileInfo(
36 fileapi::FileSystemDirectoryDatabase::FileInfo* file_info, 36 fileapi::FileSystemDirectoryDatabase::FileInfo* file_info,
37 fileapi::FileSystemDirectoryDatabase::FileId parent_id, 37 fileapi::FileSystemDirectoryDatabase::FileId parent_id,
38 const FilePath::StringType& file_name) { 38 const FilePath::StringType& file_name) {
39 DCHECK(file_info); 39 DCHECK(file_info);
40 file_info->parent_id = parent_id; 40 file_info->parent_id = parent_id;
41 file_info->name = file_name; 41 file_info->name = file_name;
42 } 42 }
43 43
44 bool IsRootDirectory(const FilePath& virtual_path) {
45 return (virtual_path.empty() ||
46 virtual_path.value() == FILE_PATH_LITERAL("/"));
47 }
48
44 const FilePath::CharType kLegacyDataDirectory[] = FILE_PATH_LITERAL("Legacy"); 49 const FilePath::CharType kLegacyDataDirectory[] = FILE_PATH_LITERAL("Legacy");
45 50
46 const FilePath::CharType kTemporaryDirectoryName[] = FILE_PATH_LITERAL("t"); 51 const FilePath::CharType kTemporaryDirectoryName[] = FILE_PATH_LITERAL("t");
47 const FilePath::CharType kPersistentDirectoryName[] = FILE_PATH_LITERAL("p"); 52 const FilePath::CharType kPersistentDirectoryName[] = FILE_PATH_LITERAL("p");
48 53
49 } // namespace 54 } // namespace
50 55
51 namespace fileapi { 56 namespace fileapi {
52 57
53 using base::PlatformFile; 58 using base::PlatformFile;
54 using base::PlatformFileError; 59 using base::PlatformFileError;
55 60
56 ObfuscatedFileSystemFileUtil::ObfuscatedFileSystemFileUtil( 61 ObfuscatedFileSystemFileUtil::ObfuscatedFileSystemFileUtil(
57 const FilePath& file_system_directory) 62 const FilePath& file_system_directory)
58 : file_system_directory_(file_system_directory) { 63 : file_system_directory_(file_system_directory) {
59 } 64 }
60 65
61 ObfuscatedFileSystemFileUtil::~ObfuscatedFileSystemFileUtil() { 66 ObfuscatedFileSystemFileUtil::~ObfuscatedFileSystemFileUtil() {
62 DropDatabases(); 67 DropDatabases();
63 } 68 }
64 69
65 PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen( 70 PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen(
66 FileSystemOperationContext* context, 71 FileSystemOperationContext* context,
67 const FilePath& virtual_path, int file_flags, 72 const FilePath& virtual_path, int file_flags,
68 PlatformFile* file_handle, bool* created) { 73 PlatformFile* file_handle, bool* created) {
69 DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE | 74 DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE |
70 base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ | 75 base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ |
71 base::PLATFORM_FILE_EXCLUSIVE_WRITE))); 76 base::PLATFORM_FILE_EXCLUSIVE_WRITE)));
72 FileSystemDirectoryDatabase* db = 77 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
73 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 78 context->src_origin_url(), context->src_type(), true);
74 if (!db) 79 if (!db)
75 return base::PLATFORM_FILE_ERROR_FAILED; 80 return base::PLATFORM_FILE_ERROR_FAILED;
76 FileId file_id; 81 FileId file_id;
77 if (!db->GetFileWithPath(virtual_path, &file_id)) { 82 if (!db->GetFileWithPath(virtual_path, &file_id)) {
78 // The file doesn't exist. 83 // The file doesn't exist.
79 if (!(file_flags & (base::PLATFORM_FILE_CREATE | 84 if (!(file_flags & (base::PLATFORM_FILE_CREATE |
80 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS))) 85 base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS)))
81 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 86 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
82 FileId parent_id; 87 FileId parent_id;
83 if (!db->GetFileWithPath(virtual_path.DirName(), &parent_id)) 88 if (!db->GetFileWithPath(virtual_path.DirName(), &parent_id))
(...skipping 20 matching lines...) Expand all
104 FilePath data_path = DataPathToLocalPath(context->src_origin_url(), 109 FilePath data_path = DataPathToLocalPath(context->src_origin_url(),
105 context->src_type(), file_info.data_path); 110 context->src_type(), file_info.data_path);
106 return QuotaFileUtil::GetInstance()->CreateOrOpen( 111 return QuotaFileUtil::GetInstance()->CreateOrOpen(
107 context, data_path, file_flags, file_handle, created); 112 context, data_path, file_flags, file_handle, created);
108 } 113 }
109 114
110 PlatformFileError ObfuscatedFileSystemFileUtil::EnsureFileExists( 115 PlatformFileError ObfuscatedFileSystemFileUtil::EnsureFileExists(
111 FileSystemOperationContext* context, 116 FileSystemOperationContext* context,
112 const FilePath& virtual_path, 117 const FilePath& virtual_path,
113 bool* created) { 118 bool* created) {
114 FileSystemDirectoryDatabase* db = 119 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
115 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 120 context->src_origin_url(), context->src_type(), true);
116 if (!db) 121 if (!db)
117 return base::PLATFORM_FILE_ERROR_FAILED; 122 return base::PLATFORM_FILE_ERROR_FAILED;
118 FileId file_id; 123 FileId file_id;
119 if (db->GetFileWithPath(virtual_path, &file_id)) { 124 if (db->GetFileWithPath(virtual_path, &file_id)) {
120 FileInfo file_info; 125 FileInfo file_info;
121 if (!db->GetFileInfo(file_id, &file_info)) { 126 if (!db->GetFileInfo(file_id, &file_info)) {
122 NOTREACHED(); 127 NOTREACHED();
123 return base::PLATFORM_FILE_ERROR_FAILED; 128 return base::PLATFORM_FILE_ERROR_FAILED;
124 } 129 }
125 if (file_info.is_directory()) 130 if (file_info.is_directory())
(...skipping 27 matching lines...) Expand all
153 158
154 *local_path = path; 159 *local_path = path;
155 return base::PLATFORM_FILE_OK; 160 return base::PLATFORM_FILE_OK;
156 } 161 }
157 162
158 PlatformFileError ObfuscatedFileSystemFileUtil::GetFileInfo( 163 PlatformFileError ObfuscatedFileSystemFileUtil::GetFileInfo(
159 FileSystemOperationContext* context, 164 FileSystemOperationContext* context,
160 const FilePath& virtual_path, 165 const FilePath& virtual_path,
161 base::PlatformFileInfo* file_info, 166 base::PlatformFileInfo* file_info,
162 FilePath* platform_file_path) { 167 FilePath* platform_file_path) {
163 FileSystemDirectoryDatabase* db = 168 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
164 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 169 context->src_origin_url(), context->src_type(), false);
165 if (!db) 170 if (!db)
166 return base::PLATFORM_FILE_ERROR_FAILED; 171 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
167 FileId file_id; 172 FileId file_id;
168 if (!db->GetFileWithPath(virtual_path, &file_id)) 173 if (!db->GetFileWithPath(virtual_path, &file_id))
169 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 174 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
170 FileInfo local_info; 175 FileInfo local_info;
171 if (!db->GetFileInfo(file_id, &local_info)) { 176 if (!db->GetFileInfo(file_id, &local_info)) {
172 NOTREACHED(); 177 NOTREACHED();
173 return base::PLATFORM_FILE_ERROR_FAILED; 178 return base::PLATFORM_FILE_ERROR_FAILED;
174 } 179 }
175 if (local_info.is_directory()) { 180 if (local_info.is_directory()) {
176 file_info->is_directory = true; 181 file_info->is_directory = true;
177 file_info->is_symbolic_link = false; 182 file_info->is_symbolic_link = false;
178 file_info->last_modified = local_info.modification_time; 183 file_info->last_modified = local_info.modification_time;
179 *platform_file_path = FilePath(); 184 *platform_file_path = FilePath();
180 // We don't fill in ctime or atime. 185 // We don't fill in ctime or atime.
181 return base::PLATFORM_FILE_OK; 186 return base::PLATFORM_FILE_OK;
182 } 187 }
183 if (local_info.data_path.empty()) 188 if (local_info.data_path.empty())
184 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; 189 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
185 FilePath data_path = DataPathToLocalPath(context->src_origin_url(), 190 FilePath data_path = DataPathToLocalPath(context->src_origin_url(),
186 context->src_type(), local_info.data_path); 191 context->src_type(), local_info.data_path);
187 return QuotaFileUtil::GetInstance()->GetFileInfo( 192 return QuotaFileUtil::GetInstance()->GetFileInfo(
188 context, data_path, file_info, platform_file_path); 193 context, data_path, file_info, platform_file_path);
189 } 194 }
190 195
191 PlatformFileError ObfuscatedFileSystemFileUtil::ReadDirectory( 196 PlatformFileError ObfuscatedFileSystemFileUtil::ReadDirectory(
192 FileSystemOperationContext* context, 197 FileSystemOperationContext* context,
193 const FilePath& virtual_path, 198 const FilePath& virtual_path,
194 std::vector<base::FileUtilProxy::Entry>* entries) { 199 std::vector<base::FileUtilProxy::Entry>* entries) {
195 // TODO(kkanetkar): Implement directory read in multiple chunks. 200 // TODO(kkanetkar): Implement directory read in multiple chunks.
196 FileSystemDirectoryDatabase* db = 201 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
197 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 202 context->src_origin_url(), context->src_type(), false);
198 if (!db) 203 if (!db) {
199 return base::PLATFORM_FILE_ERROR_FAILED; 204 if (IsRootDirectory(virtual_path)) {
205 // It's the root directory and the database hasn't been initialized yet.
206 entries->clear();
207 return base::PLATFORM_FILE_OK;
208 }
209 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
210 }
200 FileId file_id; 211 FileId file_id;
201 if (!db->GetFileWithPath(virtual_path, &file_id)) 212 if (!db->GetFileWithPath(virtual_path, &file_id))
202 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 213 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
203 FileInfo file_info; 214 FileInfo file_info;
204 if (!db->GetFileInfo(file_id, &file_info)) { 215 if (!db->GetFileInfo(file_id, &file_info)) {
205 DCHECK(!file_id); 216 DCHECK(!file_id);
206 // It's the root directory and the database hasn't been initialized yet. 217 // It's the root directory and the database hasn't been initialized yet.
207 entries->clear(); 218 entries->clear();
208 return base::PLATFORM_FILE_OK; 219 return base::PLATFORM_FILE_OK;
209 } 220 }
(...skipping 16 matching lines...) Expand all
226 entries->push_back(entry); 237 entries->push_back(entry);
227 } 238 }
228 return base::PLATFORM_FILE_OK; 239 return base::PLATFORM_FILE_OK;
229 } 240 }
230 241
231 PlatformFileError ObfuscatedFileSystemFileUtil::CreateDirectory( 242 PlatformFileError ObfuscatedFileSystemFileUtil::CreateDirectory(
232 FileSystemOperationContext* context, 243 FileSystemOperationContext* context,
233 const FilePath& virtual_path, 244 const FilePath& virtual_path,
234 bool exclusive, 245 bool exclusive,
235 bool recursive) { 246 bool recursive) {
236 FileSystemDirectoryDatabase* db = 247 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
237 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 248 context->src_origin_url(), context->src_type(), true);
238 if (!db) 249 if (!db)
239 return base::PLATFORM_FILE_ERROR_FAILED; 250 return base::PLATFORM_FILE_ERROR_FAILED;
240 FileId file_id; 251 FileId file_id;
241 if (db->GetFileWithPath(virtual_path, &file_id)) { 252 if (db->GetFileWithPath(virtual_path, &file_id)) {
242 FileInfo file_info; 253 FileInfo file_info;
243 if (exclusive) 254 if (exclusive)
244 return base::PLATFORM_FILE_ERROR_EXISTS; 255 return base::PLATFORM_FILE_ERROR_EXISTS;
245 if (!db->GetFileInfo(file_id, &file_info)) { 256 if (!db->GetFileInfo(file_id, &file_info)) {
246 NOTREACHED(); 257 NOTREACHED();
247 return base::PLATFORM_FILE_ERROR_FAILED; 258 return base::PLATFORM_FILE_ERROR_FAILED;
(...skipping 29 matching lines...) Expand all
277 } 288 }
278 } 289 }
279 return base::PLATFORM_FILE_OK; 290 return base::PLATFORM_FILE_OK;
280 } 291 }
281 292
282 PlatformFileError ObfuscatedFileSystemFileUtil::CopyOrMoveFile( 293 PlatformFileError ObfuscatedFileSystemFileUtil::CopyOrMoveFile(
283 FileSystemOperationContext* context, 294 FileSystemOperationContext* context,
284 const FilePath& src_file_path, 295 const FilePath& src_file_path,
285 const FilePath& dest_file_path, 296 const FilePath& dest_file_path,
286 bool copy) { 297 bool copy) {
287 FileSystemDirectoryDatabase* db = 298 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
288 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 299 context->src_origin_url(), context->src_type(), true);
289 if (!db) 300 if (!db)
290 return base::PLATFORM_FILE_ERROR_FAILED; 301 return base::PLATFORM_FILE_ERROR_FAILED;
291 FileId src_file_id; 302 FileId src_file_id;
292 if (!db->GetFileWithPath(src_file_path, &src_file_id)) 303 if (!db->GetFileWithPath(src_file_path, &src_file_id))
293 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 304 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
294 FileId dest_file_id; 305 FileId dest_file_id;
295 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id); 306 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id);
296 FileInfo src_file_info; 307 FileInfo src_file_info;
297 FileInfo dest_file_info; 308 FileInfo dest_file_info;
298 if (!db->GetFileInfo(src_file_id, &src_file_info) || 309 if (!db->GetFileInfo(src_file_id, &src_file_info) ||
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 } 376 }
366 } 377 }
367 NOTREACHED(); 378 NOTREACHED();
368 return base::PLATFORM_FILE_ERROR_FAILED; 379 return base::PLATFORM_FILE_ERROR_FAILED;
369 } 380 }
370 381
371 PlatformFileError ObfuscatedFileSystemFileUtil::CopyInForeignFile( 382 PlatformFileError ObfuscatedFileSystemFileUtil::CopyInForeignFile(
372 FileSystemOperationContext* context, 383 FileSystemOperationContext* context,
373 const FilePath& src_file_path, 384 const FilePath& src_file_path,
374 const FilePath& dest_file_path) { 385 const FilePath& dest_file_path) {
375 FileSystemDirectoryDatabase* db = 386 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
376 GetDirectoryDatabase(context->dest_origin_url(), context->dest_type()); 387 context->dest_origin_url(), context->dest_type(), true);
377 if (!db) 388 if (!db)
378 return base::PLATFORM_FILE_ERROR_FAILED; 389 return base::PLATFORM_FILE_ERROR_FAILED;
379 FileId dest_file_id; 390 FileId dest_file_id;
380 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id); 391 bool overwrite = db->GetFileWithPath(dest_file_path, &dest_file_id);
381 FileInfo dest_file_info; 392 FileInfo dest_file_info;
382 if (overwrite) { 393 if (overwrite) {
383 if (!db->GetFileInfo(dest_file_id, &dest_file_info) || 394 if (!db->GetFileInfo(dest_file_id, &dest_file_info) ||
384 dest_file_info.is_directory()) { 395 dest_file_info.is_directory()) {
385 NOTREACHED(); 396 NOTREACHED();
386 return base::PLATFORM_FILE_ERROR_FAILED; 397 return base::PLATFORM_FILE_ERROR_FAILED;
(...skipping 12 matching lines...) Expand all
399 dest_file_path.BaseName().value()); 410 dest_file_path.BaseName().value());
400 return CreateFile(context, context->dest_origin_url(), 411 return CreateFile(context, context->dest_origin_url(),
401 context->dest_type(), src_file_path, &dest_file_info, 0, NULL); 412 context->dest_type(), src_file_path, &dest_file_info, 0, NULL);
402 } 413 }
403 return base::PLATFORM_FILE_ERROR_FAILED; 414 return base::PLATFORM_FILE_ERROR_FAILED;
404 } 415 }
405 416
406 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteFile( 417 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteFile(
407 FileSystemOperationContext* context, 418 FileSystemOperationContext* context,
408 const FilePath& virtual_path) { 419 const FilePath& virtual_path) {
409 FileSystemDirectoryDatabase* db = 420 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
410 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 421 context->src_origin_url(), context->src_type(), true);
411 if (!db) 422 if (!db)
412 return base::PLATFORM_FILE_ERROR_FAILED; 423 return base::PLATFORM_FILE_ERROR_FAILED;
413 FileId file_id; 424 FileId file_id;
414 if (!db->GetFileWithPath(virtual_path, &file_id)) 425 if (!db->GetFileWithPath(virtual_path, &file_id))
415 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 426 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
416 FileInfo file_info; 427 FileInfo file_info;
417 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) { 428 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) {
418 NOTREACHED(); 429 NOTREACHED();
419 return base::PLATFORM_FILE_ERROR_FAILED; 430 return base::PLATFORM_FILE_ERROR_FAILED;
420 } 431 }
421 if (!db->RemoveFileInfo(file_id)) { 432 if (!db->RemoveFileInfo(file_id)) {
422 NOTREACHED(); 433 NOTREACHED();
423 return base::PLATFORM_FILE_ERROR_FAILED; 434 return base::PLATFORM_FILE_ERROR_FAILED;
424 } 435 }
425 FilePath data_path = DataPathToLocalPath(context->src_origin_url(), 436 FilePath data_path = DataPathToLocalPath(context->src_origin_url(),
426 context->src_type(), file_info.data_path); 437 context->src_type(), file_info.data_path);
427 if (base::PLATFORM_FILE_OK != 438 if (base::PLATFORM_FILE_OK !=
428 QuotaFileUtil::GetInstance()->DeleteFile(context, data_path)) 439 QuotaFileUtil::GetInstance()->DeleteFile(context, data_path))
429 LOG(WARNING) << "Leaked a backing file."; 440 LOG(WARNING) << "Leaked a backing file.";
430 return base::PLATFORM_FILE_OK; 441 return base::PLATFORM_FILE_OK;
431 } 442 }
432 443
433 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteSingleDirectory( 444 PlatformFileError ObfuscatedFileSystemFileUtil::DeleteSingleDirectory(
434 FileSystemOperationContext* context, 445 FileSystemOperationContext* context,
435 const FilePath& virtual_path) { 446 const FilePath& virtual_path) {
436 FileSystemDirectoryDatabase* db = 447 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
437 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 448 context->src_origin_url(), context->src_type(), true);
438 if (!db) 449 if (!db)
439 return base::PLATFORM_FILE_ERROR_FAILED; 450 return base::PLATFORM_FILE_ERROR_FAILED;
440 FileId file_id; 451 FileId file_id;
441 if (!db->GetFileWithPath(virtual_path, &file_id)) 452 if (!db->GetFileWithPath(virtual_path, &file_id))
442 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 453 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
443 FileInfo file_info; 454 FileInfo file_info;
444 if (!db->GetFileInfo(file_id, &file_info) || !file_info.is_directory()) { 455 if (!db->GetFileInfo(file_id, &file_info) || !file_info.is_directory()) {
445 NOTREACHED(); 456 NOTREACHED();
446 return base::PLATFORM_FILE_ERROR_FAILED; 457 return base::PLATFORM_FILE_ERROR_FAILED;
447 } 458 }
448 if (!db->RemoveFileInfo(file_id)) 459 if (!db->RemoveFileInfo(file_id))
449 return base::PLATFORM_FILE_ERROR_NOT_EMPTY; 460 return base::PLATFORM_FILE_ERROR_NOT_EMPTY;
450 return base::PLATFORM_FILE_OK; 461 return base::PLATFORM_FILE_OK;
451 } 462 }
452 463
453 PlatformFileError ObfuscatedFileSystemFileUtil::Touch( 464 PlatformFileError ObfuscatedFileSystemFileUtil::Touch(
454 FileSystemOperationContext* context, 465 FileSystemOperationContext* context,
455 const FilePath& virtual_path, 466 const FilePath& virtual_path,
456 const base::Time& last_access_time, 467 const base::Time& last_access_time,
457 const base::Time& last_modified_time) { 468 const base::Time& last_modified_time) {
458 FileSystemDirectoryDatabase* db = 469 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
459 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 470 context->src_origin_url(), context->src_type(), true);
460 if (!db) 471 if (!db)
461 return base::PLATFORM_FILE_ERROR_FAILED; 472 return base::PLATFORM_FILE_ERROR_FAILED;
462 FileId file_id; 473 FileId file_id;
463 if (db->GetFileWithPath(virtual_path, &file_id)) { 474 if (db->GetFileWithPath(virtual_path, &file_id)) {
464 FileInfo file_info; 475 FileInfo file_info;
465 if (!db->GetFileInfo(file_id, &file_info)) { 476 if (!db->GetFileInfo(file_id, &file_info)) {
466 NOTREACHED(); 477 NOTREACHED();
467 return base::PLATFORM_FILE_ERROR_FAILED; 478 return base::PLATFORM_FILE_ERROR_FAILED;
468 } 479 }
469 if (file_info.is_directory()) { 480 if (file_info.is_directory()) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 virtual_path); 516 virtual_path);
506 if (local_path.empty()) 517 if (local_path.empty())
507 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 518 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
508 return QuotaFileUtil::GetInstance()->Truncate( 519 return QuotaFileUtil::GetInstance()->Truncate(
509 context, local_path, length); 520 context, local_path, length);
510 } 521 }
511 522
512 bool ObfuscatedFileSystemFileUtil::PathExists( 523 bool ObfuscatedFileSystemFileUtil::PathExists(
513 FileSystemOperationContext* context, 524 FileSystemOperationContext* context,
514 const FilePath& virtual_path) { 525 const FilePath& virtual_path) {
515 FileSystemDirectoryDatabase* db = 526 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
516 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 527 context->src_origin_url(), context->src_type(), false);
517 if (!db) 528 if (!db)
518 return false; 529 return false;
519 FileId file_id; 530 FileId file_id;
520 return db->GetFileWithPath(virtual_path, &file_id); 531 return db->GetFileWithPath(virtual_path, &file_id);
521 } 532 }
522 533
523 bool ObfuscatedFileSystemFileUtil::DirectoryExists( 534 bool ObfuscatedFileSystemFileUtil::DirectoryExists(
524 FileSystemOperationContext* context, 535 FileSystemOperationContext* context,
525 const FilePath& virtual_path) { 536 const FilePath& virtual_path) {
526 FileSystemDirectoryDatabase* db = 537 if (IsRootDirectory(virtual_path)) {
527 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 538 // It's questionable whether we should return true or false for the
539 // root directory of nonexistent origin, but here we return true
540 // as the current implementation of ReadDirectory always returns an empty
541 // array (rather than erroring out with NOT_FOUND_ERR even) for
542 // nonexistent origins.
543 // Note: if you're going to change this behavior please also consider
544 // changiing the ReadDirectory's behavior!
545 return true;
546 }
547 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
548 context->src_origin_url(), context->src_type(), false);
528 if (!db) 549 if (!db)
529 return false; 550 return false;
530 FileId file_id; 551 FileId file_id;
531 if (!db->GetFileWithPath(virtual_path, &file_id)) 552 if (!db->GetFileWithPath(virtual_path, &file_id))
532 return false; 553 return false;
533 FileInfo file_info; 554 FileInfo file_info;
534 if (!db->GetFileInfo(file_id, &file_info)) { 555 if (!db->GetFileInfo(file_id, &file_info)) {
535 NOTREACHED(); 556 NOTREACHED();
536 return false; 557 return false;
537 } 558 }
538 return file_info.is_directory(); 559 return file_info.is_directory();
539 } 560 }
540 561
541 bool ObfuscatedFileSystemFileUtil::IsDirectoryEmpty( 562 bool ObfuscatedFileSystemFileUtil::IsDirectoryEmpty(
542 FileSystemOperationContext* context, 563 FileSystemOperationContext* context,
543 const FilePath& virtual_path) { 564 const FilePath& virtual_path) {
544 FileSystemDirectoryDatabase* db = 565 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
545 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 566 context->src_origin_url(), context->src_type(), false);
546 if (!db) 567 if (!db)
547 return false; 568 return true; // Not a great answer, but it's what others do.
548 FileId file_id; 569 FileId file_id;
549 if (!db->GetFileWithPath(virtual_path, &file_id)) 570 if (!db->GetFileWithPath(virtual_path, &file_id))
550 return true; // Not a great answer, but it's what others do. 571 return true; // Ditto.
551 FileInfo file_info; 572 FileInfo file_info;
552 if (!db->GetFileInfo(file_id, &file_info)) { 573 if (!db->GetFileInfo(file_id, &file_info)) {
553 DCHECK(!file_id); 574 DCHECK(!file_id);
554 // It's the root directory and the database hasn't been initialized yet. 575 // It's the root directory and the database hasn't been initialized yet.
555 return true; 576 return true;
556 } 577 }
557 if (!file_info.is_directory()) 578 if (!file_info.is_directory())
558 return true; 579 return true;
559 std::vector<FileId> children; 580 std::vector<FileId> children;
560 // TODO(ericu): This could easily be made faster with help from the database. 581 // 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 706
686 InitOriginDatabase(false); 707 InitOriginDatabase(false);
687 return new ObfuscatedFileSystemOriginEnumerator( 708 return new ObfuscatedFileSystemOriginEnumerator(
688 origin_database_.get(), file_system_directory_); 709 origin_database_.get(), file_system_directory_);
689 } 710 }
690 711
691 FileSystemFileUtil::AbstractFileEnumerator* 712 FileSystemFileUtil::AbstractFileEnumerator*
692 ObfuscatedFileSystemFileUtil::CreateFileEnumerator( 713 ObfuscatedFileSystemFileUtil::CreateFileEnumerator(
693 FileSystemOperationContext* context, 714 FileSystemOperationContext* context,
694 const FilePath& root_path) { 715 const FilePath& root_path) {
695 FileSystemDirectoryDatabase* db = 716 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
696 GetDirectoryDatabase(context->src_origin_url(), context->src_type()); 717 context->src_origin_url(), context->src_type(), false);
697 if (!db) 718 if (!db)
698 return new FileSystemFileUtil::EmptyFileEnumerator(); 719 return new FileSystemFileUtil::EmptyFileEnumerator();
699 return new ObfuscatedFileSystemFileEnumerator(db, root_path); 720 return new ObfuscatedFileSystemFileEnumerator(db, root_path);
700 } 721 }
701 722
702 PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( 723 PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile(
703 FileSystemOperationContext* context, 724 FileSystemOperationContext* context,
704 const GURL& origin_url, FileSystemType type, const FilePath& source_path, 725 const GURL& origin_url, FileSystemType type, const FilePath& source_path,
705 FileInfo* file_info, int file_flags, PlatformFile* handle) { 726 FileInfo* file_info, int file_flags, PlatformFile* handle) {
706 if (handle) 727 if (handle)
707 *handle = base::kInvalidPlatformFileValue; 728 *handle = base::kInvalidPlatformFileValue;
708 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(origin_url, type); 729 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
730 origin_url, type, true);
709 int64 number; 731 int64 number;
710 if (!db || !db->GetNextInteger(&number)) 732 if (!db || !db->GetNextInteger(&number))
711 return base::PLATFORM_FILE_ERROR_FAILED; 733 return base::PLATFORM_FILE_ERROR_FAILED;
712 // We use the third- and fourth-to-last digits as the directory. 734 // We use the third- and fourth-to-last digits as the directory.
713 int64 directory_number = number % 10000 / 100; 735 int64 directory_number = number % 10000 / 100;
714 FilePath path = 736 FilePath path =
715 GetDirectoryForOriginAndType(origin_url, type, false); 737 GetDirectoryForOriginAndType(origin_url, type, false);
716 if (path.empty()) 738 if (path.empty())
717 return base::PLATFORM_FILE_ERROR_FAILED; 739 return base::PLATFORM_FILE_ERROR_FAILED;
718 740
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 return base::PLATFORM_FILE_ERROR_FAILED; 786 return base::PLATFORM_FILE_ERROR_FAILED;
765 } 787 }
766 788
767 return base::PLATFORM_FILE_OK; 789 return base::PLATFORM_FILE_OK;
768 } 790 }
769 791
770 FilePath ObfuscatedFileSystemFileUtil::GetLocalPath( 792 FilePath ObfuscatedFileSystemFileUtil::GetLocalPath(
771 const GURL& origin_url, 793 const GURL& origin_url,
772 FileSystemType type, 794 FileSystemType type,
773 const FilePath& virtual_path) { 795 const FilePath& virtual_path) {
774 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(origin_url, type); 796 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
797 origin_url, type, false);
775 if (!db) 798 if (!db)
776 return FilePath(); 799 return FilePath();
777 FileId file_id; 800 FileId file_id;
778 if (!db->GetFileWithPath(virtual_path, &file_id)) 801 if (!db->GetFileWithPath(virtual_path, &file_id))
779 return FilePath(); 802 return FilePath();
780 FileInfo file_info; 803 FileInfo file_info;
781 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) { 804 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) {
782 NOTREACHED(); 805 NOTREACHED();
783 return FilePath(); // Directories have no local path. 806 return FilePath(); // Directories have no local path.
784 } 807 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 return path; 842 return path;
820 } 843 }
821 844
822 bool ObfuscatedFileSystemFileUtil::MigrateFromOldSandbox( 845 bool ObfuscatedFileSystemFileUtil::MigrateFromOldSandbox(
823 const GURL& origin_url, FileSystemType type, const FilePath& src_root) { 846 const GURL& origin_url, FileSystemType type, const FilePath& src_root) {
824 if (!DestroyDirectoryDatabase(origin_url, type)) 847 if (!DestroyDirectoryDatabase(origin_url, type))
825 return false; 848 return false;
826 FilePath dest_root = GetDirectoryForOriginAndType(origin_url, type, true); 849 FilePath dest_root = GetDirectoryForOriginAndType(origin_url, type, true);
827 if (dest_root.empty()) 850 if (dest_root.empty())
828 return false; 851 return false;
829 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(origin_url, type); 852 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
853 origin_url, type, false);
ericu 2011/08/01 22:53:27 While this code won't actually fail [due to the "t
830 if (!db) 854 if (!db)
831 return false; 855 return false;
832 856
833 file_util::FileEnumerator file_enum(src_root, true, 857 file_util::FileEnumerator file_enum(src_root, true,
834 static_cast<file_util::FileEnumerator::FILE_TYPE>( 858 static_cast<file_util::FileEnumerator::FILE_TYPE>(
835 file_util::FileEnumerator::FILES | 859 file_util::FileEnumerator::FILES |
836 file_util::FileEnumerator::DIRECTORIES)); 860 file_util::FileEnumerator::DIRECTORIES));
837 FilePath src_full_path; 861 FilePath src_full_path;
838 size_t root_path_length = src_root.value().length() + 1; // +1 for the slash 862 size_t root_path_length = src_root.value().length() + 1; // +1 for the slash
839 while (!(src_full_path = file_enum.Next()).empty()) { 863 while (!(src_full_path = file_enum.Next()).empty()) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
918 return root; 942 return root;
919 // This removes the root, including the trailing slash, leaving a relative 943 // This removes the root, including the trailing slash, leaving a relative
920 // path. 944 // path.
921 return FilePath(local_path.value().substr(root.value().length() + 1)); 945 return FilePath(local_path.value().substr(root.value().length() + 1));
922 } 946 }
923 947
924 // TODO: How to do the whole validation-without-creation thing? We may not have 948 // TODO: How to do the whole validation-without-creation thing? We may not have
925 // quota even to create the database. Ah, in that case don't even get here? 949 // quota even to create the database. Ah, in that case don't even get here?
926 // Still doesn't answer the quota issue, though. 950 // Still doesn't answer the quota issue, though.
927 FileSystemDirectoryDatabase* ObfuscatedFileSystemFileUtil::GetDirectoryDatabase( 951 FileSystemDirectoryDatabase* ObfuscatedFileSystemFileUtil::GetDirectoryDatabase(
928 const GURL& origin, FileSystemType type) { 952 const GURL& origin, FileSystemType type, bool create) {
929
930 MarkUsed();
931 std::string type_string = 953 std::string type_string =
932 FileSystemPathManager::GetFileSystemTypeString(type); 954 FileSystemPathManager::GetFileSystemTypeString(type);
933 if (type_string.empty()) { 955 if (type_string.empty()) {
934 LOG(WARNING) << "Unknown filesystem type requested:" << type; 956 LOG(WARNING) << "Unknown filesystem type requested:" << type;
935 return NULL; 957 return NULL;
936 } 958 }
937 std::string key = GetOriginIdentifierFromURL(origin) + type_string; 959 std::string key = GetOriginIdentifierFromURL(origin) + type_string;
938 DirectoryMap::iterator iter = directories_.find(key); 960 DirectoryMap::iterator iter = directories_.find(key);
939 if (iter != directories_.end()) 961 if (iter != directories_.end()) {
962 MarkUsed();
940 return iter->second; 963 return iter->second;
964 }
941 965
942 FilePath path = GetDirectoryForOriginAndType(origin, type, true); 966 FilePath path = GetDirectoryForOriginAndType(origin, type, create);
943 if (path.empty()) 967 if (path.empty())
944 return NULL; 968 return NULL;
945 if (!file_util::DirectoryExists(path)) { 969 if (!file_util::DirectoryExists(path)) {
946 if (!file_util::CreateDirectory(path)) { 970 if (!file_util::CreateDirectory(path)) {
947 LOG(WARNING) << "Failed to origin+type directory: " << path.value(); 971 LOG(WARNING) << "Failed to origin+type directory: " << path.value();
948 return NULL; 972 return NULL;
949 } 973 }
950 } 974 }
975 MarkUsed();
951 path = path.AppendASCII(kDirectoryDatabaseName); 976 path = path.AppendASCII(kDirectoryDatabaseName);
952 FileSystemDirectoryDatabase* database = new FileSystemDirectoryDatabase(path); 977 FileSystemDirectoryDatabase* database = new FileSystemDirectoryDatabase(path);
953 directories_[key] = database; 978 directories_[key] = database;
954 return database; 979 return database;
955 } 980 }
956 981
957 void ObfuscatedFileSystemFileUtil::MarkUsed() { 982 void ObfuscatedFileSystemFileUtil::MarkUsed() {
958 if (timer_.IsRunning()) 983 if (timer_.IsRunning())
959 timer_.Reset(); 984 timer_.Reset();
960 else 985 else
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 return false; 1026 return false;
1002 } 1027 }
1003 origin_database_.reset( 1028 origin_database_.reset(
1004 new FileSystemOriginDatabase( 1029 new FileSystemOriginDatabase(
1005 file_system_directory_.AppendASCII(kOriginDatabaseName))); 1030 file_system_directory_.AppendASCII(kOriginDatabaseName)));
1006 } 1031 }
1007 return true; 1032 return true;
1008 } 1033 }
1009 1034
1010 } // namespace fileapi 1035 } // 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