blob: 92920eb8472626846031e95f728ecec73ce3c43d [file] [log] [blame]
[email protected]54cb8e02014-02-24 09:29:191// Copyright 2014 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_DIRECTORY_LOADER_H_
6#define CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_
7
8#include <map>
9#include <set>
10#include <string>
11#include <vector>
12
13#include "base/callback.h"
14#include "base/memory/ref_counted.h"
15#include "base/memory/scoped_ptr.h"
16#include "base/memory/scoped_vector.h"
17#include "base/observer_list.h"
18#include "chrome/browser/chromeos/drive/file_errors.h"
[email protected]b71475f2014-03-03 08:09:1119#include "chrome/browser/chromeos/drive/file_system_interface.h"
[email protected]54cb8e02014-02-24 09:29:1920#include "google_apis/drive/drive_common_callbacks.h"
21#include "google_apis/drive/gdata_errorcode.h"
22
23namespace base {
24class SequencedTaskRunner;
25} // namespace base
26
27namespace google_apis {
28class AboutResource;
29} // namespace google_apis
30
31namespace drive {
32
[email protected]54cb8e02014-02-24 09:29:1933class EventLogger;
34class JobScheduler;
35class ResourceEntry;
36
37namespace internal {
38
39class AboutResourceLoader;
40class ChangeList;
41class ChangeListLoaderObserver;
42class DirectoryFetchInfo;
43class LoaderController;
44class ResourceMetadata;
45
46// DirectoryLoader is used to load directory contents.
47class DirectoryLoader {
48 public:
49 DirectoryLoader(EventLogger* logger,
50 base::SequencedTaskRunner* blocking_task_runner,
51 ResourceMetadata* resource_metadata,
52 JobScheduler* scheduler,
[email protected]54cb8e02014-02-24 09:29:1953 AboutResourceLoader* about_resource_loader,
54 LoaderController* apply_task_controller);
55 ~DirectoryLoader();
56
57 // Adds and removes the observer.
58 void AddObserver(ChangeListLoaderObserver* observer);
59 void RemoveObserver(ChangeListLoaderObserver* observer);
60
[email protected]b71475f2014-03-03 08:09:1161 // Reads the directory contents.
[email protected]f173c6d2014-04-14 10:49:5062 // |entries_callback| can be null.
63 // |completion_callback| must not be null.
[email protected]b71475f2014-03-03 08:09:1164 void ReadDirectory(const base::FilePath& directory_path,
[email protected]f173c6d2014-04-14 10:49:5065 const ReadDirectoryEntriesCallback& entries_callback,
66 const FileOperationCallback& completion_callback);
[email protected]54cb8e02014-02-24 09:29:1967
68 private:
69 class FeedFetcher;
[email protected]bbf59f22014-03-24 13:55:2670 struct ReadDirectoryCallbackState;
[email protected]54cb8e02014-02-24 09:29:1971
[email protected]b71475f2014-03-03 08:09:1172 // Part of ReadDirectory().
[email protected]f173c6d2014-04-14 10:49:5073 void ReadDirectoryAfterGetEntry(
74 const base::FilePath& directory_path,
75 const ReadDirectoryEntriesCallback& entries_callback,
76 const FileOperationCallback& completion_callback,
77 bool should_try_loading_parent,
78 const ResourceEntry* entry,
79 FileError error);
80 void ReadDirectoryAfterLoadParent(
81 const base::FilePath& directory_path,
82 const ReadDirectoryEntriesCallback& entries_callback,
83 const FileOperationCallback& completion_callback,
84 FileError error);
[email protected]c8f46ab2014-03-12 17:54:3085 void ReadDirectoryAfterGetAboutResource(
[email protected]8542d3c2014-03-19 05:57:2286 const std::string& local_id,
[email protected]54cb8e02014-02-24 09:29:1987 google_apis::GDataErrorCode status,
88 scoped_ptr<google_apis::AboutResource> about_resource);
[email protected]8542d3c2014-03-19 05:57:2289 void ReadDirectoryAfterCheckLocalState(
90 scoped_ptr<google_apis::AboutResource> about_resource,
91 const std::string& local_id,
92 const ResourceEntry* entry,
[email protected]8542d3c2014-03-19 05:57:2293 const int64* local_changestamp,
94 FileError error);
[email protected]54cb8e02014-02-24 09:29:1995
[email protected]c8f46ab2014-03-12 17:54:3096 // Part of ReadDirectory().
[email protected]54cb8e02014-02-24 09:29:1997 // This function should be called when the directory load is complete.
98 // Flushes the callbacks waiting for the directory to be loaded.
[email protected]8542d3c2014-03-19 05:57:2299 void OnDirectoryLoadComplete(const std::string& local_id, FileError error);
[email protected]bbf59f22014-03-24 13:55:26100 void OnDirectoryLoadCompleteAfterRead(const std::string& local_id,
101 const ResourceEntryVector* entries,
102 FileError error);
103
104 // Sends |entries| to the callbacks.
105 void SendEntries(const std::string& local_id,
[email protected]f173c6d2014-04-14 10:49:50106 const ResourceEntryVector& entries);
[email protected]54cb8e02014-02-24 09:29:19107
108 // ================= Implementation for directory loading =================
109 // Loads the directory contents from server, and updates the local metadata.
110 // Runs |callback| when it is finished.
111 void LoadDirectoryFromServer(const DirectoryFetchInfo& directory_fetch_info);
112
113 // Part of LoadDirectoryFromServer() for a normal directory.
114 void LoadDirectoryFromServerAfterLoad(
115 const DirectoryFetchInfo& directory_fetch_info,
116 FeedFetcher* fetcher,
[email protected]bbf59f22014-03-24 13:55:26117 FileError error);
[email protected]54cb8e02014-02-24 09:29:19118
119 // Part of LoadDirectoryFromServer().
[email protected]bbf59f22014-03-24 13:55:26120 void LoadDirectoryFromServerAfterUpdateChangestamp(
[email protected]54cb8e02014-02-24 09:29:19121 const DirectoryFetchInfo& directory_fetch_info,
122 const base::FilePath* directory_path,
123 FileError error);
124
125 EventLogger* logger_; // Not owned.
126 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
127 ResourceMetadata* resource_metadata_; // Not owned.
128 JobScheduler* scheduler_; // Not owned.
[email protected]54cb8e02014-02-24 09:29:19129 AboutResourceLoader* about_resource_loader_; // Not owned.
130 LoaderController* loader_controller_; // Not owned.
131 ObserverList<ChangeListLoaderObserver> observers_;
[email protected]bbf59f22014-03-24 13:55:26132 typedef std::map<std::string, std::vector<ReadDirectoryCallbackState> >
[email protected]54cb8e02014-02-24 09:29:19133 LoadCallbackMap;
134 LoadCallbackMap pending_load_callback_;
135
136 // Set of the running feed fetcher for the fast fetch.
137 std::set<FeedFetcher*> fast_fetch_feed_fetcher_set_;
138
139 // Note: This should remain the last member so it'll be destroyed and
140 // invalidate its weak pointers before any other members are destroyed.
141 base::WeakPtrFactory<DirectoryLoader> weak_ptr_factory_;
142 DISALLOW_COPY_AND_ASSIGN(DirectoryLoader);
143};
144
145} // namespace internal
146} // namespace drive
147
148#endif // CHROME_BROWSER_CHROMEOS_DRIVE_DIRECTORY_LOADER_H_