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_CHANGE_LIST_PROCESSOR_H_ 6 #define CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_PROCESSOR_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 12 #include "base/files/file_path.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_vector.h" 15 #include "chrome/browser/chromeos/drive/file_errors.h" 16 #include "url/gurl.h" 17 18 namespace google_apis { 19 class AboutResource; 20 class ChangeList; 21 class FileList; 22 } // google_apis 23 24 namespace drive { 25 26 class ResourceEntry; 27 28 namespace internal { 29 30 class ResourceMetadata; 31 32 // Holds information needed to fetch contents of a directory. 33 // This object is copyable. 34 class DirectoryFetchInfo { 35 public: 36 DirectoryFetchInfo() : changestamp_(0) {} 37 DirectoryFetchInfo(const std::string& local_id, 38 const std::string& resource_id, 39 int64 changestamp) 40 : local_id_(local_id), 41 resource_id_(resource_id), 42 changestamp_(changestamp) { 43 } 44 45 // Returns true if the object is empty. 46 bool empty() const { return local_id_.empty(); } 47 48 // Local ID of the directory. 49 const std::string& local_id() const { return local_id_; } 50 51 // Resource ID of the directory. 52 const std::string& resource_id() const { return resource_id_; } 53 54 // Changestamp of the directory. The changestamp is used to determine if 55 // the directory contents should be fetched. 56 int64 changestamp() const { return changestamp_; } 57 58 // Returns a string representation of this object. 59 std::string ToString() const; 60 61 private: 62 const std::string local_id_; 63 const std::string resource_id_; 64 const int64 changestamp_; 65 }; 66 67 // Class to represent a change list. 68 class ChangeList { 69 public: 70 ChangeList(); // For tests. 71 explicit ChangeList(const google_apis::ChangeList& change_list); 72 explicit ChangeList(const google_apis::FileList& file_list); 73 ~ChangeList(); 74 75 const std::vector<ResourceEntry>& entries() const { return entries_; } 76 std::vector<ResourceEntry>* mutable_entries() { return &entries_; } 77 const std::vector<std::string>& parent_resource_ids() const { 78 return parent_resource_ids_; 79 } 80 std::vector<std::string>* mutable_parent_resource_ids() { 81 return &parent_resource_ids_; 82 } 83 const GURL& next_url() const { return next_url_; } 84 int64 largest_changestamp() const { return largest_changestamp_; } 85 86 void set_largest_changestamp(int64 largest_changestamp) { 87 largest_changestamp_ = largest_changestamp; 88 } 89 90 private: 91 std::vector<ResourceEntry> entries_; 92 std::vector<std::string> parent_resource_ids_; 93 GURL next_url_; 94 int64 largest_changestamp_; 95 96 DISALLOW_COPY_AND_ASSIGN(ChangeList); 97 }; 98 99 // ChangeListProcessor is used to process change lists, or full resource 100 // lists from WAPI (codename for Documents List API) or Google Drive API, and 101 // updates the resource metadata stored locally. 102 class ChangeListProcessor { 103 public: 104 explicit ChangeListProcessor(ResourceMetadata* resource_metadata); 105 ~ChangeListProcessor(); 106 107 // Applies change lists or full resource lists to |resource_metadata_|. 108 // 109 // |is_delta_update| determines the type of input data to process, whether 110 // it is full resource lists (false) or change lists (true). 111 // 112 // Must be run on the same task runner as |resource_metadata_| uses. 113 FileError Apply(scoped_ptr<google_apis::AboutResource> about_resource, 114 ScopedVector<ChangeList> change_lists, 115 bool is_delta_update); 116 117 // The set of changed directories as a result of change list processing. 118 const std::set<base::FilePath>& changed_dirs() const { return changed_dirs_; } 119 120 // Adds or refreshes the child entries from |change_list| to the directory. 121 static FileError RefreshDirectory( 122 ResourceMetadata* resource_metadata, 123 const DirectoryFetchInfo& directory_fetch_info, 124 scoped_ptr<ChangeList> change_list, 125 std::vector<ResourceEntry>* out_refreshed_entries); 126 127 // Sets |entry|'s parent_local_id. 128 static FileError SetParentLocalIdOfEntry( 129 ResourceMetadata* resource_metadata, 130 ResourceEntry* entry, 131 const std::string& parent_resource_id); 132 133 private: 134 typedef std::map<std::string /* resource_id */, ResourceEntry> 135 ResourceEntryMap; 136 typedef std::map<std::string /* resource_id */, 137 std::string /* parent_resource_id*/> ParentResourceIdMap; 138 139 // Applies the pre-processed metadata from entry_map_ onto the resource 140 // metadata. |about_resource| must not be null. 141 FileError ApplyEntryMap( 142 int64 changestamp, 143 scoped_ptr<google_apis::AboutResource> about_resource); 144 145 // Apply |entry| to resource_metadata_. 146 FileError ApplyEntry(const ResourceEntry& entry); 147 148 // Adds the directories changed by the update on |entry| to |changed_dirs_|. 149 void UpdateChangedDirs(const ResourceEntry& entry); 150 151 ResourceMetadata* resource_metadata_; // Not owned. 152 153 ResourceEntryMap entry_map_; 154 ParentResourceIdMap parent_resource_id_map_; 155 std::set<base::FilePath> changed_dirs_; 156 157 DISALLOW_COPY_AND_ASSIGN(ChangeListProcessor); 158 }; 159 160 } // namespace internal 161 } // namespace drive 162 163 #endif // CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_PROCESSOR_H_ 164