Commit f88a8d8d authored by achuith@chromium.org's avatar achuith@chromium.org

child_files_ and child_directories_ have resource_ids instead of GDataFile* and GDataDirectory*.

* GDataFileCollection and GDataDirectoryCollection are replaced by GDataChildMap which has resource_id as value instead of GDataFile* and GDataDirectory*.
* FindChild returns a resource_id instead of GDataEntry*
* Get rid of AddChild as it's only being used in one place.
* TakeOverEntries return type is now void instead of bool.
* Add helper TakeOverEntry to avoid cut n paste.

BUG=137725
TEST=unit tests.
Review URL: https://chromiumcodereview.appspot.com/10855243

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152415 0039d316-1c4b-4281-b951-d872f2087c98
parent dca17924
...@@ -300,10 +300,13 @@ GDataEntry* GDataDirectoryService::FindEntryByPathSync( ...@@ -300,10 +300,13 @@ GDataEntry* GDataDirectoryService::FindEntryByPathSync(
GDataDirectory* current_dir = root_.get(); GDataDirectory* current_dir = root_.get();
for (size_t i = 1; i < components.size() && current_dir; ++i) { for (size_t i = 1; i < components.size() && current_dir; ++i) {
GDataEntry* entry = current_dir->FindChild(components[i]); std::string resource_id = current_dir->FindChild(components[i]);
if (!entry) if (resource_id.empty())
return NULL; return NULL;
GDataEntry* entry = GetEntryByResourceId(resource_id);
DCHECK(entry);
if (i == components.size() - 1) // Last component. if (i == components.size() - 1) // Last component.
return entry; return entry;
else else
...@@ -313,9 +316,9 @@ GDataEntry* GDataDirectoryService::FindEntryByPathSync( ...@@ -313,9 +316,9 @@ GDataEntry* GDataDirectoryService::FindEntryByPathSync(
} }
GDataEntry* GDataDirectoryService::GetEntryByResourceId( GDataEntry* GDataDirectoryService::GetEntryByResourceId(
const std::string& resource) { const std::string& resource_id) {
// GDataFileSystem has already locked. DCHECK(!resource_id.empty());
ResourceMap::const_iterator iter = resource_map_.find(resource); ResourceMap::const_iterator iter = resource_map_.find(resource_id);
return iter == resource_map_.end() ? NULL : iter->second; return iter == resource_map_.end() ? NULL : iter->second;
} }
......
...@@ -217,7 +217,7 @@ void GDataDirectory::AddEntry(GDataEntry* entry) { ...@@ -217,7 +217,7 @@ void GDataDirectory::AddEntry(GDataEntry* entry) {
FilePath full_file_name(entry->base_name()); FilePath full_file_name(entry->base_name());
const std::string extension = full_file_name.Extension(); const std::string extension = full_file_name.Extension();
const std::string file_name = full_file_name.RemoveExtension().value(); const std::string file_name = full_file_name.RemoveExtension().value();
while (FindChild(full_file_name.value())) { while (!FindChild(full_file_name.value()).empty()) {
if (!extension.empty()) { if (!extension.empty()) {
full_file_name = FilePath(base::StringPrintf("%s (%d)%s", full_file_name = FilePath(base::StringPrintf("%s (%d)%s",
file_name.c_str(), file_name.c_str(),
...@@ -240,30 +240,36 @@ void GDataDirectory::AddEntry(GDataEntry* entry) { ...@@ -240,30 +240,36 @@ void GDataDirectory::AddEntry(GDataEntry* entry) {
directory_service_->AddEntryToResourceMap(entry); directory_service_->AddEntryToResourceMap(entry);
// Setup child and parent links. // Setup child and parent links.
AddChild(entry); if (entry->AsGDataFile())
child_files_.insert(std::make_pair(entry->base_name(),
entry->resource_id()));
if (entry->AsGDataDirectory())
child_directories_.insert(std::make_pair(entry->base_name(),
entry->resource_id()));
entry->SetParent(this); entry->SetParent(this);
} }
bool GDataDirectory::TakeOverEntries(GDataDirectory* dir) { void GDataDirectory::TakeOverEntries(GDataDirectory* dir) {
for (GDataFileCollection::const_iterator iter = dir->child_files_.begin(); for (GDataChildMap::const_iterator iter = dir->child_files_.begin();
iter != dir->child_files_.end(); ++iter) { iter != dir->child_files_.end(); ++iter) {
GDataEntry* entry = iter->second; TakeOverEntry(iter->second);
directory_service_->RemoveEntryFromResourceMap(entry->resource_id());
entry->SetParent(NULL);
AddEntry(entry);
} }
dir->child_files_.clear(); dir->child_files_.clear();
for (GDataDirectoryCollection::iterator iter = for (GDataChildMap::iterator iter = dir->child_directories_.begin();
dir->child_directories_.begin();
iter != dir->child_directories_.end(); ++iter) { iter != dir->child_directories_.end(); ++iter) {
GDataEntry* entry = iter->second; TakeOverEntry(iter->second);
directory_service_->RemoveEntryFromResourceMap(entry->resource_id());
entry->SetParent(NULL);
AddEntry(entry);
} }
dir->child_directories_.clear(); dir->child_directories_.clear();
return true; }
void GDataDirectory::TakeOverEntry(const std::string& resource_id) {
GDataEntry* entry = directory_service_->GetEntryByResourceId(resource_id);
DCHECK(entry);
directory_service_->RemoveEntryFromResourceMap(resource_id);
entry->SetParent(NULL);
AddEntry(entry);
} }
void GDataDirectory::RemoveEntry(GDataEntry* entry) { void GDataDirectory::RemoveEntry(GDataEntry* entry) {
...@@ -273,30 +279,17 @@ void GDataDirectory::RemoveEntry(GDataEntry* entry) { ...@@ -273,30 +279,17 @@ void GDataDirectory::RemoveEntry(GDataEntry* entry) {
delete entry; delete entry;
} }
GDataEntry* GDataDirectory::FindChild( std::string GDataDirectory::FindChild(
const FilePath::StringType& file_name) const { const FilePath::StringType& file_name) const {
GDataFileCollection::const_iterator iter = child_files_.find(file_name); GDataChildMap::const_iterator iter = child_files_.find(file_name);
if (iter != child_files_.end()) if (iter != child_files_.end())
return iter->second; return iter->second;
GDataDirectoryCollection::const_iterator itd = iter = child_directories_.find(file_name);
child_directories_.find(file_name); if (iter != child_directories_.end())
if (itd != child_directories_.end()) return iter->second;
return itd->second;
return NULL;
}
void GDataDirectory::AddChild(GDataEntry* entry) {
DCHECK(entry);
if (entry->AsGDataFile())
child_files_.insert(std::make_pair(entry->base_name(),
entry->AsGDataFile()));
if (entry->AsGDataDirectory()) return std::string();
child_directories_.insert(std::make_pair(entry->base_name(),
entry->AsGDataDirectory()));
} }
void GDataDirectory::RemoveChild(GDataEntry* entry) { void GDataDirectory::RemoveChild(GDataEntry* entry) {
...@@ -304,7 +297,7 @@ void GDataDirectory::RemoveChild(GDataEntry* entry) { ...@@ -304,7 +297,7 @@ void GDataDirectory::RemoveChild(GDataEntry* entry) {
const std::string& base_name(entry->base_name()); const std::string& base_name(entry->base_name());
// entry must be present in this directory. // entry must be present in this directory.
DCHECK_EQ(entry, FindChild(base_name)); DCHECK_EQ(entry->resource_id(), FindChild(base_name));
// Remove entry from resource map first. // Remove entry from resource map first.
directory_service_->RemoveEntryFromResourceMap(entry->resource_id()); directory_service_->RemoveEntryFromResourceMap(entry->resource_id());
...@@ -322,32 +315,38 @@ void GDataDirectory::RemoveChildren() { ...@@ -322,32 +315,38 @@ void GDataDirectory::RemoveChildren() {
void GDataDirectory::RemoveChildFiles() { void GDataDirectory::RemoveChildFiles() {
DVLOG(1) << "RemoveChildFiles " << resource_id(); DVLOG(1) << "RemoveChildFiles " << resource_id();
for (GDataFileCollection::const_iterator iter = child_files_.begin(); for (GDataChildMap::const_iterator iter = child_files_.begin();
iter != child_files_.end(); ++iter) { iter != child_files_.end(); ++iter) {
directory_service_->RemoveEntryFromResourceMap(iter->second->resource_id()); GDataEntry* child = directory_service_->GetEntryByResourceId(iter->second);
DCHECK(child);
directory_service_->RemoveEntryFromResourceMap(iter->second);
delete child;
} }
STLDeleteValues(&child_files_);
child_files_.clear(); child_files_.clear();
} }
void GDataDirectory::RemoveChildDirectories() { void GDataDirectory::RemoveChildDirectories() {
for (GDataDirectoryCollection::iterator iter = child_directories_.begin(); for (GDataChildMap::iterator iter = child_directories_.begin();
iter != child_directories_.end(); ++iter) { iter != child_directories_.end(); ++iter) {
GDataDirectory* dir = iter->second; GDataDirectory* dir = directory_service_->GetEntryByResourceId(
iter->second)->AsGDataDirectory();
DCHECK(dir);
// Remove directories recursively. // Remove directories recursively.
dir->RemoveChildren(); dir->RemoveChildren();
directory_service_->RemoveEntryFromResourceMap(dir->resource_id()); directory_service_->RemoveEntryFromResourceMap(iter->second);
delete dir;
} }
STLDeleteValues(&child_directories_);
child_directories_.clear(); child_directories_.clear();
} }
void GDataDirectory::GetChildDirectoryPaths(std::set<FilePath>* child_dirs) { void GDataDirectory::GetChildDirectoryPaths(std::set<FilePath>* child_dirs) {
for (GDataDirectoryCollection::const_iterator it = child_directories_.begin(); for (GDataChildMap::const_iterator iter = child_directories_.begin();
it != child_directories_.end(); ++it) { iter != child_directories_.end(); ++iter) {
GDataDirectory* child_dir = it->second; GDataDirectory* dir = directory_service_->GetEntryByResourceId(
child_dirs->insert(child_dir->GetFilePath()); iter->second)->AsGDataDirectory();
child_dir->GetChildDirectoryPaths(child_dirs); DCHECK(dir);
child_dirs->insert(dir->GetFilePath());
dir->GetChildDirectoryPaths(child_dirs);
} }
} }
...@@ -470,33 +469,35 @@ void GDataDirectory::ToProto(GDataDirectoryProto* proto) const { ...@@ -470,33 +469,35 @@ void GDataDirectory::ToProto(GDataDirectoryProto* proto) const {
GDataEntry::ToProto(proto->mutable_gdata_entry()); GDataEntry::ToProto(proto->mutable_gdata_entry());
DCHECK(proto->gdata_entry().file_info().is_directory()); DCHECK(proto->gdata_entry().file_info().is_directory());
for (GDataFileCollection::const_iterator iter = child_files_.begin(); for (GDataChildMap::const_iterator iter = child_files_.begin();
iter != child_files_.end(); ++iter) { iter != child_files_.end(); ++iter) {
GDataFile* file = iter->second; GDataFile* file = directory_service_->GetEntryByResourceId(
iter->second)->AsGDataFile();
DCHECK(file);
file->ToProto(proto->add_child_files()); file->ToProto(proto->add_child_files());
} }
for (GDataDirectoryCollection::const_iterator iter = for (GDataChildMap::const_iterator iter = child_directories_.begin();
child_directories_.begin();
iter != child_directories_.end(); ++iter) { iter != child_directories_.end(); ++iter) {
GDataDirectory* dir = iter->second; GDataDirectory* dir = directory_service_->GetEntryByResourceId(
iter->second)->AsGDataDirectory();
DCHECK(dir);
dir->ToProto(proto->add_child_directories()); dir->ToProto(proto->add_child_directories());
} }
} }
scoped_ptr<GDataEntryProtoVector> GDataDirectory::ToProtoVector() const { scoped_ptr<GDataEntryProtoVector> GDataDirectory::ToProtoVector() const {
scoped_ptr<GDataEntryProtoVector> entries(new GDataEntryProtoVector); scoped_ptr<GDataEntryProtoVector> entries(new GDataEntryProtoVector);
for (GDataFileCollection::const_iterator iter = child_files_.begin(); // Use ToProtoFull, as we don't want to include children in |proto|.
for (GDataChildMap::const_iterator iter = child_files_.begin();
iter != child_files_.end(); ++iter) { iter != child_files_.end(); ++iter) {
GDataEntryProto proto; GDataEntryProto proto;
iter->second->ToProto(&proto); directory_service_->GetEntryByResourceId(iter->second)->ToProtoFull(&proto);
entries->push_back(proto); entries->push_back(proto);
} }
for (GDataDirectoryCollection::const_iterator iter = for (GDataChildMap::const_iterator iter = child_directories_.begin();
child_directories_.begin();
iter != child_directories_.end(); ++iter) { iter != child_directories_.end(); ++iter) {
GDataEntryProto proto; GDataEntryProto proto;
// Convert to GDataEntry, as we don't want to include children in |proto|. directory_service_->GetEntryByResourceId(iter->second)->ToProtoFull(&proto);
static_cast<const GDataEntry*>(iter->second)->ToProtoFull(&proto);
entries->push_back(proto); entries->push_back(proto);
} }
......
...@@ -252,14 +252,15 @@ class GDataDirectory : public GDataEntry { ...@@ -252,14 +252,15 @@ class GDataDirectory : public GDataEntry {
// Takes over all entries from |dir|. // Takes over all entries from |dir|.
// TODO(satorux): Remove this. crbug.com/139649 // TODO(satorux): Remove this. crbug.com/139649
bool TakeOverEntries(GDataDirectory* dir); void TakeOverEntries(GDataDirectory* dir);
// Find a child by its name. // Takes over entry represented by |resource_id|. Helper function for
// TODO(satorux): Remove this. crbug.com/139649 // TakeOverEntries. TODO(satorux): Remove this. crbug.com/139649
GDataEntry* FindChild(const FilePath::StringType& file_name) const; void TakeOverEntry(const std::string& resource_id);
// Add |entry| to children. // Find a child's resource_id by its name. Returns the empty string if not
void AddChild(GDataEntry* entry); // found. TODO(satorux): Remove this. crbug.com/139649
std::string FindChild(const FilePath::StringType& file_name) const;
// Removes the entry from its children without destroying the // Removes the entry from its children without destroying the
// entry instance. // entry instance.
...@@ -273,13 +274,11 @@ class GDataDirectory : public GDataEntry { ...@@ -273,13 +274,11 @@ class GDataDirectory : public GDataEntry {
// Recursively extracts the paths set of all sub-directories. // Recursively extracts the paths set of all sub-directories.
void GetChildDirectoryPaths(std::set<FilePath>* child_dirs); void GetChildDirectoryPaths(std::set<FilePath>* child_dirs);
// Maps between base_name and resource_id of files and directories. // Map between base_name and resource_id of files and directories.
typedef std::map<FilePath::StringType, GDataFile*> GDataFileCollection; typedef std::map<FilePath::StringType, std::string> GDataChildMap;
typedef std::map<FilePath::StringType, GDataDirectory*>
GDataDirectoryCollection;
// Collection of children. // Collection of children.
GDataFileCollection child_files_; GDataChildMap child_files_;
GDataDirectoryCollection child_directories_; GDataChildMap child_directories_;
DISALLOW_COPY_AND_ASSIGN(GDataDirectory); DISALLOW_COPY_AND_ASSIGN(GDataDirectory);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment