12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_PROCESSOR_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_PROCESSOR_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_vector.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_errors.h" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace google_apis { 20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class AboutResource; 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ChangeList; 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FileList; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // google_apis 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace drive { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileChange; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ResourceEntry; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace internal { 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ResourceMetadata; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Holds information needed to fetch contents of a directory. 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// This object is copyable. 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class DirectoryFetchInfo { 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DirectoryFetchInfo() : changestamp_(0) {} 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DirectoryFetchInfo(const std::string& local_id, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& resource_id, 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 changestamp) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : local_id_(local_id), 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource_id_(resource_id), 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) changestamp_(changestamp) { 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Returns true if the object is empty. 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool empty() const { return local_id_.empty(); } 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Local ID of the directory. 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& local_id() const { return local_id_; } 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Resource ID of the directory. 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& resource_id() const { return resource_id_; } 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Changestamp of the directory. The changestamp is used to determine if 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the directory contents should be fetched. 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 changestamp() const { return changestamp_; } 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Returns a string representation of this object. 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string ToString() const; 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string local_id_; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string resource_id_; 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const int64 changestamp_; 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Class to represent a change list. 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ChangeList { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ChangeList(); // For tests. 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) explicit ChangeList(const google_apis::ChangeList& change_list); 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) explicit ChangeList(const google_apis::FileList& file_list); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~ChangeList(); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<ResourceEntry>& entries() const { return entries_; } 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<ResourceEntry>* mutable_entries() { return &entries_; } 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector<std::string>& parent_resource_ids() const { 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return parent_resource_ids_; 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<std::string>* mutable_parent_resource_ids() { 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return &parent_resource_ids_; 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& next_url() const { return next_url_; } 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 largest_changestamp() const { return largest_changestamp_; } 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_largest_changestamp(int64 largest_changestamp) { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) largest_changestamp_ = largest_changestamp; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<ResourceEntry> entries_; 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<std::string> parent_resource_ids_; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL next_url_; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64 largest_changestamp_; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChangeList); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// ChangeListProcessor is used to process change lists, or full resource 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// lists from WAPI (codename for Documents List API) or Google Drive API, and 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// updates the resource metadata stored locally. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChangeListProcessor { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit ChangeListProcessor(ResourceMetadata* resource_metadata); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ChangeListProcessor(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Applies change lists or full resource lists to |resource_metadata_|. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |is_delta_update| determines the type of input data to process, whether 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // it is full resource lists (false) or change lists (true). 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Must be run on the same task runner as |resource_metadata_| uses. 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FileError Apply(scoped_ptr<google_apis::AboutResource> about_resource, 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedVector<ChangeList> change_lists, 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool is_delta_update); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The set of changed files as a result of change list processing. 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const FileChange& changed_files() const { return *changed_files_; } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Adds or refreshes the child entries from |change_list| to the directory. 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static FileError RefreshDirectory( 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ResourceMetadata* resource_metadata, 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const DirectoryFetchInfo& directory_fetch_info, 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<ChangeList> change_list, 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<ResourceEntry>* out_refreshed_entries); 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Sets |entry|'s parent_local_id. 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static FileError SetParentLocalIdOfEntry( 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceMetadata* resource_metadata, 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry* entry, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& parent_resource_id); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef std::map<std::string /* resource_id */, ResourceEntry> 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceEntryMap; 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef std::map<std::string /* resource_id */, 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string /* parent_resource_id*/> ParentResourceIdMap; 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Applies the pre-processed metadata from entry_map_ onto the resource 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // metadata. |about_resource| must not be null. 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FileError ApplyEntryMap( 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int64 changestamp, 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<google_apis::AboutResource> about_resource); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Apply |entry| to resource_metadata_. 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FileError ApplyEntry(const ResourceEntry& entry); 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Adds the directories changed by the update on |entry| to |changed_dirs_|. 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void UpdateChangedDirs(const ResourceEntry& entry); 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceMetadata* resource_metadata_; // Not owned. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResourceEntryMap entry_map_; 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ParentResourceIdMap parent_resource_id_map_; 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<FileChange> changed_files_; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChangeListProcessor); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace internal 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace drive 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_DRIVE_CHANGE_LIST_PROCESSOR_H_ 166