Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / drive / file_change.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILE_CHANGE_H_
6 #define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_CHANGE_H_
7
8 #include <deque>
9 #include <map>
10 #include <string>
11
12 #include "base/basictypes.h"
13 #include "base/files/file_path.h"
14 #include "webkit/browser/fileapi/file_system_url.h"
15
16 namespace drive {
17 class ResourceEntry;
18
19 class FileChange {
20  public:
21   enum FileType {
22     FILE_TYPE_UNKNOWN,
23     FILE_TYPE_FILE,
24     FILE_TYPE_DIRECTORY,
25   };
26
27   enum ChangeType {
28     ADD_OR_UPDATE,
29     DELETE,
30   };
31
32   class Change {
33    public:
34     Change(ChangeType change, FileType file_type);
35
36     bool IsAddOrUpdate() const { return change_ == ADD_OR_UPDATE; }
37     bool IsDelete() const { return change_ == DELETE; }
38
39     bool IsFile() const { return file_type_ == FILE_TYPE_FILE; }
40     bool IsDirectory() const { return file_type_ == FILE_TYPE_DIRECTORY; }
41     bool IsTypeUnknown() const { return !IsFile() && !IsDirectory(); }
42
43     ChangeType change() const { return change_; }
44     FileType file_type() const { return file_type_; }
45
46     std::string DebugString() const;
47
48     bool operator==(const Change& that) const {
49       return change() == that.change() && file_type() == that.file_type();
50     }
51
52    private:
53     ChangeType change_;
54     FileType file_type_;
55   };
56
57   class ChangeList {
58    public:
59     typedef std::deque<Change> List;
60
61     ChangeList();
62     ~ChangeList();
63
64     // Updates the list with the |new_change|.
65     void Update(const Change& new_change);
66
67     size_t size() const { return list_.size(); }
68     bool empty() const { return list_.empty(); }
69     void clear() { list_.clear(); }
70     const List& list() const { return list_; }
71     const Change& front() const { return list_.front(); }
72     const Change& back() const { return list_.back(); }
73
74     ChangeList PopAndGetNewList() const;
75
76     std::string DebugString() const;
77
78    private:
79     List list_;
80   };
81
82  public:
83   typedef std::map<base::FilePath, FileChange::ChangeList> Map;
84
85   FileChange();
86   ~FileChange();
87
88   void Update(const base::FilePath file_path,
89               const FileChange::Change& new_change);
90   void Update(const base::FilePath file_path,
91               const FileChange::ChangeList& list);
92   void Update(const base::FilePath file_path,
93               FileType type,
94               FileChange::ChangeType change);
95   void Update(const base::FilePath file_path,
96               const ResourceEntry& entry,
97               FileChange::ChangeType change);
98   void Apply(const FileChange& new_changed_files);
99
100   const Map& map() const { return map_; }
101
102   size_t size() const { return map_.size(); }
103   bool empty() const { return map_.empty(); }
104   void ClearForTest() { map_.clear(); }
105   size_t CountDirectory(const base::FilePath& directory_path) const;
106   size_t count(const base::FilePath& file_path) const {
107     return map_.count(file_path);
108   }
109
110   std::string DebugString() const;
111
112  private:
113   Map map_;
114 };
115
116 }  // namespace drive
117
118 #endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_CHANGE_H_