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

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

Issue 12163003: Add FilePath to base namespace. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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_util.h ('k') | webkit/fileapi/obfuscated_file_util_unittest.cc » ('j') | 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) 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/fileapi/obfuscated_file_util.h" 5 #include "webkit/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 10 matching lines...) Expand all
21 #include "webkit/fileapi/file_system_context.h" 21 #include "webkit/fileapi/file_system_context.h"
22 #include "webkit/fileapi/file_system_operation_context.h" 22 #include "webkit/fileapi/file_system_operation_context.h"
23 #include "webkit/fileapi/file_system_url.h" 23 #include "webkit/fileapi/file_system_url.h"
24 #include "webkit/fileapi/file_system_util.h" 24 #include "webkit/fileapi/file_system_util.h"
25 #include "webkit/fileapi/native_file_util.h" 25 #include "webkit/fileapi/native_file_util.h"
26 #include "webkit/fileapi/sandbox_mount_point_provider.h" 26 #include "webkit/fileapi/sandbox_mount_point_provider.h"
27 #include "webkit/quota/quota_manager.h" 27 #include "webkit/quota/quota_manager.h"
28 28
29 // Example of various paths: 29 // Example of various paths:
30 // void ObfuscatedFileUtil::DoSomething(const FileSystemURL& url) { 30 // void ObfuscatedFileUtil::DoSomething(const FileSystemURL& url) {
31 // FilePath virtual_path = url.path(); 31 // base::FilePath virtual_path = url.path();
32 // FilePath local_path = GetLocalFilePath(url); 32 // base::FilePath local_path = GetLocalFilePath(url);
33 // 33 //
34 // NativeFileUtil::DoSomething(local_path); 34 // NativeFileUtil::DoSomething(local_path);
35 // file_util::DoAnother(local_path); 35 // file_util::DoAnother(local_path);
36 // } 36 // }
37 37
38 namespace fileapi { 38 namespace fileapi {
39 39
40 namespace { 40 namespace {
41 41
42 typedef FileSystemDirectoryDatabase::FileId FileId; 42 typedef FileSystemDirectoryDatabase::FileId FileId;
43 typedef FileSystemDirectoryDatabase::FileInfo FileInfo; 43 typedef FileSystemDirectoryDatabase::FileInfo FileInfo;
44 44
45 const int64 kFlushDelaySeconds = 10 * 60; // 10 minutes 45 const int64 kFlushDelaySeconds = 10 * 60; // 10 minutes
46 46
47 void InitFileInfo( 47 void InitFileInfo(
48 FileSystemDirectoryDatabase::FileInfo* file_info, 48 FileSystemDirectoryDatabase::FileInfo* file_info,
49 FileSystemDirectoryDatabase::FileId parent_id, 49 FileSystemDirectoryDatabase::FileId parent_id,
50 const FilePath::StringType& file_name) { 50 const base::FilePath::StringType& file_name) {
51 DCHECK(file_info); 51 DCHECK(file_info);
52 file_info->parent_id = parent_id; 52 file_info->parent_id = parent_id;
53 file_info->name = file_name; 53 file_info->name = file_name;
54 } 54 }
55 55
56 // Costs computed as per crbug.com/86114, based on the LevelDB implementation of 56 // Costs computed as per crbug.com/86114, based on the LevelDB implementation of
57 // path storage under Linux. It's not clear if that will differ on Windows, on 57 // path storage under Linux. It's not clear if that will differ on Windows, on
58 // which FilePath uses wide chars [since they're converted to UTF-8 for storage 58 // which base::FilePath uses wide chars [since they're converted to UTF-8 for st orage
59 // anyway], but as long as the cost is high enough that one can't cheat on quota 59 // anyway], but as long as the cost is high enough that one can't cheat on quota
60 // by storing data in paths, it doesn't need to be all that accurate. 60 // by storing data in paths, it doesn't need to be all that accurate.
61 const int64 kPathCreationQuotaCost = 146; // Bytes per inode, basically. 61 const int64 kPathCreationQuotaCost = 146; // Bytes per inode, basically.
62 const int64 kPathByteQuotaCost = 2; // Bytes per byte of path length in UTF-8. 62 const int64 kPathByteQuotaCost = 2; // Bytes per byte of path length in UTF-8.
63 63
64 int64 UsageForPath(size_t length) { 64 int64 UsageForPath(size_t length) {
65 return kPathCreationQuotaCost + 65 return kPathCreationQuotaCost +
66 static_cast<int64>(length) * kPathByteQuotaCost; 66 static_cast<int64>(length) * kPathByteQuotaCost;
67 } 67 }
68 68
(...skipping 15 matching lines...) Expand all
84 context->update_observers()->Notify( 84 context->update_observers()->Notify(
85 &FileUpdateObserver::OnUpdate, MakeTuple(url, growth)); 85 &FileUpdateObserver::OnUpdate, MakeTuple(url, growth));
86 } 86 }
87 87
88 void TouchDirectory(FileSystemDirectoryDatabase* db, FileId dir_id) { 88 void TouchDirectory(FileSystemDirectoryDatabase* db, FileId dir_id) {
89 DCHECK(db); 89 DCHECK(db);
90 if (!db->UpdateModificationTime(dir_id, base::Time::Now())) 90 if (!db->UpdateModificationTime(dir_id, base::Time::Now()))
91 NOTREACHED(); 91 NOTREACHED();
92 } 92 }
93 93
94 const FilePath::CharType kTemporaryDirectoryName[] = FILE_PATH_LITERAL("t"); 94 const base::FilePath::CharType kTemporaryDirectoryName[] = FILE_PATH_LITERAL("t" );
95 const FilePath::CharType kPersistentDirectoryName[] = FILE_PATH_LITERAL("p"); 95 const base::FilePath::CharType kPersistentDirectoryName[] = FILE_PATH_LITERAL("p ");
96 const FilePath::CharType kSyncableDirectoryName[] = FILE_PATH_LITERAL("s"); 96 const base::FilePath::CharType kSyncableDirectoryName[] = FILE_PATH_LITERAL("s") ;
97 97
98 } // namespace 98 } // namespace
99 99
100 using base::PlatformFile; 100 using base::PlatformFile;
101 using base::PlatformFileError; 101 using base::PlatformFileError;
102 102
103 class ObfuscatedFileEnumerator 103 class ObfuscatedFileEnumerator
104 : public FileSystemFileUtil::AbstractFileEnumerator { 104 : public FileSystemFileUtil::AbstractFileEnumerator {
105 public: 105 public:
106 ObfuscatedFileEnumerator( 106 ObfuscatedFileEnumerator(
107 FileSystemDirectoryDatabase* db, 107 FileSystemDirectoryDatabase* db,
108 FileSystemOperationContext* context, 108 FileSystemOperationContext* context,
109 ObfuscatedFileUtil* obfuscated_file_util, 109 ObfuscatedFileUtil* obfuscated_file_util,
110 const FileSystemURL& root_url, 110 const FileSystemURL& root_url,
111 bool recursive) 111 bool recursive)
112 : db_(db), 112 : db_(db),
113 context_(context), 113 context_(context),
114 obfuscated_file_util_(obfuscated_file_util), 114 obfuscated_file_util_(obfuscated_file_util),
115 origin_(root_url.origin()), 115 origin_(root_url.origin()),
116 type_(root_url.type()), 116 type_(root_url.type()),
117 recursive_(recursive), 117 recursive_(recursive),
118 current_file_id_(0) { 118 current_file_id_(0) {
119 FilePath root_virtual_path = root_url.path(); 119 base::FilePath root_virtual_path = root_url.path();
120 FileId file_id; 120 FileId file_id;
121 121
122 if (!db_->GetFileWithPath(root_virtual_path, &file_id)) 122 if (!db_->GetFileWithPath(root_virtual_path, &file_id))
123 return; 123 return;
124 124
125 FileRecord record = { file_id, root_virtual_path }; 125 FileRecord record = { file_id, root_virtual_path };
126 recurse_queue_.push(record); 126 recurse_queue_.push(record);
127 } 127 }
128 128
129 virtual ~ObfuscatedFileEnumerator() {} 129 virtual ~ObfuscatedFileEnumerator() {}
130 130
131 virtual FilePath Next() OVERRIDE { 131 virtual base::FilePath Next() OVERRIDE {
132 ProcessRecurseQueue(); 132 ProcessRecurseQueue();
133 if (display_stack_.empty()) 133 if (display_stack_.empty())
134 return FilePath(); 134 return base::FilePath();
135 135
136 current_file_id_ = display_stack_.back(); 136 current_file_id_ = display_stack_.back();
137 display_stack_.pop_back(); 137 display_stack_.pop_back();
138 138
139 FileInfo file_info; 139 FileInfo file_info;
140 FilePath platform_file_path; 140 base::FilePath platform_file_path;
141 base::PlatformFileError error = 141 base::PlatformFileError error =
142 obfuscated_file_util_->GetFileInfoInternal( 142 obfuscated_file_util_->GetFileInfoInternal(
143 db_, context_, origin_, type_, current_file_id_, 143 db_, context_, origin_, type_, current_file_id_,
144 &file_info, &current_platform_file_info_, &platform_file_path); 144 &file_info, &current_platform_file_info_, &platform_file_path);
145 if (error != base::PLATFORM_FILE_OK) 145 if (error != base::PLATFORM_FILE_OK)
146 return Next(); 146 return Next();
147 147
148 FilePath virtual_path = 148 base::FilePath virtual_path =
149 current_parent_virtual_path_.Append(file_info.name); 149 current_parent_virtual_path_.Append(file_info.name);
150 if (recursive_ && file_info.is_directory()) { 150 if (recursive_ && file_info.is_directory()) {
151 FileRecord record = { current_file_id_, virtual_path }; 151 FileRecord record = { current_file_id_, virtual_path };
152 recurse_queue_.push(record); 152 recurse_queue_.push(record);
153 } 153 }
154 return virtual_path; 154 return virtual_path;
155 } 155 }
156 156
157 virtual int64 Size() OVERRIDE { 157 virtual int64 Size() OVERRIDE {
158 return current_platform_file_info_.size; 158 return current_platform_file_info_.size;
159 } 159 }
160 160
161 virtual base::Time LastModifiedTime() OVERRIDE { 161 virtual base::Time LastModifiedTime() OVERRIDE {
162 return current_platform_file_info_.last_modified; 162 return current_platform_file_info_.last_modified;
163 } 163 }
164 164
165 virtual bool IsDirectory() OVERRIDE { 165 virtual bool IsDirectory() OVERRIDE {
166 return current_platform_file_info_.is_directory; 166 return current_platform_file_info_.is_directory;
167 } 167 }
168 168
169 private: 169 private:
170 typedef FileSystemDirectoryDatabase::FileId FileId; 170 typedef FileSystemDirectoryDatabase::FileId FileId;
171 typedef FileSystemDirectoryDatabase::FileInfo FileInfo; 171 typedef FileSystemDirectoryDatabase::FileInfo FileInfo;
172 172
173 struct FileRecord { 173 struct FileRecord {
174 FileId file_id; 174 FileId file_id;
175 FilePath virtual_path; 175 base::FilePath virtual_path;
176 }; 176 };
177 177
178 void ProcessRecurseQueue() { 178 void ProcessRecurseQueue() {
179 while (display_stack_.empty() && !recurse_queue_.empty()) { 179 while (display_stack_.empty() && !recurse_queue_.empty()) {
180 FileRecord entry = recurse_queue_.front(); 180 FileRecord entry = recurse_queue_.front();
181 recurse_queue_.pop(); 181 recurse_queue_.pop();
182 if (!db_->ListChildren(entry.file_id, &display_stack_)) { 182 if (!db_->ListChildren(entry.file_id, &display_stack_)) {
183 display_stack_.clear(); 183 display_stack_.clear();
184 return; 184 return;
185 } 185 }
186 current_parent_virtual_path_ = entry.virtual_path; 186 current_parent_virtual_path_ = entry.virtual_path;
187 } 187 }
188 } 188 }
189 189
190 FileSystemDirectoryDatabase* db_; 190 FileSystemDirectoryDatabase* db_;
191 FileSystemOperationContext* context_; 191 FileSystemOperationContext* context_;
192 ObfuscatedFileUtil* obfuscated_file_util_; 192 ObfuscatedFileUtil* obfuscated_file_util_;
193 GURL origin_; 193 GURL origin_;
194 FileSystemType type_; 194 FileSystemType type_;
195 bool recursive_; 195 bool recursive_;
196 196
197 std::queue<FileRecord> recurse_queue_; 197 std::queue<FileRecord> recurse_queue_;
198 std::vector<FileId> display_stack_; 198 std::vector<FileId> display_stack_;
199 FilePath current_parent_virtual_path_; 199 base::FilePath current_parent_virtual_path_;
200 200
201 FileId current_file_id_; 201 FileId current_file_id_;
202 base::PlatformFileInfo current_platform_file_info_; 202 base::PlatformFileInfo current_platform_file_info_;
203 }; 203 };
204 204
205 class ObfuscatedOriginEnumerator 205 class ObfuscatedOriginEnumerator
206 : public ObfuscatedFileUtil::AbstractOriginEnumerator { 206 : public ObfuscatedFileUtil::AbstractOriginEnumerator {
207 public: 207 public:
208 typedef FileSystemOriginDatabase::OriginRecord OriginRecord; 208 typedef FileSystemOriginDatabase::OriginRecord OriginRecord;
209 ObfuscatedOriginEnumerator( 209 ObfuscatedOriginEnumerator(
210 FileSystemOriginDatabase* origin_database, 210 FileSystemOriginDatabase* origin_database,
211 const FilePath& base_file_path) 211 const base::FilePath& base_file_path)
212 : base_file_path_(base_file_path) { 212 : base_file_path_(base_file_path) {
213 if (origin_database) 213 if (origin_database)
214 origin_database->ListAllOrigins(&origins_); 214 origin_database->ListAllOrigins(&origins_);
215 } 215 }
216 216
217 ~ObfuscatedOriginEnumerator() {} 217 ~ObfuscatedOriginEnumerator() {}
218 218
219 // Returns the next origin. Returns empty if there are no more origins. 219 // Returns the next origin. Returns empty if there are no more origins.
220 virtual GURL Next() OVERRIDE { 220 virtual GURL Next() OVERRIDE {
221 OriginRecord record; 221 OriginRecord record;
222 if (!origins_.empty()) { 222 if (!origins_.empty()) {
223 record = origins_.back(); 223 record = origins_.back();
224 origins_.pop_back(); 224 origins_.pop_back();
225 } 225 }
226 current_ = record; 226 current_ = record;
227 return GetOriginURLFromIdentifier(record.origin); 227 return GetOriginURLFromIdentifier(record.origin);
228 } 228 }
229 229
230 // Returns the current origin's information. 230 // Returns the current origin's information.
231 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { 231 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE {
232 if (current_.path.empty()) 232 if (current_.path.empty())
233 return false; 233 return false;
234 FilePath::StringType type_string = 234 base::FilePath::StringType type_string =
235 ObfuscatedFileUtil::GetDirectoryNameForType(type); 235 ObfuscatedFileUtil::GetDirectoryNameForType(type);
236 if (type_string.empty()) { 236 if (type_string.empty()) {
237 NOTREACHED(); 237 NOTREACHED();
238 return false; 238 return false;
239 } 239 }
240 FilePath path = base_file_path_.Append(current_.path).Append(type_string); 240 base::FilePath path = base_file_path_.Append(current_.path).Append(type_stri ng);
241 return file_util::DirectoryExists(path); 241 return file_util::DirectoryExists(path);
242 } 242 }
243 243
244 private: 244 private:
245 std::vector<OriginRecord> origins_; 245 std::vector<OriginRecord> origins_;
246 OriginRecord current_; 246 OriginRecord current_;
247 FilePath base_file_path_; 247 base::FilePath base_file_path_;
248 }; 248 };
249 249
250 ObfuscatedFileUtil::ObfuscatedFileUtil( 250 ObfuscatedFileUtil::ObfuscatedFileUtil(
251 const FilePath& file_system_directory) 251 const base::FilePath& file_system_directory)
252 : file_system_directory_(file_system_directory) { 252 : file_system_directory_(file_system_directory) {
253 } 253 }
254 254
255 ObfuscatedFileUtil::~ObfuscatedFileUtil() { 255 ObfuscatedFileUtil::~ObfuscatedFileUtil() {
256 DropDatabases(); 256 DropDatabases();
257 } 257 }
258 258
259 PlatformFileError ObfuscatedFileUtil::CreateOrOpen( 259 PlatformFileError ObfuscatedFileUtil::CreateOrOpen(
260 FileSystemOperationContext* context, 260 FileSystemOperationContext* context,
261 const FileSystemURL& url, int file_flags, 261 const FileSystemURL& url, int file_flags,
(...skipping 16 matching lines...) Expand all
278 &parent_id)) 278 &parent_id))
279 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 279 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
280 FileInfo file_info; 280 FileInfo file_info;
281 InitFileInfo(&file_info, parent_id, 281 InitFileInfo(&file_info, parent_id,
282 VirtualPath::BaseName(url.path()).value()); 282 VirtualPath::BaseName(url.path()).value());
283 283
284 int64 growth = UsageForPath(file_info.name.size()); 284 int64 growth = UsageForPath(file_info.name.size());
285 if (!AllocateQuota(context, growth)) 285 if (!AllocateQuota(context, growth))
286 return base::PLATFORM_FILE_ERROR_NO_SPACE; 286 return base::PLATFORM_FILE_ERROR_NO_SPACE;
287 PlatformFileError error = CreateFile( 287 PlatformFileError error = CreateFile(
288 context, FilePath(), 288 context, base::FilePath(),
289 url.origin(), url.type(), &file_info, 289 url.origin(), url.type(), &file_info,
290 file_flags, file_handle); 290 file_flags, file_handle);
291 if (created && base::PLATFORM_FILE_OK == error) { 291 if (created && base::PLATFORM_FILE_OK == error) {
292 *created = true; 292 *created = true;
293 UpdateUsage(context, url, growth); 293 UpdateUsage(context, url, growth);
294 context->change_observers()->Notify( 294 context->change_observers()->Notify(
295 &FileChangeObserver::OnCreateFile, MakeTuple(url)); 295 &FileChangeObserver::OnCreateFile, MakeTuple(url));
296 } 296 }
297 return error; 297 return error;
298 } 298 }
299 299
300 if (file_flags & base::PLATFORM_FILE_CREATE) 300 if (file_flags & base::PLATFORM_FILE_CREATE)
301 return base::PLATFORM_FILE_ERROR_EXISTS; 301 return base::PLATFORM_FILE_ERROR_EXISTS;
302 302
303 base::PlatformFileInfo platform_file_info; 303 base::PlatformFileInfo platform_file_info;
304 FilePath local_path; 304 base::FilePath local_path;
305 FileInfo file_info; 305 FileInfo file_info;
306 base::PlatformFileError error = GetFileInfoInternal( 306 base::PlatformFileError error = GetFileInfoInternal(
307 db, context, url.origin(), url.type(), file_id, 307 db, context, url.origin(), url.type(), file_id,
308 &file_info, &platform_file_info, &local_path); 308 &file_info, &platform_file_info, &local_path);
309 if (error != base::PLATFORM_FILE_OK) 309 if (error != base::PLATFORM_FILE_OK)
310 return error; 310 return error;
311 if (file_info.is_directory()) 311 if (file_info.is_directory())
312 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; 312 return base::PLATFORM_FILE_ERROR_NOT_A_FILE;
313 313
314 int64 delta = 0; 314 int64 delta = 0;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 371 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
372 372
373 FileInfo file_info; 373 FileInfo file_info;
374 InitFileInfo(&file_info, parent_id, 374 InitFileInfo(&file_info, parent_id,
375 VirtualPath::BaseName(url.path()).value()); 375 VirtualPath::BaseName(url.path()).value());
376 376
377 int64 growth = UsageForPath(file_info.name.size()); 377 int64 growth = UsageForPath(file_info.name.size());
378 if (!AllocateQuota(context, growth)) 378 if (!AllocateQuota(context, growth))
379 return base::PLATFORM_FILE_ERROR_NO_SPACE; 379 return base::PLATFORM_FILE_ERROR_NO_SPACE;
380 PlatformFileError error = CreateFile( 380 PlatformFileError error = CreateFile(
381 context, FilePath(), url.origin(), url.type(), &file_info, 0, NULL); 381 context, base::FilePath(), url.origin(), url.type(), &file_info, 0, NULL);
382 if (created && base::PLATFORM_FILE_OK == error) { 382 if (created && base::PLATFORM_FILE_OK == error) {
383 *created = true; 383 *created = true;
384 UpdateUsage(context, url, growth); 384 UpdateUsage(context, url, growth);
385 context->change_observers()->Notify( 385 context->change_observers()->Notify(
386 &FileChangeObserver::OnCreateFile, MakeTuple(url)); 386 &FileChangeObserver::OnCreateFile, MakeTuple(url));
387 } 387 }
388 return error; 388 return error;
389 } 389 }
390 390
391 PlatformFileError ObfuscatedFileUtil::CreateDirectory( 391 PlatformFileError ObfuscatedFileUtil::CreateDirectory(
(...skipping 22 matching lines...) Expand all
414 return base::PLATFORM_FILE_ERROR_EXISTS; 414 return base::PLATFORM_FILE_ERROR_EXISTS;
415 if (!db->GetFileInfo(file_id, &file_info)) { 415 if (!db->GetFileInfo(file_id, &file_info)) {
416 NOTREACHED(); 416 NOTREACHED();
417 return base::PLATFORM_FILE_ERROR_FAILED; 417 return base::PLATFORM_FILE_ERROR_FAILED;
418 } 418 }
419 if (!file_info.is_directory()) 419 if (!file_info.is_directory())
420 return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; 420 return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY;
421 return base::PLATFORM_FILE_OK; 421 return base::PLATFORM_FILE_OK;
422 } 422 }
423 423
424 std::vector<FilePath::StringType> components; 424 std::vector<base::FilePath::StringType> components;
425 VirtualPath::GetComponents(url.path(), &components); 425 VirtualPath::GetComponents(url.path(), &components);
426 FileId parent_id = 0; 426 FileId parent_id = 0;
427 size_t index; 427 size_t index;
428 for (index = 0; index < components.size(); ++index) { 428 for (index = 0; index < components.size(); ++index) {
429 FilePath::StringType name = components[index]; 429 base::FilePath::StringType name = components[index];
430 if (name == FILE_PATH_LITERAL("/")) 430 if (name == FILE_PATH_LITERAL("/"))
431 continue; 431 continue;
432 if (!db->GetChildWithName(parent_id, name, &parent_id)) 432 if (!db->GetChildWithName(parent_id, name, &parent_id))
433 break; 433 break;
434 } 434 }
435 if (!recursive && components.size() - index > 1) 435 if (!recursive && components.size() - index > 1)
436 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 436 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
437 bool first = true; 437 bool first = true;
438 for (; index < components.size(); ++index) { 438 for (; index < components.size(); ++index) {
439 FileInfo file_info; 439 FileInfo file_info;
(...skipping 17 matching lines...) Expand all
457 TouchDirectory(db, file_info.parent_id); 457 TouchDirectory(db, file_info.parent_id);
458 } 458 }
459 } 459 }
460 return base::PLATFORM_FILE_OK; 460 return base::PLATFORM_FILE_OK;
461 } 461 }
462 462
463 PlatformFileError ObfuscatedFileUtil::GetFileInfo( 463 PlatformFileError ObfuscatedFileUtil::GetFileInfo(
464 FileSystemOperationContext* context, 464 FileSystemOperationContext* context,
465 const FileSystemURL& url, 465 const FileSystemURL& url,
466 base::PlatformFileInfo* file_info, 466 base::PlatformFileInfo* file_info,
467 FilePath* platform_file_path) { 467 base::FilePath* platform_file_path) {
468 FileSystemDirectoryDatabase* db = GetDirectoryDatabase( 468 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
469 url.origin(), url.type(), false); 469 url.origin(), url.type(), false);
470 if (!db) 470 if (!db)
471 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 471 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
472 FileId file_id; 472 FileId file_id;
473 if (!db->GetFileWithPath(url.path(), &file_id)) 473 if (!db->GetFileWithPath(url.path(), &file_id))
474 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 474 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
475 FileInfo local_info; 475 FileInfo local_info;
476 return GetFileInfoInternal(db, context, 476 return GetFileInfoInternal(db, context,
477 url.origin(), url.type(), 477 url.origin(), url.type(),
(...skipping 13 matching lines...) Expand all
491 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); 491 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>();
492 } 492 }
493 return make_scoped_ptr(new ObfuscatedFileEnumerator(db, context, this, 493 return make_scoped_ptr(new ObfuscatedFileEnumerator(db, context, this,
494 root_url, recursive)) 494 root_url, recursive))
495 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); 495 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>();
496 } 496 }
497 497
498 PlatformFileError ObfuscatedFileUtil::GetLocalFilePath( 498 PlatformFileError ObfuscatedFileUtil::GetLocalFilePath(
499 FileSystemOperationContext* context, 499 FileSystemOperationContext* context,
500 const FileSystemURL& url, 500 const FileSystemURL& url,
501 FilePath* local_path) { 501 base::FilePath* local_path) {
502 FileSystemDirectoryDatabase* db = GetDirectoryDatabase( 502 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
503 url.origin(), url.type(), false); 503 url.origin(), url.type(), false);
504 if (!db) 504 if (!db)
505 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 505 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
506 FileId file_id; 506 FileId file_id;
507 if (!db->GetFileWithPath(url.path(), &file_id)) 507 if (!db->GetFileWithPath(url.path(), &file_id))
508 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 508 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
509 FileInfo file_info; 509 FileInfo file_info;
510 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) { 510 if (!db->GetFileInfo(file_id, &file_info) || file_info.is_directory()) {
511 NOTREACHED(); 511 NOTREACHED();
(...skipping 24 matching lines...) Expand all
536 FileInfo file_info; 536 FileInfo file_info;
537 if (!db->GetFileInfo(file_id, &file_info)) { 537 if (!db->GetFileInfo(file_id, &file_info)) {
538 NOTREACHED(); 538 NOTREACHED();
539 return base::PLATFORM_FILE_ERROR_FAILED; 539 return base::PLATFORM_FILE_ERROR_FAILED;
540 } 540 }
541 if (file_info.is_directory()) { 541 if (file_info.is_directory()) {
542 if (!db->UpdateModificationTime(file_id, last_modified_time)) 542 if (!db->UpdateModificationTime(file_id, last_modified_time))
543 return base::PLATFORM_FILE_ERROR_FAILED; 543 return base::PLATFORM_FILE_ERROR_FAILED;
544 return base::PLATFORM_FILE_OK; 544 return base::PLATFORM_FILE_OK;
545 } 545 }
546 FilePath local_path = DataPathToLocalPath( 546 base::FilePath local_path = DataPathToLocalPath(
547 url.origin(), url.type(), file_info.data_path); 547 url.origin(), url.type(), file_info.data_path);
548 return NativeFileUtil::Touch( 548 return NativeFileUtil::Touch(
549 local_path, last_access_time, last_modified_time); 549 local_path, last_access_time, last_modified_time);
550 } 550 }
551 551
552 PlatformFileError ObfuscatedFileUtil::Truncate( 552 PlatformFileError ObfuscatedFileUtil::Truncate(
553 FileSystemOperationContext* context, 553 FileSystemOperationContext* context,
554 const FileSystemURL& url, 554 const FileSystemURL& url,
555 int64 length) { 555 int64 length) {
556 base::PlatformFileInfo file_info; 556 base::PlatformFileInfo file_info;
557 FilePath local_path; 557 base::FilePath local_path;
558 base::PlatformFileError error = 558 base::PlatformFileError error =
559 GetFileInfo(context, url, &file_info, &local_path); 559 GetFileInfo(context, url, &file_info, &local_path);
560 if (error != base::PLATFORM_FILE_OK) 560 if (error != base::PLATFORM_FILE_OK)
561 return error; 561 return error;
562 562
563 int64 growth = length - file_info.size; 563 int64 growth = length - file_info.size;
564 if (!AllocateQuota(context, growth)) 564 if (!AllocateQuota(context, growth))
565 return base::PLATFORM_FILE_ERROR_NO_SPACE; 565 return base::PLATFORM_FILE_ERROR_NO_SPACE;
566 error = NativeFileUtil::Truncate(local_path, length); 566 error = NativeFileUtil::Truncate(local_path, length);
567 if (error == base::PLATFORM_FILE_OK) { 567 if (error == base::PLATFORM_FILE_OK) {
(...skipping 21 matching lines...) Expand all
589 FileId src_file_id; 589 FileId src_file_id;
590 if (!db->GetFileWithPath(src_url.path(), &src_file_id)) 590 if (!db->GetFileWithPath(src_url.path(), &src_file_id))
591 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 591 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
592 592
593 FileId dest_file_id; 593 FileId dest_file_id;
594 bool overwrite = db->GetFileWithPath(dest_url.path(), 594 bool overwrite = db->GetFileWithPath(dest_url.path(),
595 &dest_file_id); 595 &dest_file_id);
596 596
597 FileInfo src_file_info; 597 FileInfo src_file_info;
598 base::PlatformFileInfo src_platform_file_info; 598 base::PlatformFileInfo src_platform_file_info;
599 FilePath src_local_path; 599 base::FilePath src_local_path;
600 base::PlatformFileError error = GetFileInfoInternal( 600 base::PlatformFileError error = GetFileInfoInternal(
601 db, context, src_url.origin(), src_url.type(), src_file_id, 601 db, context, src_url.origin(), src_url.type(), src_file_id,
602 &src_file_info, &src_platform_file_info, &src_local_path); 602 &src_file_info, &src_platform_file_info, &src_local_path);
603 if (error != base::PLATFORM_FILE_OK) 603 if (error != base::PLATFORM_FILE_OK)
604 return error; 604 return error;
605 if (src_file_info.is_directory()) 605 if (src_file_info.is_directory())
606 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; 606 return base::PLATFORM_FILE_ERROR_NOT_A_FILE;
607 607
608 FileInfo dest_file_info; 608 FileInfo dest_file_info;
609 base::PlatformFileInfo dest_platform_file_info; // overwrite case only 609 base::PlatformFileInfo dest_platform_file_info; // overwrite case only
610 FilePath dest_local_path; // overwrite case only 610 base::FilePath dest_local_path; // overwrite case only
611 if (overwrite) { 611 if (overwrite) {
612 base::PlatformFileError error = GetFileInfoInternal( 612 base::PlatformFileError error = GetFileInfoInternal(
613 db, context, dest_url.origin(), dest_url.type(), dest_file_id, 613 db, context, dest_url.origin(), dest_url.type(), dest_file_id,
614 &dest_file_info, &dest_platform_file_info, &dest_local_path); 614 &dest_file_info, &dest_platform_file_info, &dest_local_path);
615 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) 615 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
616 overwrite = false; // fallback to non-overwrite case 616 overwrite = false; // fallback to non-overwrite case
617 else if (error != base::PLATFORM_FILE_OK) 617 else if (error != base::PLATFORM_FILE_OK)
618 return error; 618 return error;
619 else if (dest_file_info.is_directory()) 619 else if (dest_file_info.is_directory())
620 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; 620 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 } 708 }
709 709
710 TouchDirectory(db, dest_file_info.parent_id); 710 TouchDirectory(db, dest_file_info.parent_id);
711 711
712 UpdateUsage(context, dest_url, growth); 712 UpdateUsage(context, dest_url, growth);
713 return error; 713 return error;
714 } 714 }
715 715
716 PlatformFileError ObfuscatedFileUtil::CopyInForeignFile( 716 PlatformFileError ObfuscatedFileUtil::CopyInForeignFile(
717 FileSystemOperationContext* context, 717 FileSystemOperationContext* context,
718 const FilePath& src_file_path, 718 const base::FilePath& src_file_path,
719 const FileSystemURL& dest_url) { 719 const FileSystemURL& dest_url) {
720 FileSystemDirectoryDatabase* db = GetDirectoryDatabase( 720 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
721 dest_url.origin(), dest_url.type(), true); 721 dest_url.origin(), dest_url.type(), true);
722 if (!db) 722 if (!db)
723 return base::PLATFORM_FILE_ERROR_FAILED; 723 return base::PLATFORM_FILE_ERROR_FAILED;
724 724
725 base::PlatformFileInfo src_platform_file_info; 725 base::PlatformFileInfo src_platform_file_info;
726 if (!file_util::GetFileInfo(src_file_path, &src_platform_file_info)) 726 if (!file_util::GetFileInfo(src_file_path, &src_platform_file_info))
727 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 727 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
728 728
729 FileId dest_file_id; 729 FileId dest_file_id;
730 bool overwrite = db->GetFileWithPath(dest_url.path(), 730 bool overwrite = db->GetFileWithPath(dest_url.path(),
731 &dest_file_id); 731 &dest_file_id);
732 732
733 FileInfo dest_file_info; 733 FileInfo dest_file_info;
734 base::PlatformFileInfo dest_platform_file_info; // overwrite case only 734 base::PlatformFileInfo dest_platform_file_info; // overwrite case only
735 if (overwrite) { 735 if (overwrite) {
736 FilePath dest_local_path; 736 base::FilePath dest_local_path;
737 base::PlatformFileError error = GetFileInfoInternal( 737 base::PlatformFileError error = GetFileInfoInternal(
738 db, context, dest_url.origin(), dest_url.type(), dest_file_id, 738 db, context, dest_url.origin(), dest_url.type(), dest_file_id,
739 &dest_file_info, &dest_platform_file_info, &dest_local_path); 739 &dest_file_info, &dest_platform_file_info, &dest_local_path);
740 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) 740 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
741 overwrite = false; // fallback to non-overwrite case 741 overwrite = false; // fallback to non-overwrite case
742 else if (error != base::PLATFORM_FILE_OK) 742 else if (error != base::PLATFORM_FILE_OK)
743 return error; 743 return error;
744 else if (dest_file_info.is_directory()) 744 else if (dest_file_info.is_directory())
745 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; 745 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
746 } 746 }
(...skipping 12 matching lines...) Expand all
759 int64 growth = src_platform_file_info.size; 759 int64 growth = src_platform_file_info.size;
760 if (overwrite) 760 if (overwrite)
761 growth -= dest_platform_file_info.size; 761 growth -= dest_platform_file_info.size;
762 else 762 else
763 growth += UsageForPath(dest_file_info.name.size()); 763 growth += UsageForPath(dest_file_info.name.size());
764 if (!AllocateQuota(context, growth)) 764 if (!AllocateQuota(context, growth))
765 return base::PLATFORM_FILE_ERROR_NO_SPACE; 765 return base::PLATFORM_FILE_ERROR_NO_SPACE;
766 766
767 base::PlatformFileError error; 767 base::PlatformFileError error;
768 if (overwrite) { 768 if (overwrite) {
769 FilePath dest_local_path = DataPathToLocalPath( 769 base::FilePath dest_local_path = DataPathToLocalPath(
770 dest_url.origin(), dest_url.type(), dest_file_info.data_path); 770 dest_url.origin(), dest_url.type(), dest_file_info.data_path);
771 error = NativeFileUtil::CopyOrMoveFile( 771 error = NativeFileUtil::CopyOrMoveFile(
772 src_file_path, dest_local_path, true); 772 src_file_path, dest_local_path, true);
773 } else { 773 } else {
774 error = CreateFile(context, src_file_path, 774 error = CreateFile(context, src_file_path,
775 dest_url.origin(), dest_url.type(), 775 dest_url.origin(), dest_url.type(),
776 &dest_file_info, 0, NULL); 776 &dest_file_info, 0, NULL);
777 } 777 }
778 778
779 if (error != base::PLATFORM_FILE_OK) 779 if (error != base::PLATFORM_FILE_OK)
(...skipping 18 matching lines...) Expand all
798 FileSystemDirectoryDatabase* db = GetDirectoryDatabase( 798 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
799 url.origin(), url.type(), true); 799 url.origin(), url.type(), true);
800 if (!db) 800 if (!db)
801 return base::PLATFORM_FILE_ERROR_FAILED; 801 return base::PLATFORM_FILE_ERROR_FAILED;
802 FileId file_id; 802 FileId file_id;
803 if (!db->GetFileWithPath(url.path(), &file_id)) 803 if (!db->GetFileWithPath(url.path(), &file_id))
804 return base::PLATFORM_FILE_ERROR_NOT_FOUND; 804 return base::PLATFORM_FILE_ERROR_NOT_FOUND;
805 805
806 FileInfo file_info; 806 FileInfo file_info;
807 base::PlatformFileInfo platform_file_info; 807 base::PlatformFileInfo platform_file_info;
808 FilePath local_path; 808 base::FilePath local_path;
809 base::PlatformFileError error = GetFileInfoInternal( 809 base::PlatformFileError error = GetFileInfoInternal(
810 db, context, url.origin(), url.type(), file_id, 810 db, context, url.origin(), url.type(), file_id,
811 &file_info, &platform_file_info, &local_path); 811 &file_info, &platform_file_info, &local_path);
812 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND && 812 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND &&
813 error != base::PLATFORM_FILE_OK) 813 error != base::PLATFORM_FILE_OK)
814 return error; 814 return error;
815 815
816 if (file_info.is_directory()) 816 if (file_info.is_directory())
817 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; 817 return base::PLATFORM_FILE_ERROR_NOT_A_FILE;
818 818
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 TouchDirectory(db, file_info.parent_id); 863 TouchDirectory(db, file_info.parent_id);
864 context->change_observers()->Notify( 864 context->change_observers()->Notify(
865 &FileChangeObserver::OnRemoveDirectory, MakeTuple(url)); 865 &FileChangeObserver::OnRemoveDirectory, MakeTuple(url));
866 return base::PLATFORM_FILE_OK; 866 return base::PLATFORM_FILE_OK;
867 } 867 }
868 868
869 base::PlatformFileError ObfuscatedFileUtil::CreateSnapshotFile( 869 base::PlatformFileError ObfuscatedFileUtil::CreateSnapshotFile(
870 FileSystemOperationContext* context, 870 FileSystemOperationContext* context,
871 const FileSystemURL& url, 871 const FileSystemURL& url,
872 base::PlatformFileInfo* file_info, 872 base::PlatformFileInfo* file_info,
873 FilePath* platform_path, 873 base::FilePath* platform_path,
874 SnapshotFilePolicy* policy) { 874 SnapshotFilePolicy* policy) {
875 DCHECK(policy); 875 DCHECK(policy);
876 // We're just returning the local file information. 876 // We're just returning the local file information.
877 *policy = kSnapshotFileLocal; 877 *policy = kSnapshotFileLocal;
878 base::PlatformFileError error = GetFileInfo( 878 base::PlatformFileError error = GetFileInfo(
879 context, url, file_info, platform_path); 879 context, url, file_info, platform_path);
880 if (error == base::PLATFORM_FILE_OK && file_info->is_directory) { 880 if (error == base::PLATFORM_FILE_OK && file_info->is_directory) {
881 *file_info = base::PlatformFileInfo(); 881 *file_info = base::PlatformFileInfo();
882 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; 882 return base::PLATFORM_FILE_ERROR_NOT_A_FILE;
883 } 883 }
(...skipping 18 matching lines...) Expand all
902 } 902 }
903 if (!file_info.is_directory()) 903 if (!file_info.is_directory())
904 return true; 904 return true;
905 std::vector<FileId> children; 905 std::vector<FileId> children;
906 // TODO(ericu): This could easily be made faster with help from the database. 906 // TODO(ericu): This could easily be made faster with help from the database.
907 if (!db->ListChildren(file_id, &children)) 907 if (!db->ListChildren(file_id, &children))
908 return true; 908 return true;
909 return children.empty(); 909 return children.empty();
910 } 910 }
911 911
912 FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType( 912 base::FilePath ObfuscatedFileUtil::GetDirectoryForOriginAndType(
913 const GURL& origin, 913 const GURL& origin,
914 FileSystemType type, 914 FileSystemType type,
915 bool create, 915 bool create,
916 base::PlatformFileError* error_code) { 916 base::PlatformFileError* error_code) {
917 FilePath origin_dir = GetDirectoryForOrigin(origin, create, error_code); 917 base::FilePath origin_dir = GetDirectoryForOrigin(origin, create, error_code);
918 if (origin_dir.empty()) 918 if (origin_dir.empty())
919 return FilePath(); 919 return base::FilePath();
920 FilePath::StringType type_string = GetDirectoryNameForType(type); 920 base::FilePath::StringType type_string = GetDirectoryNameForType(type);
921 if (type_string.empty()) { 921 if (type_string.empty()) {
922 LOG(WARNING) << "Unknown filesystem type requested:" << type; 922 LOG(WARNING) << "Unknown filesystem type requested:" << type;
923 923
924 if (error_code) 924 if (error_code)
925 *error_code = base::PLATFORM_FILE_ERROR_INVALID_URL; 925 *error_code = base::PLATFORM_FILE_ERROR_INVALID_URL;
926 return FilePath(); 926 return base::FilePath();
927 } 927 }
928 FilePath path = origin_dir.Append(type_string); 928 base::FilePath path = origin_dir.Append(type_string);
929 base::PlatformFileError error = base::PLATFORM_FILE_OK; 929 base::PlatformFileError error = base::PLATFORM_FILE_OK;
930 if (!file_util::DirectoryExists(path) && 930 if (!file_util::DirectoryExists(path) &&
931 (!create || !file_util::CreateDirectory(path))) { 931 (!create || !file_util::CreateDirectory(path))) {
932 error = create ? 932 error = create ?
933 base::PLATFORM_FILE_ERROR_FAILED : 933 base::PLATFORM_FILE_ERROR_FAILED :
934 base::PLATFORM_FILE_ERROR_NOT_FOUND; 934 base::PLATFORM_FILE_ERROR_NOT_FOUND;
935 } 935 }
936 936
937 if (error_code) 937 if (error_code)
938 *error_code = error; 938 *error_code = error;
939 return path; 939 return path;
940 } 940 }
941 941
942 bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType( 942 bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType(
943 const GURL& origin, FileSystemType type) { 943 const GURL& origin, FileSystemType type) {
944 base::PlatformFileError error = base::PLATFORM_FILE_OK; 944 base::PlatformFileError error = base::PLATFORM_FILE_OK;
945 FilePath origin_type_path = GetDirectoryForOriginAndType(origin, type, false, 945 base::FilePath origin_type_path = GetDirectoryForOriginAndType(origin, type, f alse,
946 &error); 946 &error);
947 if (origin_type_path.empty()) 947 if (origin_type_path.empty())
948 return true; 948 return true;
949 949
950 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND) { 950 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND) {
951 // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase. 951 // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase.
952 // We ignore its error now since 1) it doesn't matter the final result, and 952 // We ignore its error now since 1) it doesn't matter the final result, and
953 // 2) it always returns false in Windows because of LevelDB's 953 // 2) it always returns false in Windows because of LevelDB's
954 // implementation. 954 // implementation.
955 // Information about failure would be useful for debugging. 955 // Information about failure would be useful for debugging.
956 DestroyDirectoryDatabase(origin, type); 956 DestroyDirectoryDatabase(origin, type);
957 if (!file_util::Delete(origin_type_path, true /* recursive */)) 957 if (!file_util::Delete(origin_type_path, true /* recursive */))
958 return false; 958 return false;
959 } 959 }
960 960
961 FilePath origin_path = origin_type_path.DirName(); 961 base::FilePath origin_path = origin_type_path.DirName();
962 DCHECK_EQ(origin_path.value(), 962 DCHECK_EQ(origin_path.value(),
963 GetDirectoryForOrigin(origin, false, NULL).value()); 963 GetDirectoryForOrigin(origin, false, NULL).value());
964 964
965 // At this point we are sure we had successfully deleted the origin/type 965 // At this point we are sure we had successfully deleted the origin/type
966 // directory (i.e. we're ready to just return true). 966 // directory (i.e. we're ready to just return true).
967 // See if we have other directories in this origin directory. 967 // See if we have other directories in this origin directory.
968 std::vector<FileSystemType> other_types; 968 std::vector<FileSystemType> other_types;
969 if (type != kFileSystemTypeTemporary) 969 if (type != kFileSystemTypeTemporary)
970 other_types.push_back(kFileSystemTypeTemporary); 970 other_types.push_back(kFileSystemTypeTemporary);
971 if (type != kFileSystemTypePersistent) 971 if (type != kFileSystemTypePersistent)
(...skipping 13 matching lines...) Expand all
985 InitOriginDatabase(false); 985 InitOriginDatabase(false);
986 if (origin_database_.get()) 986 if (origin_database_.get())
987 origin_database_->RemovePathForOrigin(GetOriginIdentifierFromURL(origin)); 987 origin_database_->RemovePathForOrigin(GetOriginIdentifierFromURL(origin));
988 if (!file_util::Delete(origin_path, true /* recursive */)) 988 if (!file_util::Delete(origin_path, true /* recursive */))
989 return false; 989 return false;
990 990
991 return true; 991 return true;
992 } 992 }
993 993
994 // static 994 // static
995 FilePath::StringType ObfuscatedFileUtil::GetDirectoryNameForType( 995 base::FilePath::StringType ObfuscatedFileUtil::GetDirectoryNameForType(
996 FileSystemType type) { 996 FileSystemType type) {
997 switch (type) { 997 switch (type) {
998 case kFileSystemTypeTemporary: 998 case kFileSystemTypeTemporary:
999 return kTemporaryDirectoryName; 999 return kTemporaryDirectoryName;
1000 case kFileSystemTypePersistent: 1000 case kFileSystemTypePersistent:
1001 return kPersistentDirectoryName; 1001 return kPersistentDirectoryName;
1002 case kFileSystemTypeSyncable: 1002 case kFileSystemTypeSyncable:
1003 return kSyncableDirectoryName; 1003 return kSyncableDirectoryName;
1004 case kFileSystemTypeUnknown: 1004 case kFileSystemTypeUnknown:
1005 default: 1005 default:
1006 return FilePath::StringType(); 1006 return base::FilePath::StringType();
1007 } 1007 }
1008 } 1008 }
1009 1009
1010 ObfuscatedFileUtil::AbstractOriginEnumerator* 1010 ObfuscatedFileUtil::AbstractOriginEnumerator*
1011 ObfuscatedFileUtil::CreateOriginEnumerator() { 1011 ObfuscatedFileUtil::CreateOriginEnumerator() {
1012 std::vector<FileSystemOriginDatabase::OriginRecord> origins; 1012 std::vector<FileSystemOriginDatabase::OriginRecord> origins;
1013 1013
1014 InitOriginDatabase(false); 1014 InitOriginDatabase(false);
1015 return new ObfuscatedOriginEnumerator( 1015 return new ObfuscatedOriginEnumerator(
1016 origin_database_.get(), file_system_directory_); 1016 origin_database_.get(), file_system_directory_);
1017 } 1017 }
1018 1018
1019 bool ObfuscatedFileUtil::DestroyDirectoryDatabase( 1019 bool ObfuscatedFileUtil::DestroyDirectoryDatabase(
1020 const GURL& origin, FileSystemType type) { 1020 const GURL& origin, FileSystemType type) {
1021 std::string type_string = GetFileSystemTypeString(type); 1021 std::string type_string = GetFileSystemTypeString(type);
1022 if (type_string.empty()) { 1022 if (type_string.empty()) {
1023 LOG(WARNING) << "Unknown filesystem type requested:" << type; 1023 LOG(WARNING) << "Unknown filesystem type requested:" << type;
1024 return true; 1024 return true;
1025 } 1025 }
1026 std::string key = GetOriginIdentifierFromURL(origin) + type_string; 1026 std::string key = GetOriginIdentifierFromURL(origin) + type_string;
1027 DirectoryMap::iterator iter = directories_.find(key); 1027 DirectoryMap::iterator iter = directories_.find(key);
1028 if (iter != directories_.end()) { 1028 if (iter != directories_.end()) {
1029 FileSystemDirectoryDatabase* database = iter->second; 1029 FileSystemDirectoryDatabase* database = iter->second;
1030 directories_.erase(iter); 1030 directories_.erase(iter);
1031 delete database; 1031 delete database;
1032 } 1032 }
1033 1033
1034 PlatformFileError error = base::PLATFORM_FILE_OK; 1034 PlatformFileError error = base::PLATFORM_FILE_OK;
1035 FilePath path = GetDirectoryForOriginAndType(origin, type, false, &error); 1035 base::FilePath path = GetDirectoryForOriginAndType(origin, type, false, &error );
1036 if (path.empty() || error == base::PLATFORM_FILE_ERROR_NOT_FOUND) 1036 if (path.empty() || error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
1037 return true; 1037 return true;
1038 return FileSystemDirectoryDatabase::DestroyDatabase(path); 1038 return FileSystemDirectoryDatabase::DestroyDatabase(path);
1039 } 1039 }
1040 1040
1041 // static 1041 // static
1042 int64 ObfuscatedFileUtil::ComputeFilePathCost(const FilePath& path) { 1042 int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) {
1043 return UsageForPath(VirtualPath::BaseName(path).value().size()); 1043 return UsageForPath(VirtualPath::BaseName(path).value().size());
1044 } 1044 }
1045 1045
1046 PlatformFileError ObfuscatedFileUtil::GetFileInfoInternal( 1046 PlatformFileError ObfuscatedFileUtil::GetFileInfoInternal(
1047 FileSystemDirectoryDatabase* db, 1047 FileSystemDirectoryDatabase* db,
1048 FileSystemOperationContext* context, 1048 FileSystemOperationContext* context,
1049 const GURL& origin, 1049 const GURL& origin,
1050 FileSystemType type, 1050 FileSystemType type,
1051 FileId file_id, 1051 FileId file_id,
1052 FileInfo* local_info, 1052 FileInfo* local_info,
1053 base::PlatformFileInfo* file_info, 1053 base::PlatformFileInfo* file_info,
1054 FilePath* platform_file_path) { 1054 base::FilePath* platform_file_path) {
1055 DCHECK(db); 1055 DCHECK(db);
1056 DCHECK(context); 1056 DCHECK(context);
1057 DCHECK(file_info); 1057 DCHECK(file_info);
1058 DCHECK(platform_file_path); 1058 DCHECK(platform_file_path);
1059 1059
1060 if (!db->GetFileInfo(file_id, local_info)) { 1060 if (!db->GetFileInfo(file_id, local_info)) {
1061 NOTREACHED(); 1061 NOTREACHED();
1062 return base::PLATFORM_FILE_ERROR_FAILED; 1062 return base::PLATFORM_FILE_ERROR_FAILED;
1063 } 1063 }
1064 1064
1065 if (local_info->is_directory()) { 1065 if (local_info->is_directory()) {
1066 file_info->size = 0; 1066 file_info->size = 0;
1067 file_info->is_directory = true; 1067 file_info->is_directory = true;
1068 file_info->is_symbolic_link = false; 1068 file_info->is_symbolic_link = false;
1069 file_info->last_modified = local_info->modification_time; 1069 file_info->last_modified = local_info->modification_time;
1070 *platform_file_path = FilePath(); 1070 *platform_file_path = base::FilePath();
1071 // We don't fill in ctime or atime. 1071 // We don't fill in ctime or atime.
1072 return base::PLATFORM_FILE_OK; 1072 return base::PLATFORM_FILE_OK;
1073 } 1073 }
1074 if (local_info->data_path.empty()) 1074 if (local_info->data_path.empty())
1075 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; 1075 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
1076 FilePath local_path = DataPathToLocalPath( 1076 base::FilePath local_path = DataPathToLocalPath(
1077 origin, type, local_info->data_path); 1077 origin, type, local_info->data_path);
1078 base::PlatformFileError error = NativeFileUtil::GetFileInfo( 1078 base::PlatformFileError error = NativeFileUtil::GetFileInfo(
1079 local_path, file_info); 1079 local_path, file_info);
1080 // We should not follow symbolic links in sandboxed file system. 1080 // We should not follow symbolic links in sandboxed file system.
1081 if (file_util::IsLink(local_path)) { 1081 if (file_util::IsLink(local_path)) {
1082 LOG(WARNING) << "Found a symbolic file."; 1082 LOG(WARNING) << "Found a symbolic file.";
1083 error = base::PLATFORM_FILE_ERROR_NOT_FOUND; 1083 error = base::PLATFORM_FILE_ERROR_NOT_FOUND;
1084 } 1084 }
1085 if (error == base::PLATFORM_FILE_OK) { 1085 if (error == base::PLATFORM_FILE_OK) {
1086 *platform_file_path = local_path; 1086 *platform_file_path = local_path;
1087 } else if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) { 1087 } else if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) {
1088 LOG(WARNING) << "Lost a backing file."; 1088 LOG(WARNING) << "Lost a backing file.";
1089 InvalidateUsageCache(context, origin, type); 1089 InvalidateUsageCache(context, origin, type);
1090 if (!db->RemoveFileInfo(file_id)) 1090 if (!db->RemoveFileInfo(file_id))
1091 return base::PLATFORM_FILE_ERROR_FAILED; 1091 return base::PLATFORM_FILE_ERROR_FAILED;
1092 } 1092 }
1093 return error; 1093 return error;
1094 } 1094 }
1095 1095
1096 PlatformFileError ObfuscatedFileUtil::CreateFile( 1096 PlatformFileError ObfuscatedFileUtil::CreateFile(
1097 FileSystemOperationContext* context, 1097 FileSystemOperationContext* context,
1098 const FilePath& src_file_path, 1098 const base::FilePath& src_file_path,
1099 const GURL& dest_origin, 1099 const GURL& dest_origin,
1100 FileSystemType dest_type, 1100 FileSystemType dest_type,
1101 FileInfo* dest_file_info, int file_flags, PlatformFile* handle) { 1101 FileInfo* dest_file_info, int file_flags, PlatformFile* handle) {
1102 if (handle) 1102 if (handle)
1103 *handle = base::kInvalidPlatformFileValue; 1103 *handle = base::kInvalidPlatformFileValue;
1104 FileSystemDirectoryDatabase* db = GetDirectoryDatabase( 1104 FileSystemDirectoryDatabase* db = GetDirectoryDatabase(
1105 dest_origin, dest_type, true); 1105 dest_origin, dest_type, true);
1106 1106
1107 PlatformFileError error = base::PLATFORM_FILE_OK; 1107 PlatformFileError error = base::PLATFORM_FILE_OK;
1108 FilePath root = GetDirectoryForOriginAndType(dest_origin, dest_type, false, 1108 base::FilePath root = GetDirectoryForOriginAndType(dest_origin, dest_type, fal se,
1109 &error); 1109 &error);
1110 if (error != base::PLATFORM_FILE_OK) 1110 if (error != base::PLATFORM_FILE_OK)
1111 return error; 1111 return error;
1112 1112
1113 FilePath dest_local_path; 1113 base::FilePath dest_local_path;
1114 error = GenerateNewLocalPath(db, context, dest_origin, dest_type, 1114 error = GenerateNewLocalPath(db, context, dest_origin, dest_type,
1115 &dest_local_path); 1115 &dest_local_path);
1116 if (error != base::PLATFORM_FILE_OK) 1116 if (error != base::PLATFORM_FILE_OK)
1117 return error; 1117 return error;
1118 1118
1119 bool created = false; 1119 bool created = false;
1120 if (!src_file_path.empty()) { 1120 if (!src_file_path.empty()) {
1121 DCHECK(!file_flags); 1121 DCHECK(!file_flags);
1122 DCHECK(!handle); 1122 DCHECK(!handle);
1123 error = NativeFileUtil::CopyOrMoveFile( 1123 error = NativeFileUtil::CopyOrMoveFile(
(...skipping 26 matching lines...) Expand all
1150 if (handle) { 1150 if (handle) {
1151 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); 1151 DCHECK_NE(base::kInvalidPlatformFileValue, *handle);
1152 base::ClosePlatformFile(*handle); 1152 base::ClosePlatformFile(*handle);
1153 file_util::Delete(dest_local_path, false /* recursive */); 1153 file_util::Delete(dest_local_path, false /* recursive */);
1154 } 1154 }
1155 return base::PLATFORM_FILE_ERROR_FAILED; 1155 return base::PLATFORM_FILE_ERROR_FAILED;
1156 } 1156 }
1157 1157
1158 // This removes the root, including the trailing slash, leaving a relative 1158 // This removes the root, including the trailing slash, leaving a relative
1159 // path. 1159 // path.
1160 dest_file_info->data_path = FilePath( 1160 dest_file_info->data_path = base::FilePath(
1161 dest_local_path.value().substr(root.value().length() + 1)); 1161 dest_local_path.value().substr(root.value().length() + 1));
1162 1162
1163 FileId file_id; 1163 FileId file_id;
1164 if (!db->AddFileInfo(*dest_file_info, &file_id)) { 1164 if (!db->AddFileInfo(*dest_file_info, &file_id)) {
1165 if (handle) { 1165 if (handle) {
1166 DCHECK_NE(base::kInvalidPlatformFileValue, *handle); 1166 DCHECK_NE(base::kInvalidPlatformFileValue, *handle);
1167 base::ClosePlatformFile(*handle); 1167 base::ClosePlatformFile(*handle);
1168 } 1168 }
1169 file_util::Delete(dest_local_path, false /* recursive */); 1169 file_util::Delete(dest_local_path, false /* recursive */);
1170 return base::PLATFORM_FILE_ERROR_FAILED; 1170 return base::PLATFORM_FILE_ERROR_FAILED;
1171 } 1171 }
1172 TouchDirectory(db, dest_file_info->parent_id); 1172 TouchDirectory(db, dest_file_info->parent_id);
1173 1173
1174 return base::PLATFORM_FILE_OK; 1174 return base::PLATFORM_FILE_OK;
1175 } 1175 }
1176 1176
1177 FilePath ObfuscatedFileUtil::DataPathToLocalPath( 1177 base::FilePath ObfuscatedFileUtil::DataPathToLocalPath(
1178 const GURL& origin, FileSystemType type, const FilePath& data_path) { 1178 const GURL& origin, FileSystemType type, const base::FilePath& data_path) {
1179 PlatformFileError error = base::PLATFORM_FILE_OK; 1179 PlatformFileError error = base::PLATFORM_FILE_OK;
1180 FilePath root = GetDirectoryForOriginAndType(origin, type, false, &error); 1180 base::FilePath root = GetDirectoryForOriginAndType(origin, type, false, &error );
1181 if (error != base::PLATFORM_FILE_OK) 1181 if (error != base::PLATFORM_FILE_OK)
1182 return FilePath(); 1182 return base::FilePath();
1183 return root.Append(data_path); 1183 return root.Append(data_path);
1184 } 1184 }
1185 1185
1186 // TODO(ericu): How to do the whole validation-without-creation thing? 1186 // TODO(ericu): How to do the whole validation-without-creation thing?
1187 // We may not have quota even to create the database. 1187 // We may not have quota even to create the database.
1188 // Ah, in that case don't even get here? 1188 // Ah, in that case don't even get here?
1189 // Still doesn't answer the quota issue, though. 1189 // Still doesn't answer the quota issue, though.
1190 FileSystemDirectoryDatabase* ObfuscatedFileUtil::GetDirectoryDatabase( 1190 FileSystemDirectoryDatabase* ObfuscatedFileUtil::GetDirectoryDatabase(
1191 const GURL& origin, FileSystemType type, bool create) { 1191 const GURL& origin, FileSystemType type, bool create) {
1192 std::string type_string = GetFileSystemTypeString(type); 1192 std::string type_string = GetFileSystemTypeString(type);
1193 if (type_string.empty()) { 1193 if (type_string.empty()) {
1194 LOG(WARNING) << "Unknown filesystem type requested:" << type; 1194 LOG(WARNING) << "Unknown filesystem type requested:" << type;
1195 return NULL; 1195 return NULL;
1196 } 1196 }
1197 std::string key = GetOriginIdentifierFromURL(origin) + type_string; 1197 std::string key = GetOriginIdentifierFromURL(origin) + type_string;
1198 DirectoryMap::iterator iter = directories_.find(key); 1198 DirectoryMap::iterator iter = directories_.find(key);
1199 if (iter != directories_.end()) { 1199 if (iter != directories_.end()) {
1200 MarkUsed(); 1200 MarkUsed();
1201 return iter->second; 1201 return iter->second;
1202 } 1202 }
1203 1203
1204 PlatformFileError error = base::PLATFORM_FILE_OK; 1204 PlatformFileError error = base::PLATFORM_FILE_OK;
1205 FilePath path = GetDirectoryForOriginAndType(origin, type, create, &error); 1205 base::FilePath path = GetDirectoryForOriginAndType(origin, type, create, &erro r);
1206 if (error != base::PLATFORM_FILE_OK) { 1206 if (error != base::PLATFORM_FILE_OK) {
1207 LOG(WARNING) << "Failed to get origin+type directory: " << path.value(); 1207 LOG(WARNING) << "Failed to get origin+type directory: " << path.value();
1208 return NULL; 1208 return NULL;
1209 } 1209 }
1210 MarkUsed(); 1210 MarkUsed();
1211 FileSystemDirectoryDatabase* database = new FileSystemDirectoryDatabase(path); 1211 FileSystemDirectoryDatabase* database = new FileSystemDirectoryDatabase(path);
1212 directories_[key] = database; 1212 directories_[key] = database;
1213 return database; 1213 return database;
1214 } 1214 }
1215 1215
1216 FilePath ObfuscatedFileUtil::GetDirectoryForOrigin( 1216 base::FilePath ObfuscatedFileUtil::GetDirectoryForOrigin(
1217 const GURL& origin, bool create, base::PlatformFileError* error_code) { 1217 const GURL& origin, bool create, base::PlatformFileError* error_code) {
1218 if (!InitOriginDatabase(create)) { 1218 if (!InitOriginDatabase(create)) {
1219 if (error_code) { 1219 if (error_code) {
1220 *error_code = create ? 1220 *error_code = create ?
1221 base::PLATFORM_FILE_ERROR_FAILED : 1221 base::PLATFORM_FILE_ERROR_FAILED :
1222 base::PLATFORM_FILE_ERROR_NOT_FOUND; 1222 base::PLATFORM_FILE_ERROR_NOT_FOUND;
1223 } 1223 }
1224 return FilePath(); 1224 return base::FilePath();
1225 } 1225 }
1226 FilePath directory_name; 1226 base::FilePath directory_name;
1227 std::string id = GetOriginIdentifierFromURL(origin); 1227 std::string id = GetOriginIdentifierFromURL(origin);
1228 1228
1229 bool exists_in_db = origin_database_->HasOriginPath(id); 1229 bool exists_in_db = origin_database_->HasOriginPath(id);
1230 if (!exists_in_db && !create) { 1230 if (!exists_in_db && !create) {
1231 if (error_code) 1231 if (error_code)
1232 *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND; 1232 *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND;
1233 return FilePath(); 1233 return base::FilePath();
1234 } 1234 }
1235 if (!origin_database_->GetPathForOrigin(id, &directory_name)) { 1235 if (!origin_database_->GetPathForOrigin(id, &directory_name)) {
1236 if (error_code) 1236 if (error_code)
1237 *error_code = base::PLATFORM_FILE_ERROR_FAILED; 1237 *error_code = base::PLATFORM_FILE_ERROR_FAILED;
1238 return FilePath(); 1238 return base::FilePath();
1239 } 1239 }
1240 1240
1241 FilePath path = file_system_directory_.Append(directory_name); 1241 base::FilePath path = file_system_directory_.Append(directory_name);
1242 bool exists_in_fs = file_util::DirectoryExists(path); 1242 bool exists_in_fs = file_util::DirectoryExists(path);
1243 if (!exists_in_db && exists_in_fs) { 1243 if (!exists_in_db && exists_in_fs) {
1244 if (!file_util::Delete(path, true)) { 1244 if (!file_util::Delete(path, true)) {
1245 if (error_code) 1245 if (error_code)
1246 *error_code = base::PLATFORM_FILE_ERROR_FAILED; 1246 *error_code = base::PLATFORM_FILE_ERROR_FAILED;
1247 return FilePath(); 1247 return base::FilePath();
1248 } 1248 }
1249 exists_in_fs = false; 1249 exists_in_fs = false;
1250 } 1250 }
1251 1251
1252 if (!exists_in_fs) { 1252 if (!exists_in_fs) {
1253 if (!create || !file_util::CreateDirectory(path)) { 1253 if (!create || !file_util::CreateDirectory(path)) {
1254 if (error_code) 1254 if (error_code)
1255 *error_code = create ? 1255 *error_code = create ?
1256 base::PLATFORM_FILE_ERROR_FAILED : 1256 base::PLATFORM_FILE_ERROR_FAILED :
1257 base::PLATFORM_FILE_ERROR_NOT_FOUND; 1257 base::PLATFORM_FILE_ERROR_NOT_FOUND;
1258 return FilePath(); 1258 return base::FilePath();
1259 } 1259 }
1260 } 1260 }
1261 1261
1262 if (error_code) 1262 if (error_code)
1263 *error_code = base::PLATFORM_FILE_OK; 1263 *error_code = base::PLATFORM_FILE_OK;
1264 1264
1265 return path; 1265 return path;
1266 } 1266 }
1267 1267
1268 void ObfuscatedFileUtil::InvalidateUsageCache( 1268 void ObfuscatedFileUtil::InvalidateUsageCache(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1301 new FileSystemOriginDatabase(file_system_directory_)); 1301 new FileSystemOriginDatabase(file_system_directory_));
1302 } 1302 }
1303 return true; 1303 return true;
1304 } 1304 }
1305 1305
1306 PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath( 1306 PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath(
1307 FileSystemDirectoryDatabase* db, 1307 FileSystemDirectoryDatabase* db,
1308 FileSystemOperationContext* context, 1308 FileSystemOperationContext* context,
1309 const GURL& origin, 1309 const GURL& origin,
1310 FileSystemType type, 1310 FileSystemType type,
1311 FilePath* local_path) { 1311 base::FilePath* local_path) {
1312 DCHECK(local_path); 1312 DCHECK(local_path);
1313 int64 number; 1313 int64 number;
1314 if (!db || !db->GetNextInteger(&number)) 1314 if (!db || !db->GetNextInteger(&number))
1315 return base::PLATFORM_FILE_ERROR_FAILED; 1315 return base::PLATFORM_FILE_ERROR_FAILED;
1316 1316
1317 PlatformFileError error = base::PLATFORM_FILE_OK; 1317 PlatformFileError error = base::PLATFORM_FILE_OK;
1318 FilePath new_local_path = GetDirectoryForOriginAndType(origin, type, false, 1318 base::FilePath new_local_path = GetDirectoryForOriginAndType(origin, type,
1319 &error); 1319 false, &error);
1320 if (error != base::PLATFORM_FILE_OK) 1320 if (error != base::PLATFORM_FILE_OK)
1321 return base::PLATFORM_FILE_ERROR_FAILED; 1321 return base::PLATFORM_FILE_ERROR_FAILED;
1322 1322
1323 // We use the third- and fourth-to-last digits as the directory. 1323 // We use the third- and fourth-to-last digits as the directory.
1324 int64 directory_number = number % 10000 / 100; 1324 int64 directory_number = number % 10000 / 100;
1325 new_local_path = new_local_path.AppendASCII( 1325 new_local_path = new_local_path.AppendASCII(
1326 StringPrintf("%02" PRId64, directory_number)); 1326 StringPrintf("%02" PRId64, directory_number));
1327 1327
1328 error = NativeFileUtil::CreateDirectory( 1328 error = NativeFileUtil::CreateDirectory(
1329 new_local_path, false /* exclusive */, false /* recursive */); 1329 new_local_path, false /* exclusive */, false /* recursive */);
1330 if (error != base::PLATFORM_FILE_OK) 1330 if (error != base::PLATFORM_FILE_OK)
1331 return error; 1331 return error;
1332 1332
1333 *local_path = new_local_path.AppendASCII(StringPrintf("%08" PRId64, number)); 1333 *local_path = new_local_path.AppendASCII(StringPrintf("%08" PRId64, number));
1334 return base::PLATFORM_FILE_OK; 1334 return base::PLATFORM_FILE_OK;
1335 } 1335 }
1336 1336
1337 } // namespace fileapi 1337 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/obfuscated_file_util.h ('k') | webkit/fileapi/obfuscated_file_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698