15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILE_CHANGE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_CHANGE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <deque>
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <map>
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/basictypes.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive {
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ResourceEntry;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileChange {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  enum FileType {
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FILE_TYPE_UNKNOWN,
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FILE_TYPE_FILE,
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FILE_TYPE_DIRECTORY,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  enum ChangeType {
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ADD_OR_UPDATE,
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DELETE,
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class Change {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   public:
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Change(ChangeType change, FileType file_type);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool IsAddOrUpdate() const { return change_ == ADD_OR_UPDATE; }
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool IsDelete() const { return change_ == DELETE; }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool IsFile() const { return file_type_ == FILE_TYPE_FILE; }
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool IsDirectory() const { return file_type_ == FILE_TYPE_DIRECTORY; }
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool IsTypeUnknown() const { return !IsFile() && !IsDirectory(); }
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ChangeType change() const { return change_; }
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FileType file_type() const { return file_type_; }
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string DebugString() const;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool operator==(const Change& that) const {
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return change() == that.change() && file_type() == that.file_type();
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   private:
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ChangeType change_;
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FileType file_type_;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class ChangeList {
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   public:
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    typedef std::deque<Change> List;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ChangeList();
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ~ChangeList();
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Updates the list with the |new_change|.
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void Update(const Change& new_change);
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    size_t size() const { return list_.size(); }
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool empty() const { return list_.empty(); }
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void clear() { list_.clear(); }
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const List& list() const { return list_; }
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const Change& front() const { return list_.front(); }
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const Change& back() const { return list_.back(); }
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ChangeList PopAndGetNewList() const;
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string DebugString() const;
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   private:
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    List list_;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef std::map<base::FilePath, FileChange::ChangeList> Map;
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange();
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~FileChange();
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Update(const base::FilePath file_path,
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              const FileChange::Change& new_change);
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Update(const base::FilePath file_path,
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              const FileChange::ChangeList& list);
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Update(const base::FilePath file_path,
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              FileType type,
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              FileChange::ChangeType change);
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Update(const base::FilePath file_path,
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              const ResourceEntry& entry,
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              FileChange::ChangeType change);
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Apply(const FileChange& new_changed_files);
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Map& map() const { return map_; }
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t size() const { return map_.size(); }
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool empty() const { return map_.empty(); }
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ClearForTest() { map_.clear(); }
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t CountDirectory(const base::FilePath& directory_path) const;
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t count(const base::FilePath& file_path) const {
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return map_.count(file_path);
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string DebugString() const;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Map map_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace drive
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_CHANGE_H_
119