summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/drive/resource_entry_conversion.cc13
-rw-r--r--chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc5
-rw-r--r--chrome/browser/chromeos/drive/resource_metadata_storage.cc23
-rw-r--r--chrome/browser/chromeos/drive/resource_metadata_storage.h2
-rw-r--r--chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc43
-rw-r--r--chrome/browser/drive/drive_api_service.cc6
-rw-r--r--chrome/browser/drive/drive_api_util.cc16
-rw-r--r--chrome/test/data/drive/changelist.json3
-rw-r--r--chrome/test/data/drive/filelist.json3
-rw-r--r--google_apis/drive/drive_api_parser.cc4
-rw-r--r--google_apis/drive/drive_api_parser.h7
-rw-r--r--google_apis/drive/drive_api_parser_unittest.cc6
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];