diff options
author | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-05 11:09:52 +0000 |
---|---|---|
committer | kinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-05 11:09:52 +0000 |
commit | b0b3dbd9358e55e70a4592428c6dca07f76eccde (patch) | |
tree | 055d90c2581792b42eb7b8bd7f91b9a1a342dfad | |
parent | 67a8f5a2310ebd4a6936a17632169d7660ebb3df (diff) | |
download | chromium_src-b0b3dbd9358e55e70a4592428c6dca07f76eccde.zip chromium_src-b0b3dbd9358e55e70a4592428c6dca07f76eccde.tar.gz chromium_src-b0b3dbd9358e55e70a4592428c6dca07f76eccde.tar.bz2 |
Parse 'shared' attribute in WAPI/DriveAPI.
In WAPI, a label "shared" is added to the category of an entry.
In Drive API, the File resources contain a boolean field "shared".
BUG=264812
Review URL: https://codereview.chromium.org/104193002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238936 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/drive/resource_entry_conversion.cc | 13 | ||||
-rw-r--r-- | chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc | 5 | ||||
-rw-r--r-- | chrome/browser/chromeos/drive/resource_metadata_storage.cc | 23 | ||||
-rw-r--r-- | chrome/browser/chromeos/drive/resource_metadata_storage.h | 2 | ||||
-rw-r--r-- | chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc | 43 | ||||
-rw-r--r-- | chrome/browser/drive/drive_api_service.cc | 6 | ||||
-rw-r--r-- | chrome/browser/drive/drive_api_util.cc | 16 | ||||
-rw-r--r-- | chrome/test/data/drive/changelist.json | 3 | ||||
-rw-r--r-- | chrome/test/data/drive/filelist.json | 3 | ||||
-rw-r--r-- | google_apis/drive/drive_api_parser.cc | 4 | ||||
-rw-r--r-- | google_apis/drive/drive_api_parser.h | 7 | ||||
-rw-r--r-- | google_apis/drive/drive_api_parser_unittest.cc | 6 |
12 files changed, 113 insertions, 18 deletions
diff --git a/chrome/browser/chromeos/drive/resource_entry_conversion.cc b/chrome/browser/chromeos/drive/resource_entry_conversion.cc index 257abf8..6bae3d70 100644 --- a/chrome/browser/chromeos/drive/resource_entry_conversion.cc +++ b/chrome/browser/chromeos/drive/resource_entry_conversion.cc @@ -20,13 +20,13 @@ namespace drive { namespace { const char kSharedWithMeLabel[] = "shared-with-me"; +const char kSharedLabel[] = "shared"; -// Checks if |entry| has a label "shared-with-me", which is added to entries -// shared with the user. -bool HasSharedWithMeLabel(const google_apis::ResourceEntry& entry) { +// Checks if |entry| has a specified label. +bool HasLabel(const google_apis::ResourceEntry& entry, + const std::string& label) { std::vector<std::string>::const_iterator it = - std::find(entry.labels().begin(), entry.labels().end(), - kSharedWithMeLabel); + std::find(entry.labels().begin(), entry.labels().end(), label); return it != entry.labels().end(); } @@ -64,7 +64,8 @@ bool ConvertToResourceEntry(const google_apis::ResourceEntry& input, parent_resource_id = util::kDriveOtherDirLocalId; converted.set_deleted(input.deleted()); - converted.set_shared_with_me(HasSharedWithMeLabel(input)); + converted.set_shared_with_me(HasLabel(input, kSharedWithMeLabel)); + converted.set_shared(HasLabel(input, kSharedLabel)); PlatformFileInfoProto* file_info = converted.mutable_file_info(); diff --git a/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc b/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc index bd76db2..b0cbf28 100644 --- a/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc +++ b/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc @@ -36,6 +36,7 @@ TEST(ResourceEntryConversionTest, ConvertToResourceEntry_File) { EXPECT_FALSE(entry.deleted()); EXPECT_FALSE(entry.shared_with_me()); + EXPECT_FALSE(entry.shared()); base::Time expected_creation_time; base::Time expected_modified_time; @@ -112,6 +113,7 @@ TEST(ResourceEntryConversionTest, EXPECT_FALSE(entry.deleted()); EXPECT_FALSE(entry.shared_with_me()); + EXPECT_FALSE(entry.shared()); // 2011-12-12T23:28:52.783Z base::Time::Exploded exploded; @@ -193,6 +195,7 @@ TEST(ResourceEntryConversionTest, EXPECT_FALSE(entry.deleted()); EXPECT_FALSE(entry.shared_with_me()); + EXPECT_FALSE(entry.shared()); // 2011-04-01T18:34:08.234Z base::Time::Exploded exploded; @@ -264,6 +267,7 @@ TEST(ResourceEntryConversionTest, EXPECT_TRUE(entry.deleted()); // The document was deleted. EXPECT_FALSE(entry.shared_with_me()); + EXPECT_FALSE(entry.shared()); // 2012-04-10T22:50:55.797Z base::Time::Exploded exploded; @@ -334,6 +338,7 @@ TEST(ResourceEntryConversionTest, EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry, &parent_resource_id)); EXPECT_TRUE(entry.shared_with_me()); + EXPECT_TRUE(entry.shared()); } TEST(ResourceEntryConversionTest, ToPlatformFileInfo) { diff --git a/chrome/browser/chromeos/drive/resource_metadata_storage.cc b/chrome/browser/chromeos/drive/resource_metadata_storage.cc index 2fafe55..d4ea0ac 100644 --- a/chrome/browser/chromeos/drive/resource_metadata_storage.cc +++ b/chrome/browser/chromeos/drive/resource_metadata_storage.cc @@ -284,7 +284,7 @@ bool ResourceMetadataStorage::UpgradeOldDB( const ResourceIdCanonicalizer& id_canonicalizer) { base::ThreadRestrictions::AssertIOAllowed(); COMPILE_ASSERT( - kDBVersion == 11, + kDBVersion == 12, db_version_and_this_function_should_be_updated_at_the_same_time); const base::FilePath resource_map_path = @@ -357,7 +357,28 @@ bool ResourceMetadataStorage::UpgradeOldDB( batch.Put(GetHeaderDBKey(), serialized_header); return resource_map->Write(leveldb::WriteOptions(), &batch).ok(); + } else if (header.version() < 12) { // Cache and ID map entries are reusable. + leveldb::ReadOptions options; + options.verify_checksums = true; + scoped_ptr<leveldb::Iterator> it(resource_map->NewIterator(options)); + + leveldb::WriteBatch batch; + for (it->SeekToFirst(); it->Valid(); it->Next()) { + if (!IsCacheEntryKey(it->key()) && !IsIdEntryKey(it->key())) + batch.Delete(it->key()); + } + if (!it->status().ok()) + return false; + + // Put header with the latest version number. + std::string serialized_header; + if (!GetDefaultHeaderEntry().SerializeToString(&serialized_header)) + return false; + batch.Put(GetHeaderDBKey(), serialized_header); + + return resource_map->Write(leveldb::WriteOptions(), &batch).ok(); } + LOG(WARNING) << "Unexpected DB version: " << header.version(); return false; } diff --git a/chrome/browser/chromeos/drive/resource_metadata_storage.h b/chrome/browser/chromeos/drive/resource_metadata_storage.h index 6ab0159..49906be 100644 --- a/chrome/browser/chromeos/drive/resource_metadata_storage.h +++ b/chrome/browser/chromeos/drive/resource_metadata_storage.h @@ -37,7 +37,7 @@ class ResourceMetadataStorage { public: // This should be incremented when incompatibility change is made to DB // format. - static const int kDBVersion = 11; + static const int kDBVersion = 12; // Object to iterate over entries stored in this storage. class Iterator { diff --git a/chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc b/chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc index be97a90..7bf8f7c 100644 --- a/chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc +++ b/chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc @@ -402,6 +402,49 @@ TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M29) { EXPECT_TRUE(storage_->GetCacheEntry(id, &cache_entry)); } +TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M32) { + const int64 kLargestChangestamp = 1234567890; + const std::string resource_id = "abcd"; + const std::string local_id = "local-abcd"; + + // Construct M32 version DB. + SetDBVersion(11); + EXPECT_TRUE(storage_->SetLargestChangestamp(kLargestChangestamp)); + + leveldb::WriteBatch batch; + + // Put a file entry and its cache and id entry. + ResourceEntry entry; + std::string serialized_entry; + entry.set_resource_id(resource_id); + EXPECT_TRUE(entry.SerializeToString(&serialized_entry)); + batch.Put(local_id, serialized_entry); + + FileCacheEntry cache_entry; + EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); + batch.Put(local_id + '\0' + "CACHE", serialized_entry); + + batch.Put('\0' + std::string("ID") + '\0' + resource_id, local_id); + + EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); + + // Upgrade and reopen. + storage_.reset(); + EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB( + temp_dir_.path(), base::Bind(&util::CanonicalizeResourceId))); + storage_.reset(new ResourceMetadataStorage( + temp_dir_.path(), base::MessageLoopProxy::current().get())); + ASSERT_TRUE(storage_->Initialize()); + + // Data is erased, except cache and id mapping entries. + std::string id; + EXPECT_TRUE(storage_->GetIdByResourceId(resource_id, &id)); + EXPECT_EQ(local_id, id); + EXPECT_EQ(0, storage_->GetLargestChangestamp()); + EXPECT_FALSE(storage_->GetEntry(id, &entry)); + EXPECT_TRUE(storage_->GetCacheEntry(id, &cache_entry)); +} + TEST_F(ResourceMetadataStorageTest, IncompatibleDB_Unknown) { const int64 kLargestChangestamp = 1234567890; const std::string key1 = "abcd"; diff --git a/chrome/browser/drive/drive_api_service.cc b/chrome/browser/drive/drive_api_service.cc index ec7d25a..5f69e99 100644 --- a/chrome/browser/drive/drive_api_service.cc +++ b/chrome/browser/drive/drive_api_service.cc @@ -105,7 +105,7 @@ const char kFileResourceFields[] = "md5Checksum,fileSize,labels/trashed,imageMediaMetadata/width," "imageMediaMetadata/height,imageMediaMetadata/rotation,etag," "parents/parentLink,selfLink,thumbnailLink,alternateLink,embedLink," - "modifiedDate,lastViewedByMeDate"; + "modifiedDate,lastViewedByMeDate,shared"; const char kFileResourceOpenWithLinksFields[] = "kind,id,openWithLinks/*"; const char kFileListFields[] = @@ -113,13 +113,13 @@ const char kFileListFields[] = "mimeType,md5Checksum,fileSize,labels/trashed,imageMediaMetadata/width," "imageMediaMetadata/height,imageMediaMetadata/rotation,etag," "parents/parentLink,selfLink,thumbnailLink,alternateLink,embedLink," - "modifiedDate,lastViewedByMeDate),nextLink"; + "modifiedDate,lastViewedByMeDate,shared),nextLink"; const char kChangeListFields[] = "kind,items(file(kind,id,title,createdDate,sharedWithMeDate,downloadUrl," "mimeType,md5Checksum,fileSize,labels/trashed,imageMediaMetadata/width," "imageMediaMetadata/height,imageMediaMetadata/rotation,etag," "parents/parentLink,selfLink,thumbnailLink,alternateLink,embedLink," - "modifiedDate,lastViewedByMeDate),deleted,id,fileId),nextLink," + "modifiedDate,lastViewedByMeDate,shared),deleted,id,fileId),nextLink," "largestChangeId"; // Callback invoked when the parsing of resource list is completed, diff --git a/chrome/browser/drive/drive_api_util.cc b/chrome/browser/drive/drive_api_util.cc index de65402..dd3b182 100644 --- a/chrome/browser/drive/drive_api_util.cc +++ b/chrome/browser/drive/drive_api_util.cc @@ -312,12 +312,15 @@ scoped_ptr<google_apis::FileResource> ConvertResourceEntryToFileResource( file->set_created_date(entry.published_time()); if (std::find(entry.labels().begin(), entry.labels().end(), - "shared-with-me") == entry.labels().end()) { + "shared-with-me") != entry.labels().end()) { // Set current time to mark the file is shared_with_me, since ResourceEntry // doesn't have |shared_with_me_date| equivalent. file->set_shared_with_me_date(base::Time::Now()); } + file->set_shared(std::find(entry.labels().begin(), entry.labels().end(), + "shared") != entry.labels().end()); + file->set_download_url(entry.download_url()); if (entry.is_folder()) file->set_mime_type(kDriveFolderMimeType); @@ -411,12 +414,13 @@ ConvertFileResourceToResourceEntry( entry->set_kind(GetKind(file_resource)); entry->set_title(file_resource.title()); entry->set_published_time(file_resource.created_date()); - // TODO(kochi): entry->labels_ - if (!file_resource.shared_with_me_date().is_null()) { - std::vector<std::string> labels; + + std::vector<std::string> labels; + if (!file_resource.shared_with_me_date().is_null()) labels.push_back("shared-with-me"); - entry->set_labels(labels); - } + if (file_resource.shared()) + labels.push_back("shared"); + entry->set_labels(labels); // This should be the url to download the file_resource. { diff --git a/chrome/test/data/drive/changelist.json b/chrome/test/data/drive/changelist.json index dd449f9..009e45c 100644 --- a/chrome/test/data/drive/changelist.json +++ b/chrome/test/data/drive/changelist.json @@ -61,6 +61,7 @@ ], "lastModifyingUserName": "Test User", "editable": true, + "shared": false, "writersCanShare": true } }, @@ -118,6 +119,7 @@ ], "lastModifyingUserName": "Takayoshi Kochi", "editable": true, + "shared": true, "writersCanShare": true } }, @@ -169,6 +171,7 @@ ], "lastModifyingUserName": "Test User", "editable": true, + "shared": false, "writersCanShare": true } }, diff --git a/chrome/test/data/drive/filelist.json b/chrome/test/data/drive/filelist.json index 20752ea..c165bbc 100644 --- a/chrome/test/data/drive/filelist.json +++ b/chrome/test/data/drive/filelist.json @@ -60,6 +60,7 @@ ], "lastModifyingUserName": "Test User", "editable": true, + "shared": false, "writersCanShare": true }, { @@ -102,6 +103,7 @@ ], "lastModifyingUserName": "Test User", "editable": true, + "shared": true, "writersCanShare": true }, { @@ -145,6 +147,7 @@ ], "lastModifyingUserName": "Test User", "editable": true, + "shared": false, "writersCanShare": true } ] diff --git a/google_apis/drive/drive_api_parser.cc b/google_apis/drive/drive_api_parser.cc index c3cb669..4b05e8b 100644 --- a/google_apis/drive/drive_api_parser.cc +++ b/google_apis/drive/drive_api_parser.cc @@ -140,6 +140,7 @@ const char kWebContentLink[] = "webContentLink"; const char kOpenWithLinks[] = "openWithLinks"; const char kLabels[] = "labels"; const char kImageMediaMetadata[] = "imageMediaMetadata"; +const char kShared[] = "shared"; // These 5 flags are defined under |labels|. const char kLabelStarred[] = "starred"; const char kLabelHidden[] = "hidden"; @@ -423,7 +424,7 @@ bool ParentReference::Parse(const base::Value& value) { //////////////////////////////////////////////////////////////////////////////// // FileResource implementation -FileResource::FileResource() : file_size_(0) {} +FileResource::FileResource() : shared_(false), file_size_(0) {} FileResource::~FileResource() {} @@ -460,6 +461,7 @@ void FileResource::RegisterJSONConverter( kSharedWithMeDate, &FileResource::shared_with_me_date_, &util::GetTimeFromString); + converter->RegisterBoolField(kShared, &FileResource::shared_); converter->RegisterCustomField<GURL>(kDownloadUrl, &FileResource::download_url_, GetGURLFromString); diff --git a/google_apis/drive/drive_api_parser.h b/google_apis/drive/drive_api_parser.h index 1f7ddb8..2ee230d 100644 --- a/google_apis/drive/drive_api_parser.h +++ b/google_apis/drive/drive_api_parser.h @@ -525,6 +525,9 @@ class FileResource { return shared_with_me_date_; } + // Returns the 'shared' attribute of the file. + bool shared() const { return shared_; } + // Returns the short-lived download URL for the file. This field exists // only when the file content is stored in Drive. const GURL& download_url() const { return download_url_; } @@ -596,6 +599,9 @@ class FileResource { void set_shared_with_me_date(const base::Time& shared_with_me_date) { shared_with_me_date_ = shared_with_me_date; } + void set_shared(bool shared) { + shared_ = shared; + } void set_download_url(const GURL& download_url) { download_url_ = download_url; } @@ -645,6 +651,7 @@ class FileResource { base::Time modified_by_me_date_; base::Time last_viewed_by_me_date_; base::Time shared_with_me_date_; + bool shared_; GURL download_url_; std::string file_extension_; std::string md5_checksum_; diff --git a/google_apis/drive/drive_api_parser_unittest.cc b/google_apis/drive/drive_api_parser_unittest.cc index 4aae844..0960b27 100644 --- a/google_apis/drive/drive_api_parser_unittest.cc +++ b/google_apis/drive/drive_api_parser_unittest.cc @@ -149,6 +149,7 @@ TEST(DriveAPIParserTest, FileListParser) { EXPECT_FALSE(file1.labels().is_trashed()); EXPECT_FALSE(file1.labels().is_restricted()); EXPECT_TRUE(file1.labels().is_viewed()); + EXPECT_FALSE(file1.shared()); EXPECT_EQ(640, file1.image_media_metadata().width()); EXPECT_EQ(480, file1.image_media_metadata().height()); @@ -201,6 +202,7 @@ TEST(DriveAPIParserTest, FileListParser) { EXPECT_TRUE(file2.labels().is_trashed()); EXPECT_TRUE(file2.labels().is_restricted()); EXPECT_TRUE(file2.labels().is_viewed()); + EXPECT_TRUE(file2.shared()); EXPECT_EQ(-1, file2.image_media_metadata().width()); EXPECT_EQ(-1, file2.image_media_metadata().height()); @@ -230,6 +232,7 @@ TEST(DriveAPIParserTest, FileListParser) { EXPECT_EQ("TestFolder", file3.title()); EXPECT_EQ("application/vnd.google-apps.folder", file3.mime_type()); ASSERT_TRUE(file3.IsDirectory()); + EXPECT_FALSE(file3.shared()); ASSERT_EQ(1U, file3.parents().size()); EXPECT_EQ("0AIv7G8yEYAWHUk9ABC", file3.parents()[0]->file_id()); @@ -262,18 +265,21 @@ TEST(DriveAPIParserTest, ChangeListParser) { EXPECT_FALSE(change1.is_deleted()); EXPECT_EQ("1Pc8jzfU1ErbN_eucMMqdqzY3eBm0v8sxXm_1CtLxABC", change1.file_id()); EXPECT_EQ(change1.file_id(), change1.file()->file_id()); + EXPECT_FALSE(change1.file()->shared()); const ChangeResource& change2 = *changelist->items()[1]; EXPECT_EQ(8424, change2.change_id()); EXPECT_FALSE(change2.is_deleted()); EXPECT_EQ("0B4v7G8yEYAWHUmRrU2lMS2hLABC", change2.file_id()); EXPECT_EQ(change2.file_id(), change2.file()->file_id()); + EXPECT_TRUE(change2.file()->shared()); const ChangeResource& change3 = *changelist->items()[2]; EXPECT_EQ(8429, change3.change_id()); EXPECT_FALSE(change3.is_deleted()); EXPECT_EQ("0B4v7G8yEYAWHYW1OcExsUVZLABC", change3.file_id()); EXPECT_EQ(change3.file_id(), change3.file()->file_id()); + EXPECT_FALSE(change3.file()->shared()); // Deleted entry. const ChangeResource& change4 = *changelist->items()[3]; |