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 |