| 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" |
| 11 #include "chrome/browser/chromeos/gdata/gdata.pb.h" | 11 #include "chrome/browser/chromeos/gdata/drive.pb.h" |
| 12 #include "chrome/browser/chromeos/gdata/gdata_directory_service.h" | 12 #include "chrome/browser/chromeos/gdata/gdata_directory_service.h" |
| 13 #include "chrome/browser/chromeos/gdata/gdata_wapi_parser.h" | 13 #include "chrome/browser/chromeos/gdata/gdata_wapi_parser.h" |
| 14 #include "net/base/escape.h" | 14 #include "net/base/escape.h" |
| 15 | 15 |
| 16 namespace gdata { | 16 namespace gdata { |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 const char kSlash[] = "/"; | 19 const char kSlash[] = "/"; |
| 20 const char kEscapedSlash[] = "\xE2\x88\x95"; | 20 const char kEscapedSlash[] = "\xE2\x88\x95"; |
| 21 | 21 |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 const base::PlatformFileInfo& file_info, | 372 const base::PlatformFileInfo& file_info, |
| 373 PlatformFileInfoProto* proto) { | 373 PlatformFileInfoProto* proto) { |
| 374 proto->set_size(file_info.size); | 374 proto->set_size(file_info.size); |
| 375 proto->set_is_directory(file_info.is_directory); | 375 proto->set_is_directory(file_info.is_directory); |
| 376 proto->set_is_symbolic_link(file_info.is_symbolic_link); | 376 proto->set_is_symbolic_link(file_info.is_symbolic_link); |
| 377 proto->set_last_modified(file_info.last_modified.ToInternalValue()); | 377 proto->set_last_modified(file_info.last_modified.ToInternalValue()); |
| 378 proto->set_last_accessed(file_info.last_accessed.ToInternalValue()); | 378 proto->set_last_accessed(file_info.last_accessed.ToInternalValue()); |
| 379 proto->set_creation_time(file_info.creation_time.ToInternalValue()); | 379 proto->set_creation_time(file_info.creation_time.ToInternalValue()); |
| 380 } | 380 } |
| 381 | 381 |
| 382 void GDataEntry::FromProto(const GDataEntryProto& proto) { | 382 void GDataEntry::FromProto(const DriveEntryProto& proto) { |
| 383 ConvertProtoToPlatformFileInfo(proto.file_info(), &file_info_); | 383 ConvertProtoToPlatformFileInfo(proto.file_info(), &file_info_); |
| 384 | 384 |
| 385 // Don't copy from proto.base_name() as base_name_ is computed in | 385 // Don't copy from proto.base_name() as base_name_ is computed in |
| 386 // SetBaseNameFromTitle(). | 386 // SetBaseNameFromTitle(). |
| 387 title_ = proto.title(); | 387 title_ = proto.title(); |
| 388 resource_id_ = proto.resource_id(); | 388 resource_id_ = proto.resource_id(); |
| 389 parent_resource_id_ = proto.parent_resource_id(); | 389 parent_resource_id_ = proto.parent_resource_id(); |
| 390 edit_url_ = GURL(proto.edit_url()); | 390 edit_url_ = GURL(proto.edit_url()); |
| 391 content_url_ = GURL(proto.content_url()); | 391 content_url_ = GURL(proto.content_url()); |
| 392 upload_url_ = GURL(proto.upload_url()); | 392 upload_url_ = GURL(proto.upload_url()); |
| 393 SetBaseNameFromTitle(); | 393 SetBaseNameFromTitle(); |
| 394 } | 394 } |
| 395 | 395 |
| 396 void GDataEntry::ToProto(GDataEntryProto* proto) const { | 396 void GDataEntry::ToProto(DriveEntryProto* proto) const { |
| 397 ConvertPlatformFileInfoToProto(file_info_, proto->mutable_file_info()); | 397 ConvertPlatformFileInfoToProto(file_info_, proto->mutable_file_info()); |
| 398 | 398 |
| 399 // The base_name field is used in GetFileInfoByPathAsync(). As shown in | 399 // The base_name field is used in GetFileInfoByPathAsync(). As shown in |
| 400 // FromProto(), the value is discarded when deserializing from proto. | 400 // FromProto(), the value is discarded when deserializing from proto. |
| 401 proto->set_base_name(base_name_); | 401 proto->set_base_name(base_name_); |
| 402 proto->set_title(title_); | 402 proto->set_title(title_); |
| 403 proto->set_resource_id(resource_id_); | 403 proto->set_resource_id(resource_id_); |
| 404 proto->set_parent_resource_id(parent_resource_id_); | 404 proto->set_parent_resource_id(parent_resource_id_); |
| 405 proto->set_edit_url(edit_url_.spec()); | 405 proto->set_edit_url(edit_url_.spec()); |
| 406 proto->set_content_url(content_url_.spec()); | 406 proto->set_content_url(content_url_.spec()); |
| 407 proto->set_upload_url(upload_url_.spec()); | 407 proto->set_upload_url(upload_url_.spec()); |
| 408 } | 408 } |
| 409 | 409 |
| 410 void GDataEntry::ToProtoFull(GDataEntryProto* proto) const { | 410 void GDataEntry::ToProtoFull(DriveEntryProto* proto) const { |
| 411 if (AsGDataFileConst()) { | 411 if (AsGDataFileConst()) { |
| 412 AsGDataFileConst()->ToProto(proto); | 412 AsGDataFileConst()->ToProto(proto); |
| 413 } else if (AsGDataDirectoryConst()) { | 413 } else if (AsGDataDirectoryConst()) { |
| 414 // Unlike files, directories don't have directory specific info, so just | 414 // Unlike files, directories don't have directory specific info, so just |
| 415 // calling GDataEntry::ToProto(). | 415 // calling GDataEntry::ToProto(). |
| 416 ToProto(proto); | 416 ToProto(proto); |
| 417 } else { | 417 } else { |
| 418 NOTREACHED(); | 418 NOTREACHED(); |
| 419 } | 419 } |
| 420 } | 420 } |
| 421 | 421 |
| 422 void GDataFile::FromProto(const GDataEntryProto& proto) { | 422 void GDataFile::FromProto(const DriveEntryProto& proto) { |
| 423 DCHECK(!proto.file_info().is_directory()); | 423 DCHECK(!proto.file_info().is_directory()); |
| 424 | 424 |
| 425 GDataEntry::FromProto(proto); | 425 GDataEntry::FromProto(proto); |
| 426 | 426 |
| 427 thumbnail_url_ = GURL(proto.file_specific_info().thumbnail_url()); | 427 thumbnail_url_ = GURL(proto.file_specific_info().thumbnail_url()); |
| 428 alternate_url_ = GURL(proto.file_specific_info().alternate_url()); | 428 alternate_url_ = GURL(proto.file_specific_info().alternate_url()); |
| 429 content_mime_type_ = proto.file_specific_info().content_mime_type(); | 429 content_mime_type_ = proto.file_specific_info().content_mime_type(); |
| 430 file_md5_ = proto.file_specific_info().file_md5(); | 430 file_md5_ = proto.file_specific_info().file_md5(); |
| 431 document_extension_ = proto.file_specific_info().document_extension(); | 431 document_extension_ = proto.file_specific_info().document_extension(); |
| 432 is_hosted_document_ = proto.file_specific_info().is_hosted_document(); | 432 is_hosted_document_ = proto.file_specific_info().is_hosted_document(); |
| 433 } | 433 } |
| 434 | 434 |
| 435 void GDataFile::ToProto(GDataEntryProto* proto) const { | 435 void GDataFile::ToProto(DriveEntryProto* proto) const { |
| 436 GDataEntry::ToProto(proto); | 436 GDataEntry::ToProto(proto); |
| 437 DCHECK(!proto->file_info().is_directory()); | 437 DCHECK(!proto->file_info().is_directory()); |
| 438 GDataFileSpecificInfo* file_specific_info = | 438 DriveFileSpecificInfo* file_specific_info = |
| 439 proto->mutable_file_specific_info(); | 439 proto->mutable_file_specific_info(); |
| 440 file_specific_info->set_thumbnail_url(thumbnail_url_.spec()); | 440 file_specific_info->set_thumbnail_url(thumbnail_url_.spec()); |
| 441 file_specific_info->set_alternate_url(alternate_url_.spec()); | 441 file_specific_info->set_alternate_url(alternate_url_.spec()); |
| 442 file_specific_info->set_content_mime_type(content_mime_type_); | 442 file_specific_info->set_content_mime_type(content_mime_type_); |
| 443 file_specific_info->set_file_md5(file_md5_); | 443 file_specific_info->set_file_md5(file_md5_); |
| 444 file_specific_info->set_document_extension(document_extension_); | 444 file_specific_info->set_document_extension(document_extension_); |
| 445 file_specific_info->set_is_hosted_document(is_hosted_document_); | 445 file_specific_info->set_is_hosted_document(is_hosted_document_); |
| 446 } | 446 } |
| 447 | 447 |
| 448 void GDataDirectory::FromProto(const GDataDirectoryProto& proto) { | 448 void GDataDirectory::FromProto(const DriveDirectoryProto& proto) { |
| 449 DCHECK(proto.gdata_entry().file_info().is_directory()); | 449 DCHECK(proto.gdata_entry().file_info().is_directory()); |
| 450 DCHECK(!proto.gdata_entry().has_file_specific_info()); | 450 DCHECK(!proto.gdata_entry().has_file_specific_info()); |
| 451 | 451 |
| 452 for (int i = 0; i < proto.child_files_size(); ++i) { | 452 for (int i = 0; i < proto.child_files_size(); ++i) { |
| 453 scoped_ptr<GDataFile> file(directory_service_->CreateGDataFile()); | 453 scoped_ptr<GDataFile> file(directory_service_->CreateGDataFile()); |
| 454 file->FromProto(proto.child_files(i)); | 454 file->FromProto(proto.child_files(i)); |
| 455 AddEntry(file.release()); | 455 AddEntry(file.release()); |
| 456 } | 456 } |
| 457 for (int i = 0; i < proto.child_directories_size(); ++i) { | 457 for (int i = 0; i < proto.child_directories_size(); ++i) { |
| 458 scoped_ptr<GDataDirectory> dir(directory_service_->CreateGDataDirectory()); | 458 scoped_ptr<GDataDirectory> dir(directory_service_->CreateGDataDirectory()); |
| 459 dir->FromProto(proto.child_directories(i)); | 459 dir->FromProto(proto.child_directories(i)); |
| 460 AddEntry(dir.release()); | 460 AddEntry(dir.release()); |
| 461 } | 461 } |
| 462 | 462 |
| 463 // The states of the directory should be updated after children are | 463 // The states of the directory should be updated after children are |
| 464 // handled successfully, so that incomplete states are not left. | 464 // handled successfully, so that incomplete states are not left. |
| 465 GDataEntry::FromProto(proto.gdata_entry()); | 465 GDataEntry::FromProto(proto.gdata_entry()); |
| 466 } | 466 } |
| 467 | 467 |
| 468 void GDataDirectory::ToProto(GDataDirectoryProto* proto) const { | 468 void GDataDirectory::ToProto(DriveDirectoryProto* proto) const { |
| 469 GDataEntry::ToProto(proto->mutable_gdata_entry()); | 469 GDataEntry::ToProto(proto->mutable_gdata_entry()); |
| 470 DCHECK(proto->gdata_entry().file_info().is_directory()); | 470 DCHECK(proto->gdata_entry().file_info().is_directory()); |
| 471 | 471 |
| 472 for (GDataChildMap::const_iterator iter = child_files_.begin(); | 472 for (GDataChildMap::const_iterator iter = child_files_.begin(); |
| 473 iter != child_files_.end(); ++iter) { | 473 iter != child_files_.end(); ++iter) { |
| 474 GDataFile* file = directory_service_->GetEntryByResourceId( | 474 GDataFile* file = directory_service_->GetEntryByResourceId( |
| 475 iter->second)->AsGDataFile(); | 475 iter->second)->AsGDataFile(); |
| 476 DCHECK(file); | 476 DCHECK(file); |
| 477 file->ToProto(proto->add_child_files()); | 477 file->ToProto(proto->add_child_files()); |
| 478 } | 478 } |
| 479 for (GDataChildMap::const_iterator iter = child_directories_.begin(); | 479 for (GDataChildMap::const_iterator iter = child_directories_.begin(); |
| 480 iter != child_directories_.end(); ++iter) { | 480 iter != child_directories_.end(); ++iter) { |
| 481 GDataDirectory* dir = directory_service_->GetEntryByResourceId( | 481 GDataDirectory* dir = directory_service_->GetEntryByResourceId( |
| 482 iter->second)->AsGDataDirectory(); | 482 iter->second)->AsGDataDirectory(); |
| 483 DCHECK(dir); | 483 DCHECK(dir); |
| 484 dir->ToProto(proto->add_child_directories()); | 484 dir->ToProto(proto->add_child_directories()); |
| 485 } | 485 } |
| 486 } | 486 } |
| 487 | 487 |
| 488 scoped_ptr<GDataEntryProtoVector> GDataDirectory::ToProtoVector() const { | 488 scoped_ptr<DriveEntryProtoVector> GDataDirectory::ToProtoVector() const { |
| 489 scoped_ptr<GDataEntryProtoVector> entries(new GDataEntryProtoVector); | 489 scoped_ptr<DriveEntryProtoVector> entries(new DriveEntryProtoVector); |
| 490 // Use ToProtoFull, as we don't want to include children in |proto|. | 490 // Use ToProtoFull, as we don't want to include children in |proto|. |
| 491 for (GDataChildMap::const_iterator iter = child_files_.begin(); | 491 for (GDataChildMap::const_iterator iter = child_files_.begin(); |
| 492 iter != child_files_.end(); ++iter) { | 492 iter != child_files_.end(); ++iter) { |
| 493 GDataEntryProto proto; | 493 DriveEntryProto proto; |
| 494 directory_service_->GetEntryByResourceId(iter->second)->ToProtoFull(&proto); | 494 directory_service_->GetEntryByResourceId(iter->second)->ToProtoFull(&proto); |
| 495 entries->push_back(proto); | 495 entries->push_back(proto); |
| 496 } | 496 } |
| 497 for (GDataChildMap::const_iterator iter = child_directories_.begin(); | 497 for (GDataChildMap::const_iterator iter = child_directories_.begin(); |
| 498 iter != child_directories_.end(); ++iter) { | 498 iter != child_directories_.end(); ++iter) { |
| 499 GDataEntryProto proto; | 499 DriveEntryProto proto; |
| 500 directory_service_->GetEntryByResourceId(iter->second)->ToProtoFull(&proto); | 500 directory_service_->GetEntryByResourceId(iter->second)->ToProtoFull(&proto); |
| 501 entries->push_back(proto); | 501 entries->push_back(proto); |
| 502 } | 502 } |
| 503 | 503 |
| 504 return entries.Pass(); | 504 return entries.Pass(); |
| 505 } | 505 } |
| 506 | 506 |
| 507 void GDataEntry::SerializeToString(std::string* serialized_proto) const { | 507 void GDataEntry::SerializeToString(std::string* serialized_proto) const { |
| 508 const GDataFile* file = AsGDataFileConst(); | 508 const GDataFile* file = AsGDataFileConst(); |
| 509 const GDataDirectory* dir = AsGDataDirectoryConst(); | 509 const GDataDirectory* dir = AsGDataDirectoryConst(); |
| 510 | 510 |
| 511 if (file) { | 511 if (file) { |
| 512 GDataEntryProto entry_proto; | 512 DriveEntryProto entry_proto; |
| 513 file->ToProto(&entry_proto); | 513 file->ToProto(&entry_proto); |
| 514 const bool ok = entry_proto.SerializeToString(serialized_proto); | 514 const bool ok = entry_proto.SerializeToString(serialized_proto); |
| 515 DCHECK(ok); | 515 DCHECK(ok); |
| 516 } else if (dir) { | 516 } else if (dir) { |
| 517 GDataDirectoryProto dir_proto; | 517 DriveDirectoryProto dir_proto; |
| 518 dir->ToProto(&dir_proto); | 518 dir->ToProto(&dir_proto); |
| 519 const bool ok = dir_proto.SerializeToString(serialized_proto); | 519 const bool ok = dir_proto.SerializeToString(serialized_proto); |
| 520 DCHECK(ok); | 520 DCHECK(ok); |
| 521 } | 521 } |
| 522 } | 522 } |
| 523 | 523 |
| 524 } // namespace gdata | 524 } // namespace gdata |
| OLD | NEW |