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