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