Home | History | Annotate | Download | only in drive
      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 "storage/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_
    119