Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "base/platform_file.h" | 7 #include "base/platform_file.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 26 } | 26 } |
| 27 | 27 |
| 28 } // namespace | 28 } // namespace |
| 29 | 29 |
| 30 // GDataEntry class. | 30 // GDataEntry class. |
| 31 | 31 |
| 32 GDataEntry::GDataEntry(GDataDirectoryService* directory_service) | 32 GDataEntry::GDataEntry(GDataDirectoryService* directory_service) |
| 33 : parent_(NULL), | 33 : parent_(NULL), |
| 34 directory_service_(directory_service), | 34 directory_service_(directory_service), |
| 35 deleted_(false) { | 35 deleted_(false) { |
| 36 DCHECK(directory_service); | |
| 36 } | 37 } |
| 37 | 38 |
| 38 GDataEntry::~GDataEntry() { | 39 GDataEntry::~GDataEntry() { |
| 39 } | 40 } |
| 40 | 41 |
| 41 GDataFile* GDataEntry::AsGDataFile() { | 42 GDataFile* GDataEntry::AsGDataFile() { |
| 42 return NULL; | 43 return NULL; |
| 43 } | 44 } |
| 44 | 45 |
| 45 GDataDirectory* GDataEntry::AsGDataDirectory() { | 46 GDataDirectory* GDataEntry::AsGDataDirectory() { |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 229 } | 230 } |
| 230 } | 231 } |
| 231 entry->set_base_name(full_file_name.value()); | 232 entry->set_base_name(full_file_name.value()); |
| 232 | 233 |
| 233 DVLOG(1) << "AddEntry: dir = " << GetFilePath().value() | 234 DVLOG(1) << "AddEntry: dir = " << GetFilePath().value() |
| 234 << ", file = " + entry->base_name() | 235 << ", file = " + entry->base_name() |
| 235 << ", parent resource = " << entry->parent_resource_id() | 236 << ", parent resource = " << entry->parent_resource_id() |
| 236 << ", resource = " + entry->resource_id(); | 237 << ", resource = " + entry->resource_id(); |
| 237 | 238 |
| 238 // Add entry to resource map. | 239 // Add entry to resource map. |
| 239 if (directory_service_) | 240 directory_service_->AddEntryToResourceMap(entry); |
| 240 directory_service_->AddEntryToResourceMap(entry); | |
| 241 | 241 |
| 242 // Setup child and parent links. | 242 // Setup child and parent links. |
| 243 AddChild(entry); | 243 AddChild(entry); |
| 244 entry->SetParent(this); | 244 entry->SetParent(this); |
| 245 } | 245 } |
| 246 | 246 |
| 247 bool GDataDirectory::TakeOverEntries(GDataDirectory* dir) { | 247 bool GDataDirectory::TakeOverEntries(GDataDirectory* dir) { |
| 248 for (GDataFileCollection::iterator iter = dir->child_files_.begin(); | 248 for (GDataFileCollection::const_iterator iter = dir->child_files_.begin(); |
| 249 iter != dir->child_files_.end(); ++iter) { | 249 iter != dir->child_files_.end(); ++iter) { |
| 250 GDataEntry* entry = iter->second; | 250 GDataEntry* entry = iter->second; |
| 251 directory_service_->RemoveEntryFromResourceMap(entry->resource_id()); | |
| 251 entry->SetParent(NULL); | 252 entry->SetParent(NULL); |
| 252 AddEntry(entry); | 253 AddEntry(entry); |
| 253 } | 254 } |
| 254 dir->child_files_.clear(); | 255 dir->child_files_.clear(); |
| 255 | 256 |
| 256 for (GDataDirectoryCollection::iterator iter = | 257 for (GDataDirectoryCollection::iterator iter = |
| 257 dir->child_directories_.begin(); | 258 dir->child_directories_.begin(); |
| 258 iter != dir->child_directories_.end(); ++iter) { | 259 iter != dir->child_directories_.end(); ++iter) { |
| 259 GDataEntry* entry = iter->second; | 260 GDataEntry* entry = iter->second; |
| 261 directory_service_->RemoveEntryFromResourceMap(entry->resource_id()); | |
| 260 entry->SetParent(NULL); | 262 entry->SetParent(NULL); |
| 261 AddEntry(entry); | 263 AddEntry(entry); |
| 262 } | 264 } |
| 263 dir->child_directories_.clear(); | 265 dir->child_directories_.clear(); |
| 264 return true; | 266 return true; |
| 265 } | 267 } |
| 266 | 268 |
| 267 void GDataDirectory::RemoveEntry(GDataEntry* entry) { | 269 void GDataDirectory::RemoveEntry(GDataEntry* entry) { |
| 268 DCHECK(entry); | 270 DCHECK(entry); |
| 269 | 271 |
| 270 RemoveChild(entry); | 272 RemoveChild(entry); |
| 271 delete entry; | 273 delete entry; |
| 272 } | 274 } |
| 273 | 275 |
| 274 GDataEntry* GDataDirectory::FindChild( | 276 GDataEntry* GDataDirectory::FindChild( |
| 275 const FilePath::StringType& file_name) const { | 277 const FilePath::StringType& file_name) const { |
| 276 GDataFileCollection::const_iterator it = child_files_.find(file_name); | 278 GDataFileCollection::const_iterator iter = child_files_.find(file_name); |
| 277 if (it != child_files_.end()) | 279 if (iter != child_files_.end()) |
| 278 return it->second; | 280 return iter->second; |
| 279 | 281 |
| 280 GDataDirectoryCollection::const_iterator itd = | 282 GDataDirectoryCollection::const_iterator itd = |
| 281 child_directories_.find(file_name); | 283 child_directories_.find(file_name); |
| 282 if (itd != child_directories_.end()) | 284 if (itd != child_directories_.end()) |
| 283 return itd->second; | 285 return itd->second; |
| 284 | 286 |
| 285 return NULL; | 287 return NULL; |
| 286 } | 288 } |
| 287 | 289 |
| 288 void GDataDirectory::AddChild(GDataEntry* entry) { | 290 void GDataDirectory::AddChild(GDataEntry* entry) { |
| 289 DCHECK(entry); | 291 DCHECK(entry); |
| 290 | 292 |
| 291 GDataFile* file = entry->AsGDataFile(); | 293 if (entry->AsGDataFile()) |
| 292 if (file) | 294 child_files_.insert(std::make_pair(entry->base_name(), |
| 293 child_files_.insert(std::make_pair(entry->base_name(), file)); | 295 entry->AsGDataFile())); |
| 294 | 296 |
| 295 GDataDirectory* directory = entry->AsGDataDirectory(); | 297 if (entry->AsGDataDirectory()) |
| 296 if (directory) | 298 child_directories_.insert(std::make_pair(entry->base_name(), |
| 297 child_directories_.insert(std::make_pair(entry->base_name(), directory)); | 299 entry->AsGDataDirectory())); |
| 298 } | 300 } |
| 299 | 301 |
| 300 void GDataDirectory::RemoveChild(GDataEntry* entry) { | 302 void GDataDirectory::RemoveChild(GDataEntry* entry) { |
| 301 DCHECK(entry); | 303 DCHECK(entry); |
| 302 | 304 |
| 303 const std::string& base_name(entry->base_name()); | 305 const std::string& base_name(entry->base_name()); |
| 304 // entry must be present in this directory. | 306 // entry must be present in this directory. |
| 305 DCHECK_EQ(entry, FindChild(base_name)); | 307 DCHECK_EQ(entry, FindChild(base_name)); |
| 306 // Remove entry from resource map first. | 308 // Remove entry from resource map first. |
| 307 if (directory_service_) | 309 directory_service_->RemoveEntryFromResourceMap(entry->resource_id()); |
| 308 directory_service_->RemoveEntryFromResourceMap(entry); | |
| 309 | 310 |
| 310 // Then delete it from tree. | 311 // Then delete it from tree. |
| 311 child_files_.erase(base_name); | 312 child_files_.erase(base_name); |
| 312 child_directories_.erase(base_name); | 313 child_directories_.erase(base_name); |
| 313 | 314 |
| 314 entry->SetParent(NULL); | 315 entry->SetParent(NULL); |
| 315 } | 316 } |
| 316 | 317 |
| 317 void GDataDirectory::RemoveChildren() { | 318 void GDataDirectory::RemoveChildren() { |
| 318 RemoveChildFiles(); | 319 RemoveChildFiles(); |
| 319 RemoveChildDirectories(); | 320 RemoveChildDirectories(); |
| 320 } | 321 } |
| 321 | 322 |
| 322 void GDataDirectory::RemoveChildFiles() { | 323 void GDataDirectory::RemoveChildFiles() { |
| 324 DVLOG(1) << "RemoveChildFiles " << resource_id(); | |
| 323 for (GDataFileCollection::const_iterator iter = child_files_.begin(); | 325 for (GDataFileCollection::const_iterator iter = child_files_.begin(); |
| 324 iter != child_files_.end(); ++iter) { | 326 iter != child_files_.end(); ++iter) { |
| 325 if (directory_service_) | 327 directory_service_->RemoveEntryFromResourceMap(iter->second->resource_id()); |
| 326 directory_service_->RemoveEntryFromResourceMap(iter->second); | |
| 327 } | 328 } |
| 328 STLDeleteValues(&child_files_); | 329 STLDeleteValues(&child_files_); |
| 329 child_files_.clear(); | 330 child_files_.clear(); |
| 330 } | 331 } |
| 331 | 332 |
| 332 void GDataDirectory::RemoveChildDirectories() { | 333 void GDataDirectory::RemoveChildDirectories() { |
| 333 for (GDataDirectoryCollection::iterator iter = child_directories_.begin(); | 334 for (GDataDirectoryCollection::iterator iter = child_directories_.begin(); |
| 334 iter != child_directories_.end(); ++iter) { | 335 iter != child_directories_.end(); ++iter) { |
| 335 GDataDirectory* dir = iter->second; | 336 GDataDirectory* dir = iter->second; |
| 336 // Remove directories recursively. | 337 // Remove directories recursively. |
| 337 dir->RemoveChildren(); | 338 dir->RemoveChildren(); |
| 338 if (directory_service_) | 339 directory_service_->RemoveEntryFromResourceMap(dir->resource_id()); |
| 339 directory_service_->RemoveEntryFromResourceMap(dir); | |
| 340 } | 340 } |
| 341 STLDeleteValues(&child_directories_); | 341 STLDeleteValues(&child_directories_); |
| 342 child_directories_.clear(); | 342 child_directories_.clear(); |
| 343 } | 343 } |
| 344 | 344 |
| 345 // Recursively extracts the paths set of all sub-directories. | |
|
satorux1
2012/08/17 11:49:17
remove this comment?
achuithb
2012/08/17 21:02:27
Done.
| |
| 346 void GDataDirectory::GetChildDirectoryPaths(std::set<FilePath>* child_dirs) { | |
| 347 for (GDataDirectoryCollection::const_iterator it = child_directories_.begin(); | |
| 348 it != child_directories_.end(); ++it) { | |
| 349 GDataDirectory* child_dir = it->second; | |
| 350 child_dirs->insert(child_dir->GetFilePath()); | |
| 351 child_dir->GetChildDirectoryPaths(child_dirs); | |
| 352 } | |
| 353 } | |
| 354 | |
| 345 // Convert to/from proto. | 355 // Convert to/from proto. |
| 346 | 356 |
| 347 // static | 357 // static |
| 348 void GDataEntry::ConvertProtoToPlatformFileInfo( | 358 void GDataEntry::ConvertProtoToPlatformFileInfo( |
| 349 const PlatformFileInfoProto& proto, | 359 const PlatformFileInfoProto& proto, |
| 350 base::PlatformFileInfo* file_info) { | 360 base::PlatformFileInfo* file_info) { |
| 351 file_info->size = proto.size(); | 361 file_info->size = proto.size(); |
| 352 file_info->is_directory = proto.is_directory(); | 362 file_info->is_directory = proto.is_directory(); |
| 353 file_info->is_symbolic_link = proto.is_symbolic_link(); | 363 file_info->is_symbolic_link = proto.is_symbolic_link(); |
| 354 file_info->last_modified = base::Time::FromInternalValue( | 364 file_info->last_modified = base::Time::FromInternalValue( |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 491 for (GDataDirectoryCollection::const_iterator iter = | 501 for (GDataDirectoryCollection::const_iterator iter = |
| 492 child_directories_.begin(); | 502 child_directories_.begin(); |
| 493 iter != child_directories_.end(); ++iter) { | 503 iter != child_directories_.end(); ++iter) { |
| 494 GDataDirectory* dir = iter->second; | 504 GDataDirectory* dir = iter->second; |
| 495 dir->ToProto(proto->add_child_directories()); | 505 dir->ToProto(proto->add_child_directories()); |
| 496 } | 506 } |
| 497 } | 507 } |
| 498 | 508 |
| 499 scoped_ptr<GDataEntryProtoVector> GDataDirectory::ToProtoVector() const { | 509 scoped_ptr<GDataEntryProtoVector> GDataDirectory::ToProtoVector() const { |
| 500 scoped_ptr<GDataEntryProtoVector> entries(new GDataEntryProtoVector); | 510 scoped_ptr<GDataEntryProtoVector> entries(new GDataEntryProtoVector); |
| 501 for (GDataFileCollection::const_iterator iter = child_files().begin(); | 511 for (GDataFileCollection::const_iterator iter = child_files_.begin(); |
| 502 iter != child_files().end(); ++iter) { | 512 iter != child_files_.end(); ++iter) { |
| 503 GDataEntryProto proto; | 513 GDataEntryProto proto; |
| 504 iter->second->ToProto(&proto); | 514 iter->second->ToProto(&proto); |
| 505 entries->push_back(proto); | 515 entries->push_back(proto); |
| 506 } | 516 } |
| 507 for (GDataDirectoryCollection::const_iterator iter = | 517 for (GDataDirectoryCollection::const_iterator iter = |
| 508 child_directories().begin(); | 518 child_directories_.begin(); |
| 509 iter != child_directories().end(); ++iter) { | 519 iter != child_directories_.end(); ++iter) { |
| 510 GDataEntryProto proto; | 520 GDataEntryProto proto; |
| 511 // Convert to GDataEntry, as we don't want to include children in |proto|. | 521 // Convert to GDataEntry, as we don't want to include children in |proto|. |
| 512 static_cast<const GDataEntry*>(iter->second)->ToProtoFull(&proto); | 522 static_cast<const GDataEntry*>(iter->second)->ToProtoFull(&proto); |
| 513 entries->push_back(proto); | 523 entries->push_back(proto); |
| 514 } | 524 } |
| 515 | 525 |
| 516 return entries.Pass(); | 526 return entries.Pass(); |
| 517 } | 527 } |
| 518 | 528 |
| 519 void GDataEntry::SerializeToString(std::string* serialized_proto) const { | 529 void GDataEntry::SerializeToString(std::string* serialized_proto) const { |
| 520 const GDataFile* file = AsGDataFileConst(); | 530 const GDataFile* file = AsGDataFileConst(); |
| 521 const GDataDirectory* dir = AsGDataDirectoryConst(); | 531 const GDataDirectory* dir = AsGDataDirectoryConst(); |
| 522 | 532 |
| 523 if (file) { | 533 if (file) { |
| 524 GDataEntryProto entry_proto; | 534 GDataEntryProto entry_proto; |
| 525 file->ToProto(&entry_proto); | 535 file->ToProto(&entry_proto); |
| 526 const bool ok = entry_proto.SerializeToString(serialized_proto); | 536 const bool ok = entry_proto.SerializeToString(serialized_proto); |
| 527 DCHECK(ok); | 537 DCHECK(ok); |
| 528 } else if (dir) { | 538 } else if (dir) { |
| 529 GDataDirectoryProto dir_proto; | 539 GDataDirectoryProto dir_proto; |
| 530 dir->ToProto(&dir_proto); | 540 dir->ToProto(&dir_proto); |
| 531 const bool ok = dir_proto.SerializeToString(serialized_proto); | 541 const bool ok = dir_proto.SerializeToString(serialized_proto); |
| 532 DCHECK(ok); | 542 DCHECK(ok); |
| 533 } | 543 } |
| 534 } | 544 } |
| 535 | 545 |
| 536 } // namespace gdata | 546 } // namespace gdata |
| OLD | NEW |