Chromium Code Reviews| Index: chrome/browser/chromeos/drive/file_change.cc |
| diff --git a/chrome/browser/chromeos/drive/file_change.cc b/chrome/browser/chromeos/drive/file_change.cc |
| index cc3c9aaf30107e95901c1ab9d9ff8a3587c1c5bb..fa1d554dcb4f8e150ee12b86e7e215ee4d46e63f 100644 |
| --- a/chrome/browser/chromeos/drive/file_change.cc |
| +++ b/chrome/browser/chromeos/drive/file_change.cc |
| @@ -4,20 +4,154 @@ |
| #include "chrome/browser/chromeos/drive/file_change.h" |
| +#include <sstream> |
| + |
| +#include "base/logging.h" |
| +#include "base/strings/stringprintf.h" |
| +#include "chrome/browser/chromeos/drive/drive.pb.h" |
| + |
| namespace drive { |
| -FileChange::FileChange(const base::FilePath& path, Type type) |
| - : path_(path), type_(type) { |
| +FileChange::Change::Change(ChangeType change, FileType file_type) |
| + : change_(change), file_type_(file_type) { |
| +} |
| + |
| +std::string FileChange::Change::DebugString() const { |
| + const char* change_string = NULL; |
| + switch (change()) { |
| + case ADD_OR_UPDATE: |
| + change_string = "ADD_OR_UPDATE"; |
| + break; |
| + case DELETE: |
| + change_string = "DELETE"; |
| + break; |
| + } |
| + const char* type_string = "UNKNOWN"; |
| + switch (file_type()) { |
| + case FileChange::FILE_TYPE_FILE: |
| + type_string = "FILE"; |
| + break; |
| + case FileChange::FILE_TYPE_DIRECTORY: |
| + type_string = "DIRECTORY"; |
| + break; |
| + case FILE_TYPE_UNKNOWN: |
| + // Keeps it as "unknown". |
| + break; |
| + } |
| + return base::StringPrintf("%s:%s", change_string, type_string); |
| +} |
| + |
| +FileChange::ChangeList::ChangeList() { |
| +} |
| +FileChange::ChangeList::~ChangeList() { |
| +} |
| + |
| +void FileChange::ChangeList::Update(const Change& new_change) { |
| + if (list_.empty()) { |
| + list_.push_back(new_change); |
| + return; |
| + } |
| + |
| + Change& last = list_.back(); |
| + if (last.IsFile() != new_change.IsFile()) { |
| + list_.push_back(new_change); |
| + return; |
| + } |
| + |
| + if (last.change() == new_change.change()) |
| + return; |
| + |
| + // ADD + DELETE on directory -> revert |
| + if (!last.IsFile() && last.IsAddOrUpdate() && new_change.IsDelete()) { |
| + list_.pop_back(); |
| + return; |
| + } |
| + |
| + // DELETE + ADD/UPDATE -> ADD/UPDATE |
| + // ADD/UPDATE + DELETE -> DELETE |
| + last = new_change; |
| +} |
| + |
| +FileChange::ChangeList FileChange::ChangeList::PopAndGetNewList() const { |
| + ChangeList changes; |
| + changes.list_ = this->list_; |
| + changes.list_.pop_front(); |
| + return changes; |
| } |
| +std::string FileChange::ChangeList::DebugString() const { |
| + std::ostringstream ss; |
| + ss << "{ "; |
| + for (size_t i = 0; i < list_.size(); ++i) |
| + ss << list_[i].ToString() << ", "; |
| + ss << "}"; |
| + return ss.str(); |
| +} |
| + |
| +FileChange::FileChange() { |
| +} |
| FileChange::~FileChange() {} |
| -// static |
| -FileChangeSet FileChange::CreateSingleSet(const base::FilePath& path, |
| - Type type) { |
| - FileChangeSet result; |
| - result.insert(FileChange(path, type)); |
| - return result; |
| +void FileChange::Update(const base::FilePath file_path, |
| + const FileChange::Change& new_change) { |
| + map_[file_path].Update(new_change); |
| +} |
| + |
| +void FileChange::Update(const base::FilePath file_path, |
| + const FileChange::ChangeList& new_change) { |
| + Map::iterator change = map_.find(file_path); |
| + if (change == map_.end()) { |
| + map_.insert(std::make_pair(file_path, new_change)); |
| + return; |
| + } |
| + |
| + for (ChangeList::List::const_iterator it = new_change.list().begin(); |
| + it != new_change.list().end(); |
| + it++) { |
| + map_[file_path].Update(*it); |
| + } |
| +} |
| + |
| +void FileChange::Update(const base::FilePath file_path, |
| + FileType file_type, |
| + FileChange::ChangeType change) { |
| + Update(file_path, FileChange::Change(change, file_type)); |
| +} |
| + |
| +void FileChange::Update(const base::FilePath file_path, |
| + const ResourceEntry& entry, |
| + FileChange::ChangeType change) { |
| + FileType type = |
| + entry.file_info().is_directory() ? FILE_TYPE_DIRECTORY : FILE_TYPE_FILE; |
|
kinaba
2014/06/23 05:37:43
As far as I remember, in entry.deleted() case, the
yoshiki
2014/06/24 02:02:22
Done.
|
| + Update(file_path, type, change); |
| +} |
| + |
| +void FileChange::Apply(const FileChange& new_changed_files) { |
| + for (Map::const_iterator it = new_changed_files.map().begin(); |
| + it != new_changed_files.map().end(); |
| + it++) { |
| + Update(it->first, it->second); |
| + } |
| +} |
| + |
| +size_t FileChange::CountDirectory(const base::FilePath& directory_path) const { |
| + size_t count = 0; |
| + for (Map::const_iterator it = map_.begin(); it != map_.end(); it++) { |
| + if (it->first.DirName() == directory_path) |
| + count++; |
| + } |
| + return count; |
| +} |
| + |
| +std::string FileChange::DebugString() const { |
| + std::ostringstream ss; |
| + ss << "{ "; |
| + for (FileChange::Map::const_iterator it = map_.begin(); it != map_.end(); |
| + it++) { |
| + ss << it->first.value() << ": " << it->second.DebugString() << ", "; |
| + } |
| + ss << "}"; |
| + return ss.str(); |
| } |
| } // namespace drive |