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

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_files.cc

Issue 10829277: GDataFileSystem is no longer a friend of GDataDirectory. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 4 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/gdata/gdata_files.h" 5 #include "chrome/browser/chromeos/gdata/gdata_files.h"
6 6
7 #include <leveldb/db.h> 7 #include <leveldb/db.h>
8 #include <vector>
9 8
10 #include "base/message_loop_proxy.h" 9 #include "base/message_loop_proxy.h"
11 #include "base/platform_file.h" 10 #include "base/platform_file.h"
12 #include "base/string_number_conversions.h" 11 #include "base/string_number_conversions.h"
13 #include "base/string_util.h" 12 #include "base/string_util.h"
14 #include "base/stringprintf.h" 13 #include "base/stringprintf.h"
15 #include "base/sequenced_task_runner.h" 14 #include "base/sequenced_task_runner.h"
16 #include "base/tracked_objects.h" 15 #include "base/tracked_objects.h"
17 #include "base/utf_string_conversions.h" 16 #include "base/utf_string_conversions.h"
18 #include "chrome/browser/chromeos/gdata/gdata.pb.h" 17 #include "chrome/browser/chromeos/gdata/gdata.pb.h"
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 246
248 void GDataDirectory::InitFromDocumentEntry(DocumentEntry* doc) { 247 void GDataDirectory::InitFromDocumentEntry(DocumentEntry* doc) {
249 GDataEntry::InitFromDocumentEntry(doc); 248 GDataEntry::InitFromDocumentEntry(doc);
250 249
251 const Link* upload_link = doc->GetLinkByType(Link::RESUMABLE_CREATE_MEDIA); 250 const Link* upload_link = doc->GetLinkByType(Link::RESUMABLE_CREATE_MEDIA);
252 if (upload_link) 251 if (upload_link)
253 upload_url_ = upload_link->href(); 252 upload_url_ = upload_link->href();
254 } 253 }
255 254
256 void GDataDirectory::AddEntry(GDataEntry* entry) { 255 void GDataDirectory::AddEntry(GDataEntry* entry) {
256 DCHECK(!entry->parent());
257
257 // The entry name may have been changed due to prior name de-duplication. 258 // The entry name may have been changed due to prior name de-duplication.
258 // We need to first restore the file name based on the title before going 259 // We need to first restore the file name based on the title before going
259 // through name de-duplication again when it is added to another directory. 260 // through name de-duplication again when it is added to another directory.
260 entry->SetBaseNameFromTitle(); 261 entry->SetBaseNameFromTitle();
261 262
262 // Do file name de-duplication - find files with the same name and 263 // Do file name de-duplication - find files with the same name and
263 // append a name modifier to the name. 264 // append a name modifier to the name.
264 int max_modifier = 1; 265 int max_modifier = 1;
265 FilePath full_file_name(entry->base_name()); 266 FilePath full_file_name(entry->base_name());
266 const std::string extension = full_file_name.Extension(); 267 const std::string extension = full_file_name.Extension();
(...skipping 22 matching lines...) Expand all
289 directory_service_->AddEntryToResourceMap(entry); 290 directory_service_->AddEntryToResourceMap(entry);
290 291
291 // Setup child and parent links. 292 // Setup child and parent links.
292 AddChild(entry); 293 AddChild(entry);
293 entry->SetParent(this); 294 entry->SetParent(this);
294 } 295 }
295 296
296 bool GDataDirectory::TakeOverEntries(GDataDirectory* dir) { 297 bool GDataDirectory::TakeOverEntries(GDataDirectory* dir) {
297 for (GDataFileCollection::iterator iter = dir->child_files_.begin(); 298 for (GDataFileCollection::iterator iter = dir->child_files_.begin();
298 iter != dir->child_files_.end(); ++iter) { 299 iter != dir->child_files_.end(); ++iter) {
300 iter->second->SetParent(NULL);
satorux1 2012/08/10 16:14:44 iter->second looks cryptic. maybe add: GDataFi
achuithb 2012/08/11 00:37:45 Done.
299 AddEntry(iter->second); 301 AddEntry(iter->second);
300 } 302 }
301 dir->child_files_.clear(); 303 dir->child_files_.clear();
302 304
303 for (GDataDirectoryCollection::iterator iter = 305 for (GDataDirectoryCollection::iterator iter =
304 dir->child_directories_.begin(); 306 dir->child_directories_.begin();
305 iter != dir->child_directories_.end(); ++iter) { 307 iter != dir->child_directories_.end(); ++iter) {
308 iter->second->SetParent(NULL);
satorux1 2012/08/10 16:14:44 ditto
achuithb 2012/08/11 00:37:45 Done.
306 AddEntry(iter->second); 309 AddEntry(iter->second);
307 } 310 }
308 dir->child_directories_.clear(); 311 dir->child_directories_.clear();
309 return true; 312 return true;
310 } 313 }
311 314
312 void GDataDirectory::RemoveEntry(GDataEntry* entry) { 315 void GDataDirectory::RemoveEntry(GDataEntry* entry) {
313 DCHECK(entry); 316 DCHECK(entry);
314 317
315 RemoveChild(entry); 318 RemoveChild(entry);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 const std::string& base_name(entry->base_name()); 351 const std::string& base_name(entry->base_name());
349 // entry must be present in this directory. 352 // entry must be present in this directory.
350 DCHECK_EQ(entry, FindChild(base_name)); 353 DCHECK_EQ(entry, FindChild(base_name));
351 // Remove entry from resource map first. 354 // Remove entry from resource map first.
352 if (directory_service_) 355 if (directory_service_)
353 directory_service_->RemoveEntryFromResourceMap(entry); 356 directory_service_->RemoveEntryFromResourceMap(entry);
354 357
355 // Then delete it from tree. 358 // Then delete it from tree.
356 child_files_.erase(base_name); 359 child_files_.erase(base_name);
357 child_directories_.erase(base_name); 360 child_directories_.erase(base_name);
361
362 entry->SetParent(NULL);
358 } 363 }
359 364
360 void GDataDirectory::RemoveChildren() { 365 void GDataDirectory::RemoveChildren() {
361 RemoveChildFiles(); 366 RemoveChildFiles();
362 RemoveChildDirectories(); 367 RemoveChildDirectories();
363 } 368 }
364 369
365 void GDataDirectory::RemoveChildFiles() { 370 void GDataDirectory::RemoveChildFiles() {
366 for (GDataFileCollection::const_iterator iter = child_files_.begin(); 371 for (GDataFileCollection::const_iterator iter = child_files_.begin();
367 iter != child_files_.end(); ++iter) { 372 iter != child_files_.end(); ++iter) {
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 void GDataDirectoryService::ClearRoot() { 561 void GDataDirectoryService::ClearRoot() {
557 // Note that children have a reference to root_, 562 // Note that children have a reference to root_,
558 // so we need to delete them here. 563 // so we need to delete them here.
559 root_->RemoveChildren(); 564 root_->RemoveChildren();
560 RemoveEntryFromResourceMap(root_.get()); 565 RemoveEntryFromResourceMap(root_.get());
561 DCHECK(resource_map_.empty()); 566 DCHECK(resource_map_.empty());
562 resource_map_.clear(); 567 resource_map_.clear();
563 root_.reset(); 568 root_.reset();
564 } 569 }
565 570
571 void GDataDirectoryService::AddEntryToDirectory(
572 GDataDirectory* directory,
573 GDataEntry* new_entry,
574 const base::Closure& callback) {
satorux1 2012/08/10 16:14:44 As of now, this function won't fail as we are deal
achuithb 2012/08/11 00:37:45 This is an excellent suggestion, however we want t
575 DCHECK(!callback.is_null());
satorux1 2012/08/10 16:14:44 maybe add DCHECK(directory) and DCHECK(new_entry)
achuithb 2012/08/11 00:37:45 Done.
576 directory->AddEntry(new_entry);
577 base::MessageLoopProxy::current()->PostTask(FROM_HERE, callback);
578 }
579
580
566 void GDataDirectoryService::MoveEntryToDirectory( 581 void GDataDirectoryService::MoveEntryToDirectory(
567 const FilePath& directory_path, 582 const FilePath& directory_path,
568 GDataEntry* entry, 583 GDataEntry* entry,
569 const FileMoveCallback& callback) { 584 const FileMoveCallback& callback) {
570 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 585 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
571 DCHECK(entry); 586 DCHECK(entry);
572 587
573 if (entry->parent()) 588 if (entry->parent())
574 entry->parent()->RemoveChild(entry); 589 entry->parent()->RemoveChild(entry);
575 590
576 GDataEntry* destination = FindEntryByPathSync(directory_path); 591 GDataEntry* destination = FindEntryByPathSync(directory_path);
577 FilePath moved_file_path; 592 FilePath moved_file_path;
578 GDataFileError error = GDATA_FILE_ERROR_FAILED; 593 GDataFileError error = GDATA_FILE_ERROR_FAILED;
579 if (!destination) { 594 if (!destination) {
580 error = GDATA_FILE_ERROR_NOT_FOUND; 595 error = GDATA_FILE_ERROR_NOT_FOUND;
581 } else if (!destination->AsGDataDirectory()) { 596 } else if (!destination->AsGDataDirectory()) {
582 error = GDATA_FILE_ERROR_NOT_A_DIRECTORY; 597 error = GDATA_FILE_ERROR_NOT_A_DIRECTORY;
583 } else { 598 } else {
584 destination->AsGDataDirectory()->AddEntry(entry); 599 destination->AsGDataDirectory()->AddEntry(entry);
585 moved_file_path = entry->GetFilePath(); 600 moved_file_path = entry->GetFilePath();
586 error = GDATA_FILE_OK; 601 error = GDATA_FILE_OK;
587 } 602 }
588 if (!callback.is_null()) { 603 if (!callback.is_null()) {
589 base::MessageLoopProxy::current()->PostTask( 604 base::MessageLoopProxy::current()->PostTask(
590 FROM_HERE, base::Bind(callback, error, moved_file_path)); 605 FROM_HERE, base::Bind(callback, error, moved_file_path));
591 } 606 }
592 } 607 }
593 608
609 void GDataDirectoryService::RemoveEntryFromParent(
610 GDataEntry* entry,
611 const base::Closure& callback) {
satorux1 2012/08/10 16:14:44 ditto. FileOperationCallback?
achuithb 2012/08/11 00:37:45 Done. FileMoveCallback here and also in RefreshDir
612 entry->parent()->RemoveEntry(entry);
613 if (!callback.is_null()) {
614 base::MessageLoopProxy::current()->PostTask(FROM_HERE, callback);
615 }
616 }
617
618
594 void GDataDirectoryService::AddEntryToResourceMap(GDataEntry* entry) { 619 void GDataDirectoryService::AddEntryToResourceMap(GDataEntry* entry) {
595 // GDataFileSystem has already locked. 620 // GDataFileSystem has already locked.
596 DVLOG(1) << "AddEntryToResourceMap " << entry->resource_id(); 621 DVLOG(1) << "AddEntryToResourceMap " << entry->resource_id();
597 resource_map_.insert(std::make_pair(entry->resource_id(), entry)); 622 resource_map_.insert(std::make_pair(entry->resource_id(), entry));
598 } 623 }
599 624
600 void GDataDirectoryService::RemoveEntryFromResourceMap(GDataEntry* entry) { 625 void GDataDirectoryService::RemoveEntryFromResourceMap(GDataEntry* entry) {
601 // GDataFileSystem has already locked. 626 // GDataFileSystem has already locked.
602 resource_map_.erase(entry->resource_id()); 627 resource_map_.erase(entry->resource_id());
603 } 628 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
727 GDataDirectory* entry_parent = old_entry ? old_entry->parent() : NULL; 752 GDataDirectory* entry_parent = old_entry ? old_entry->parent() : NULL;
728 if (entry_parent) { 753 if (entry_parent) {
729 DCHECK_EQ(fresh_file->resource_id(), old_entry->resource_id()); 754 DCHECK_EQ(fresh_file->resource_id(), old_entry->resource_id());
730 DCHECK(old_entry->AsGDataFile()); 755 DCHECK(old_entry->AsGDataFile());
731 756
732 entry_parent->RemoveEntry(old_entry); 757 entry_parent->RemoveEntry(old_entry);
733 entry_parent->AddEntry(fresh_file.release()); 758 entry_parent->AddEntry(fresh_file.release());
734 } 759 }
735 } 760 }
736 761
762 void GDataDirectoryService::RefreshDirectory(
763 const std::string& directory_resource_id,
764 const ResourceMap& file_map,
765 const base::Closure& callback) {
satorux1 2012/08/10 16:14:44 DCHECK(!callback.is_null())
achuithb 2012/08/11 00:37:45 Done.
766 GetEntryByResourceIdAsync(directory_resource_id,
satorux1 2012/08/10 16:14:44 nit: please move directory_resource_id to the next
achuithb 2012/08/11 00:37:45 Done.
767 base::Bind(&GDataDirectoryService::RefreshDirectoryInternal,
768 file_map,
769 callback));
770 }
771
772 // static
773 void GDataDirectoryService::RefreshDirectoryInternal(
774 const ResourceMap& file_map,
775 const base::Closure& callback,
776 GDataEntry* directory_entry) {
777 DCHECK(!callback.is_null());
satorux1 2012/08/10 16:14:44 nit: add a blank line like we do elsewhere
achuithb 2012/08/11 00:37:45 Done.
778 if (!directory_entry || !directory_entry->AsGDataDirectory()) {
779 LOG(ERROR) << "RefreshDirectoryInternal: Failed to find directory";
780 return;
781 }
782
783 GDataDirectory* directory = directory_entry->AsGDataDirectory();
784
785 directory->RemoveChildFiles();
786 // Add files from file_map.
787 for (ResourceMap::const_iterator it = file_map.begin();
788 it != file_map.end(); ++it) {
789 scoped_ptr<GDataEntry> entry(it->second);
790 // Skip if it's not a file (i.e. directory).
791 if (!entry->AsGDataFile())
792 continue;
793 directory->AddEntry(entry.release());
794 }
795
796 callback.Run();
797 }
798
737 void GDataDirectoryService::InitFromDB( 799 void GDataDirectoryService::InitFromDB(
738 const FilePath& db_path, 800 const FilePath& db_path,
739 base::SequencedTaskRunner* blocking_task_runner, 801 base::SequencedTaskRunner* blocking_task_runner,
740 const FileOperationCallback& callback) { 802 const FileOperationCallback& callback) {
741 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 803 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
742 DCHECK(!db_path.empty()); 804 DCHECK(!db_path.empty());
743 DCHECK(blocking_task_runner); 805 DCHECK(blocking_task_runner);
744 806
745 if (directory_service_db_.get()) { 807 if (directory_service_db_.get()) {
746 if (!callback.is_null()) 808 if (!callback.is_null())
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 DCHECK(result.get()); 1257 DCHECK(result.get());
1196 1258
1197 result->second.path = second_path; 1259 result->second.path = second_path;
1198 result->second.error = error; 1260 result->second.error = error;
1199 result->second.proto = entry_proto.Pass(); 1261 result->second.proto = entry_proto.Pass();
1200 1262
1201 callback.Run(result.Pass()); 1263 callback.Run(result.Pass());
1202 } 1264 }
1203 1265
1204 } // namespace gdata 1266 } // namespace gdata
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698