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

Side by Side Diff: chrome/browser/chromeos/drive/resource_metadata.cc

Issue 17004011: drive: DriveIntegrationService owns ResourceMetadataStorage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix a nit Created 7 years, 6 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
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 "chrome/browser/chromeos/drive/resource_metadata.h" 5 #include "chrome/browser/chromeos/drive/resource_metadata.h"
6 6
7 #include "base/strings/string_number_conversions.h" 7 #include "base/strings/string_number_conversions.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "base/sys_info.h" 9 #include "base/sys_info.h"
10 #include "chrome/browser/chromeos/drive/drive.pb.h" 10 #include "chrome/browser/chromeos/drive/drive.pb.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 118
119 EntryInfoPairResult::EntryInfoPairResult() { 119 EntryInfoPairResult::EntryInfoPairResult() {
120 } 120 }
121 121
122 EntryInfoPairResult::~EntryInfoPairResult() { 122 EntryInfoPairResult::~EntryInfoPairResult() {
123 } 123 }
124 124
125 namespace internal { 125 namespace internal {
126 126
127 ResourceMetadata::ResourceMetadata( 127 ResourceMetadata::ResourceMetadata(
128 const base::FilePath& data_directory_path, 128 ResourceMetadataStorage* storage,
129 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) 129 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner)
130 : data_directory_path_(data_directory_path), 130 : blocking_task_runner_(blocking_task_runner),
131 blocking_task_runner_(blocking_task_runner), 131 storage_(storage),
132 storage_(new ResourceMetadataStorage(data_directory_path)),
133 weak_ptr_factory_(this) { 132 weak_ptr_factory_(this) {
134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
135 } 134 }
136 135
137 FileError ResourceMetadata::Initialize() { 136 FileError ResourceMetadata::Initialize() {
138 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 137 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
139 138
140 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 139 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
141 return FILE_ERROR_NO_SPACE; 140 return FILE_ERROR_NO_SPACE;
142 141
143 // Initialize the storage.
144 if (!storage_->Initialize())
145 return FILE_ERROR_FAILED;
146
147 if (!SetUpDefaultEntries()) 142 if (!SetUpDefaultEntries())
148 return FILE_ERROR_FAILED; 143 return FILE_ERROR_FAILED;
149 144
150 return FILE_ERROR_OK; 145 return FILE_ERROR_OK;
151 } 146 }
152 147
153 void ResourceMetadata::Destroy() { 148 void ResourceMetadata::Destroy() {
154 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
155 150
156 weak_ptr_factory_.InvalidateWeakPtrs(); 151 weak_ptr_factory_.InvalidateWeakPtrs();
(...skipping 10 matching lines...) Expand all
167 base::PostTaskAndReplyWithResult( 162 base::PostTaskAndReplyWithResult(
168 blocking_task_runner_.get(), 163 blocking_task_runner_.get(),
169 FROM_HERE, 164 FROM_HERE,
170 base::Bind(&ResourceMetadata::Reset, base::Unretained(this)), 165 base::Bind(&ResourceMetadata::Reset, base::Unretained(this)),
171 callback); 166 callback);
172 } 167 }
173 168
174 FileError ResourceMetadata::Reset() { 169 FileError ResourceMetadata::Reset() {
175 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 170 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
176 171
177 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 172 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
178 return FILE_ERROR_NO_SPACE; 173 return FILE_ERROR_NO_SPACE;
179 174
180 if (!storage_->SetLargestChangestamp(0) || 175 if (!storage_->SetLargestChangestamp(0) ||
181 !RemoveEntryRecursively(util::kDriveGrandRootSpecialResourceId) || 176 !RemoveEntryRecursively(util::kDriveGrandRootSpecialResourceId) ||
182 !SetUpDefaultEntries()) 177 !SetUpDefaultEntries())
183 return FILE_ERROR_FAILED; 178 return FILE_ERROR_FAILED;
184 179
185 return FILE_ERROR_OK; 180 return FILE_ERROR_OK;
186 } 181 }
187 182
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 } 237 }
243 238
244 int64 ResourceMetadata::GetLargestChangestamp() { 239 int64 ResourceMetadata::GetLargestChangestamp() {
245 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 240 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
246 return storage_->GetLargestChangestamp(); 241 return storage_->GetLargestChangestamp();
247 } 242 }
248 243
249 FileError ResourceMetadata::SetLargestChangestamp(int64 value) { 244 FileError ResourceMetadata::SetLargestChangestamp(int64 value) {
250 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 245 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
251 246
252 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 247 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
253 return FILE_ERROR_NO_SPACE; 248 return FILE_ERROR_NO_SPACE;
254 249
255 storage_->SetLargestChangestamp(value); 250 storage_->SetLargestChangestamp(value);
256 return FILE_ERROR_OK; 251 return FILE_ERROR_OK;
257 } 252 }
258 253
259 void ResourceMetadata::AddEntryOnUIThread(const ResourceEntry& entry, 254 void ResourceMetadata::AddEntryOnUIThread(const ResourceEntry& entry,
260 const FileMoveCallback& callback) { 255 const FileMoveCallback& callback) {
261 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 256 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
262 DCHECK(!callback.is_null()); 257 DCHECK(!callback.is_null());
263 258
264 PostFileMoveTask( 259 PostFileMoveTask(
265 blocking_task_runner_.get(), 260 blocking_task_runner_.get(),
266 base::Bind(&AddEntryWithFilePath, base::Unretained(this), entry), 261 base::Bind(&AddEntryWithFilePath, base::Unretained(this), entry),
267 callback); 262 callback);
268 } 263 }
269 264
270 FileError ResourceMetadata::AddEntry(const ResourceEntry& entry) { 265 FileError ResourceMetadata::AddEntry(const ResourceEntry& entry) {
271 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 266 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
272 267
273 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 268 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
274 return FILE_ERROR_NO_SPACE; 269 return FILE_ERROR_NO_SPACE;
275 270
276 ResourceEntry existing_entry; 271 ResourceEntry existing_entry;
277 if (storage_->GetEntry(entry.resource_id(), &existing_entry)) 272 if (storage_->GetEntry(entry.resource_id(), &existing_entry))
278 return FILE_ERROR_EXISTS; 273 return FILE_ERROR_EXISTS;
279 274
280 ResourceEntry parent; 275 ResourceEntry parent;
281 if (!storage_->GetEntry(entry.parent_resource_id(), &parent) || 276 if (!storage_->GetEntry(entry.parent_resource_id(), &parent) ||
282 !parent.file_info().is_directory()) 277 !parent.file_info().is_directory())
283 return FILE_ERROR_NOT_FOUND; 278 return FILE_ERROR_NOT_FOUND;
(...skipping 29 matching lines...) Expand all
313 base::Bind(&ResourceMetadata::RenameEntry, 308 base::Bind(&ResourceMetadata::RenameEntry,
314 base::Unretained(this), 309 base::Unretained(this),
315 file_path, 310 file_path,
316 new_name), 311 new_name),
317 callback); 312 callback);
318 } 313 }
319 314
320 FileError ResourceMetadata::RemoveEntry(const std::string& resource_id) { 315 FileError ResourceMetadata::RemoveEntry(const std::string& resource_id) {
321 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 316 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
322 317
323 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 318 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
324 return FILE_ERROR_NO_SPACE; 319 return FILE_ERROR_NO_SPACE;
325 320
326 // Disallow deletion of special entries "/drive" and "/drive/other". 321 // Disallow deletion of special entries "/drive" and "/drive/other".
327 if (util::IsSpecialResourceId(resource_id)) 322 if (util::IsSpecialResourceId(resource_id))
328 return FILE_ERROR_ACCESS_DENIED; 323 return FILE_ERROR_ACCESS_DENIED;
329 324
330 ResourceEntry entry; 325 ResourceEntry entry;
331 if (!storage_->GetEntry(resource_id, &entry)) 326 if (!storage_->GetEntry(resource_id, &entry))
332 return FILE_ERROR_NOT_FOUND; 327 return FILE_ERROR_NOT_FOUND;
333 328
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 if (!storage_->GetEntry(children[i], &entries[i])) 426 if (!storage_->GetEntry(children[i], &entries[i]))
432 return FILE_ERROR_FAILED; 427 return FILE_ERROR_FAILED;
433 } 428 }
434 out_entries->swap(entries); 429 out_entries->swap(entries);
435 return FILE_ERROR_OK; 430 return FILE_ERROR_OK;
436 } 431 }
437 432
438 FileError ResourceMetadata::RefreshEntry(const ResourceEntry& entry) { 433 FileError ResourceMetadata::RefreshEntry(const ResourceEntry& entry) {
439 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 434 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
440 435
441 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 436 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
442 return FILE_ERROR_NO_SPACE; 437 return FILE_ERROR_NO_SPACE;
443 438
444 ResourceEntry old_entry; 439 ResourceEntry old_entry;
445 if (!storage_->GetEntry(entry.resource_id(), &old_entry)) 440 if (!storage_->GetEntry(entry.resource_id(), &old_entry))
446 return FILE_ERROR_NOT_FOUND; 441 return FILE_ERROR_NOT_FOUND;
447 442
448 if (old_entry.parent_resource_id().empty() || // Reject root. 443 if (old_entry.parent_resource_id().empty() || // Reject root.
449 old_entry.file_info().is_directory() != // Reject incompatible input. 444 old_entry.file_info().is_directory() != // Reject incompatible input.
450 entry.file_info().is_directory()) 445 entry.file_info().is_directory())
451 return FILE_ERROR_INVALID_OPERATION; 446 return FILE_ERROR_INVALID_OPERATION;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 517
523 FileError ResourceMetadata::MoveEntryToDirectory( 518 FileError ResourceMetadata::MoveEntryToDirectory(
524 const base::FilePath& file_path, 519 const base::FilePath& file_path,
525 const base::FilePath& directory_path, 520 const base::FilePath& directory_path,
526 base::FilePath* out_file_path) { 521 base::FilePath* out_file_path) {
527 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 522 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
528 DCHECK(!directory_path.empty()); 523 DCHECK(!directory_path.empty());
529 DCHECK(!file_path.empty()); 524 DCHECK(!file_path.empty());
530 DCHECK(out_file_path); 525 DCHECK(out_file_path);
531 526
532 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 527 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
533 return FILE_ERROR_NO_SPACE; 528 return FILE_ERROR_NO_SPACE;
534 529
535 ResourceEntry entry, destination; 530 ResourceEntry entry, destination;
536 if (!FindEntryByPathSync(file_path, &entry) || 531 if (!FindEntryByPathSync(file_path, &entry) ||
537 !FindEntryByPathSync(directory_path, &destination)) 532 !FindEntryByPathSync(directory_path, &destination))
538 return FILE_ERROR_NOT_FOUND; 533 return FILE_ERROR_NOT_FOUND;
539 if (!destination.file_info().is_directory()) 534 if (!destination.file_info().is_directory())
540 return FILE_ERROR_NOT_A_DIRECTORY; 535 return FILE_ERROR_NOT_A_DIRECTORY;
541 536
542 entry.set_parent_resource_id(destination.resource_id()); 537 entry.set_parent_resource_id(destination.resource_id());
543 538
544 FileError error = RefreshEntry(entry); 539 FileError error = RefreshEntry(entry);
545 if (error == FILE_ERROR_OK) 540 if (error == FILE_ERROR_OK)
546 *out_file_path = GetFilePath(entry.resource_id()); 541 *out_file_path = GetFilePath(entry.resource_id());
547 return error; 542 return error;
548 } 543 }
549 544
550 FileError ResourceMetadata::RenameEntry( 545 FileError ResourceMetadata::RenameEntry(
551 const base::FilePath& file_path, 546 const base::FilePath& file_path,
552 const std::string& new_name, 547 const std::string& new_name,
553 base::FilePath* out_file_path) { 548 base::FilePath* out_file_path) {
554 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 549 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
555 DCHECK(!file_path.empty()); 550 DCHECK(!file_path.empty());
556 DCHECK(!new_name.empty()); 551 DCHECK(!new_name.empty());
557 DCHECK(out_file_path); 552 DCHECK(out_file_path);
558 553
559 DVLOG(1) << "RenameEntry " << file_path.value() << " to " << new_name; 554 DVLOG(1) << "RenameEntry " << file_path.value() << " to " << new_name;
560 555
561 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 556 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
562 return FILE_ERROR_NO_SPACE; 557 return FILE_ERROR_NO_SPACE;
563 558
564 ResourceEntry entry; 559 ResourceEntry entry;
565 if (!FindEntryByPathSync(file_path, &entry)) 560 if (!FindEntryByPathSync(file_path, &entry))
566 return FILE_ERROR_NOT_FOUND; 561 return FILE_ERROR_NOT_FOUND;
567 562
568 if (base::FilePath::FromUTF8Unsafe(new_name) == file_path.BaseName()) 563 if (base::FilePath::FromUTF8Unsafe(new_name) == file_path.BaseName())
569 return FILE_ERROR_EXISTS; 564 return FILE_ERROR_EXISTS;
570 565
571 entry.set_title(new_name); 566 entry.set_title(new_name);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 callback)); 619 callback));
625 } 620 }
626 621
627 FileError ResourceMetadata::RefreshDirectory( 622 FileError ResourceMetadata::RefreshDirectory(
628 const DirectoryFetchInfo& directory_fetch_info, 623 const DirectoryFetchInfo& directory_fetch_info,
629 const ResourceEntryMap& entry_map, 624 const ResourceEntryMap& entry_map,
630 base::FilePath* out_file_path) { 625 base::FilePath* out_file_path) {
631 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); 626 DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread());
632 DCHECK(!directory_fetch_info.empty()); 627 DCHECK(!directory_fetch_info.empty());
633 628
634 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 629 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
635 return FILE_ERROR_NO_SPACE; 630 return FILE_ERROR_NO_SPACE;
636 631
637 ResourceEntry directory; 632 ResourceEntry directory;
638 if (!storage_->GetEntry(directory_fetch_info.resource_id(), &directory)) 633 if (!storage_->GetEntry(directory_fetch_info.resource_id(), &directory))
639 return FILE_ERROR_NOT_FOUND; 634 return FILE_ERROR_NOT_FOUND;
640 635
641 if (!directory.file_info().is_directory()) 636 if (!directory.file_info().is_directory())
642 return FILE_ERROR_NOT_A_DIRECTORY; 637 return FILE_ERROR_NOT_A_DIRECTORY;
643 638
644 directory.mutable_directory_specific_info()->set_changestamp( 639 directory.mutable_directory_specific_info()->set_changestamp(
645 directory_fetch_info.changestamp()); 640 directory_fetch_info.changestamp());
646 storage_->PutEntry(directory); 641 storage_->PutEntry(directory);
647 642
648 // First, go through the entry map. We'll handle existing entries and new 643 // First, go through the entry map. We'll handle existing entries and new
649 // entries in the loop. We'll process deleted entries afterwards. 644 // entries in the loop. We'll process deleted entries afterwards.
650 for (ResourceEntryMap::const_iterator it = entry_map.begin(); 645 for (ResourceEntryMap::const_iterator it = entry_map.begin();
651 it != entry_map.end(); ++it) { 646 it != entry_map.end(); ++it) {
652 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 647 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
653 return FILE_ERROR_NO_SPACE; 648 return FILE_ERROR_NO_SPACE;
654 649
655 const ResourceEntry& entry = it->second; 650 const ResourceEntry& entry = it->second;
656 // Skip if the parent resource ID does not match. This is needed to 651 // Skip if the parent resource ID does not match. This is needed to
657 // handle entries with multiple parents. For such entries, the first 652 // handle entries with multiple parents. For such entries, the first
658 // parent is picked and other parents are ignored, hence some entries may 653 // parent is picked and other parents are ignored, hence some entries may
659 // have a parent resource ID which does not match the target directory's. 654 // have a parent resource ID which does not match the target directory's.
660 // 655 //
661 // TODO(satorux): Move the filtering logic to somewhere more appropriate. 656 // TODO(satorux): Move the filtering logic to somewhere more appropriate.
662 // crbug.com/193525. 657 // crbug.com/193525.
663 if (entry.parent_resource_id() != 658 if (entry.parent_resource_id() !=
664 directory_fetch_info.resource_id()) { 659 directory_fetch_info.resource_id()) {
665 DVLOG(1) << "Wrong-parent entry rejected: " << entry.resource_id(); 660 DVLOG(1) << "Wrong-parent entry rejected: " << entry.resource_id();
666 continue; 661 continue;
667 } 662 }
668 663
669 if (!PutEntryUnderDirectory(CreateEntryWithProperBaseName(entry))) 664 if (!PutEntryUnderDirectory(CreateEntryWithProperBaseName(entry)))
670 return FILE_ERROR_FAILED; 665 return FILE_ERROR_FAILED;
671 } 666 }
672 667
673 // Go through the existing entries and remove deleted entries. 668 // Go through the existing entries and remove deleted entries.
674 std::vector<std::string> children; 669 std::vector<std::string> children;
675 storage_->GetChildren(directory.resource_id(), &children); 670 storage_->GetChildren(directory.resource_id(), &children);
676 for (size_t i = 0; i < children.size(); ++i) { 671 for (size_t i = 0; i < children.size(); ++i) {
677 if (!EnoughDiskSpaceIsAvailableForDBOperation(data_directory_path_)) 672 if (!EnoughDiskSpaceIsAvailableForDBOperation(storage_->directory_path()))
678 return FILE_ERROR_NO_SPACE; 673 return FILE_ERROR_NO_SPACE;
679 674
680 if (entry_map.count(children[i]) == 0) { 675 if (entry_map.count(children[i]) == 0) {
681 if (!RemoveEntryRecursively(children[i])) 676 if (!RemoveEntryRecursively(children[i]))
682 return FILE_ERROR_FAILED; 677 return FILE_ERROR_FAILED;
683 } 678 }
684 } 679 }
685 680
686 if (out_file_path) 681 if (out_file_path)
687 *out_file_path = GetFilePath(directory.resource_id()); 682 *out_file_path = GetFilePath(directory.resource_id());
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 for (size_t i = 0; i < children.size(); ++i) { 782 for (size_t i = 0; i < children.size(); ++i) {
788 if (!RemoveEntryRecursively(children[i])) 783 if (!RemoveEntryRecursively(children[i]))
789 return false; 784 return false;
790 } 785 }
791 } 786 }
792 return storage_->RemoveEntry(resource_id); 787 return storage_->RemoveEntry(resource_id);
793 } 788 }
794 789
795 } // namespace internal 790 } // namespace internal
796 } // namespace drive 791 } // namespace drive
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/drive/resource_metadata.h ('k') | chrome/browser/chromeos/drive/resource_metadata_storage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698