Index: chrome/browser/chromeos/drive/drive_resource_metadata.cc |
diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata.cc b/chrome/browser/chromeos/drive/drive_resource_metadata.cc |
index 461ddcd6c7709069ba5d2858e409f7cc8dbcfe94..7930c7f148109bcfe9ac6da2c5a1a13c460b6184 100644 |
--- a/chrome/browser/chromeos/drive/drive_resource_metadata.cc |
+++ b/chrome/browser/chromeos/drive/drive_resource_metadata.cc |
@@ -293,14 +293,33 @@ DriveFileError DriveResourceMetadata::InitializeOnBlockingPool() { |
true /* recursive */); |
} |
- // Initialize the root entry. |
- if (!storage_->GetEntry(root_resource_id_)) { |
+ // Initialize the grand root and "other" entries. "/drive" and "/drive/other". |
+ // As an intermediate change, "/drive/root" is also added here. |
+ // TODO(haruki): Move this initialization to change_list_loader where we |
+ // can retrieve the root folder ID from the server. |
+ if (!storage_->GetEntry(util::kDriveGrandRootSpecialResourceId)) { |
DriveEntryProto root; |
root.mutable_file_info()->set_is_directory(true); |
- root.set_resource_id(root_resource_id_); |
+ root.set_resource_id(util::kDriveGrandRootSpecialResourceId); |
root.set_title(util::kDriveGrandRootDirName); |
storage_->PutEntry(CreateEntryWithProperBaseName(root)); |
} |
+ if (!storage_->GetEntry(util::kDriveOtherDirSpecialResourceId)) { |
+ DriveEntryProto other_dir; |
+ other_dir.mutable_file_info()->set_is_directory(true); |
+ other_dir.set_resource_id(util::kDriveOtherDirSpecialResourceId); |
+ other_dir.set_parent_resource_id(util::kDriveGrandRootSpecialResourceId); |
+ other_dir.set_title(util::kDriveOtherDirName); |
+ AddEntryToDirectory(other_dir); |
+ } |
+ if (!storage_->GetEntry(root_resource_id_)) { |
+ DriveEntryProto mydrive_root; |
+ mydrive_root.mutable_file_info()->set_is_directory(true); |
+ mydrive_root.set_resource_id(root_resource_id_); |
+ mydrive_root.set_parent_resource_id(util::kDriveGrandRootSpecialResourceId); |
+ mydrive_root.set_title(util::kDriveMyDriveRootDirName); |
+ AddEntryToDirectory(mydrive_root); |
+ } |
return DRIVE_FILE_OK; |
} |
@@ -312,7 +331,8 @@ void DriveResourceMetadata::DestroyOnBlockingPool() { |
void DriveResourceMetadata::ResetOnBlockingPool() { |
DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
- RemoveDirectoryChildren(root_resource_id_); |
+ RemoveDirectoryChildren(util::kDriveGrandRootSpecialResourceId); |
+ InitializeOnBlockingPool(); |
last_serialized_ = base::Time(); |
serialized_size_ = 0; |
storage_->SetLargestChangestamp(0); |
@@ -599,8 +619,8 @@ DriveResourceMetadata::RemoveEntryOnBlockingPool( |
const std::string& resource_id) { |
DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
- // Disallow deletion of root. |
- if (resource_id == root_resource_id_) |
+ // Disallow deletion of special entries "/drive" and "/drive/other". |
+ if (util::IsSpecialResourceId(resource_id)) |
return FileMoveResult(DRIVE_FILE_ERROR_ACCESS_DENIED); |
scoped_ptr<DriveEntryProto> entry = storage_->GetEntry(resource_id); |
@@ -616,7 +636,7 @@ scoped_ptr<DriveEntryProto> DriveResourceMetadata::FindEntryByPathSync( |
const base::FilePath& file_path) { |
DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
scoped_ptr<DriveEntryProto> current_dir = |
- storage_->GetEntry(root_resource_id_); |
+ storage_->GetEntry(util::kDriveGrandRootSpecialResourceId); |
DCHECK(current_dir); |
if (file_path == GetFilePath(current_dir->resource_id())) |
@@ -733,7 +753,7 @@ DriveResourceMetadata::RefreshEntryOnBlockingPool( |
} |
// Update data. |
- if (entry->resource_id() != root_resource_id_) { |
+ if (!util::IsSpecialResourceId(entry->resource_id())) { |
scoped_ptr<DriveEntryProto> new_parent = |
GetDirectory(entry_proto.parent_resource_id()); |
@@ -898,7 +918,8 @@ void DriveResourceMetadata::GetDescendantDirectoryPaths( |
void DriveResourceMetadata::RemoveAllOnBlockingPool() { |
DCHECK(blocking_task_runner_->RunsTasksOnCurrentThread()); |
- RemoveDirectoryChildren(root_resource_id_); |
+ RemoveDirectoryChildren(util::kDriveGrandRootSpecialResourceId); |
+ InitializeOnBlockingPool(); |
} |
void DriveResourceMetadata::MaybeSaveOnBlockingPool() { |
@@ -911,7 +932,8 @@ void DriveResourceMetadata::MaybeSaveOnBlockingPool() { |
const base::FilePath path = data_directory_path_.Append(kProtoFileName); |
DriveRootDirectoryProto proto; |
- DirectoryToProto(root_resource_id_, proto.mutable_drive_directory()); |
+ DirectoryToProto(util::kDriveGrandRootSpecialResourceId, |
+ proto.mutable_drive_directory()); |
proto.set_largest_changestamp(storage_->GetLargestChangestamp()); |
proto.set_version(kProtoVersion); |
@@ -1052,7 +1074,9 @@ void DriveResourceMetadata::AddDescendantsFromProto( |
#if !defined(NDEBUG) |
std::vector<std::string> children; |
storage_->GetChildren(proto.drive_entry().resource_id(), &children); |
- DCHECK(children.empty()); |
+ DCHECK(proto.drive_entry().resource_id() == |
+ util::kDriveGrandRootSpecialResourceId || |
+ children.empty()); |
#endif |
// Add child files. |
@@ -1161,7 +1185,7 @@ bool DriveResourceMetadata::ParseFromString( |
} |
if (proto.drive_directory().drive_entry().resource_id() != |
- root_resource_id_) { |
+ util::kDriveGrandRootSpecialResourceId) { |
LOG(ERROR) << "Incompatible proto detected (incompatible root ID): " |
<< proto.drive_directory().drive_entry().resource_id(); |
return false; |