1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <map>
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <set>
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string>
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector>
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/callback.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_vector.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/observer_list.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/drive/drive_common_callbacks.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SequencedTaskRunner;
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace base
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace google_apis {
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AboutResource;
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace google_apis
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace drive {
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class EventLogger;
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class JobScheduler;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ResourceEntry;
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace internal {
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AboutResourceLoader;
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ChangeList;
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ChangeListLoaderObserver;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DirectoryFetchInfo;
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LoaderController;
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ResourceMetadata;
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DirectoryLoader is used to load directory contents.
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DirectoryLoader {
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DirectoryLoader(EventLogger* logger,
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  base::SequencedTaskRunner* blocking_task_runner,
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  ResourceMetadata* resource_metadata,
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  JobScheduler* scheduler,
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  AboutResourceLoader* about_resource_loader,
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  LoaderController* apply_task_controller);
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ~DirectoryLoader();
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Adds and removes the observer.
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void AddObserver(ChangeListLoaderObserver* observer);
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void RemoveObserver(ChangeListLoaderObserver* observer);
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Reads the directory contents.
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // |entries_callback| can be null.
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // |completion_callback| must not be null.
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void ReadDirectory(const base::FilePath& directory_path,
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     const ReadDirectoryEntriesCallback& entries_callback,
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     const FileOperationCallback& completion_callback);
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  class FeedFetcher;
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  struct ReadDirectoryCallbackState;
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Part of ReadDirectory().
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void ReadDirectoryAfterGetEntry(
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const base::FilePath& directory_path,
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const ReadDirectoryEntriesCallback& entries_callback,
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const FileOperationCallback& completion_callback,
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      bool should_try_loading_parent,
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const ResourceEntry* entry,
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      FileError error);
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void ReadDirectoryAfterLoadParent(
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const base::FilePath& directory_path,
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const ReadDirectoryEntriesCallback& entries_callback,
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const FileOperationCallback& completion_callback,
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      FileError error);
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void ReadDirectoryAfterGetAboutResource(
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      const std::string& local_id,
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      google_apis::GDataErrorCode status,
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<google_apis::AboutResource> about_resource);
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  void ReadDirectoryAfterCheckLocalState(
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      scoped_ptr<google_apis::AboutResource> about_resource,
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      const std::string& local_id,
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      const ResourceEntry* entry,
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      const int64* local_changestamp,
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      FileError error);
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Part of ReadDirectory().
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This function should be called when the directory load is complete.
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Flushes the callbacks waiting for the directory to be loaded.
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  void OnDirectoryLoadComplete(const std::string& local_id, FileError error);
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void OnDirectoryLoadCompleteAfterRead(const std::string& local_id,
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        const ResourceEntryVector* entries,
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        FileError error);
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Sends |entries| to the callbacks.
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SendEntries(const std::string& local_id,
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   const ResourceEntryVector& entries);
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ================= Implementation for directory loading =================
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Loads the directory contents from server, and updates the local metadata.
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Runs |callback| when it is finished.
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void LoadDirectoryFromServer(const DirectoryFetchInfo& directory_fetch_info);
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Part of LoadDirectoryFromServer() for a normal directory.
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void LoadDirectoryFromServerAfterLoad(
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const DirectoryFetchInfo& directory_fetch_info,
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      FeedFetcher* fetcher,
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      FileError error);
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Part of LoadDirectoryFromServer().
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void LoadDirectoryFromServerAfterUpdateChangestamp(
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const DirectoryFetchInfo& directory_fetch_info,
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::FilePath* directory_path,
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      FileError error);
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EventLogger* logger_;  // Not owned.
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ResourceMetadata* resource_metadata_;  // Not owned.
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  JobScheduler* scheduler_;  // Not owned.
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AboutResourceLoader* about_resource_loader_;  // Not owned.
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LoaderController* loader_controller_;  // Not owned.
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ObserverList<ChangeListLoaderObserver> observers_;
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  typedef std::map<std::string, std::vector<ReadDirectoryCallbackState> >
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      LoadCallbackMap;
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LoadCallbackMap pending_load_callback_;
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Set of the running feed fetcher for the fast fetch.
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::set<FeedFetcher*> fast_fetch_feed_fetcher_set_;
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Note: This should remain the last member so it'll be destroyed and
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WeakPtrFactory<DirectoryLoader> weak_ptr_factory_;
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DirectoryLoader);
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace internal
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace drive
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_
149