OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_SCHEDULER_H_ | 5 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_SCHEDULER_H_ |
6 #define CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_SCHEDULER_H_ | 6 #define CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_SCHEDULER_H_ |
7 | 7 |
8 #include "base/memory/linked_ptr.h" | 8 #include "base/memory/linked_ptr.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "chrome/browser/chromeos/drive/drive_file_system_interface.h" | 10 #include "chrome/browser/chromeos/drive/drive_file_system_interface.h" |
| 11 #include "chrome/browser/google_apis/drive_service_interface.h" |
11 #include "net/base/network_change_notifier.h" | 12 #include "net/base/network_change_notifier.h" |
12 | 13 |
13 #include <deque> | 14 #include <deque> |
14 | 15 |
15 class Profile; | 16 class Profile; |
16 | 17 |
17 namespace drive { | 18 namespace drive { |
18 | 19 |
19 namespace file_system { | 20 namespace file_system { |
20 class DriveOperations; | 21 class DriveOperations; |
21 } | 22 } |
22 | 23 |
23 // The DriveScheduler is responsible for queuing and scheduling drive | 24 // The DriveScheduler is responsible for queuing and scheduling drive |
24 // operations. It is responsible for handling retry logic, rate limiting, as | 25 // operations. It is responsible for handling retry logic, rate limiting, as |
25 // concurrency as appropriate. | 26 // concurrency as appropriate. |
26 // | 27 // |
27 // TODO(zork): Provide an interface for querying the number of jobs, and state | 28 // TODO(zork): Provide an interface for querying the number of jobs, and state |
28 // of each. See: crbug.com/154243 | 29 // of each. See: crbug.com/154243 |
29 class DriveScheduler | 30 class DriveScheduler |
30 : public net::NetworkChangeNotifier::ConnectionTypeObserver { | 31 : public net::NetworkChangeNotifier::ConnectionTypeObserver { |
31 public: | 32 public: |
32 | 33 |
33 // Enum representing the type of job. | 34 // Enum representing the type of job. |
34 enum JobType { | 35 enum JobType { |
35 TYPE_COPY, | 36 TYPE_COPY, |
| 37 TYPE_GET_DOCUMENTS, |
36 TYPE_MOVE, | 38 TYPE_MOVE, |
37 TYPE_REMOVE, | 39 TYPE_REMOVE, |
38 TYPE_TRANSFER_LOCAL_TO_REMOTE, | 40 TYPE_TRANSFER_LOCAL_TO_REMOTE, |
39 TYPE_TRANSFER_REGULAR_FILE, | 41 TYPE_TRANSFER_REGULAR_FILE, |
40 TYPE_TRANSFER_REMOTE_TO_LOCAL, | 42 TYPE_TRANSFER_REMOTE_TO_LOCAL, |
41 }; | 43 }; |
42 | 44 |
43 // Current state of the job. | 45 // Current state of the job. |
44 enum JobState { | 46 enum JobState { |
45 // The job is queued, but not yet executed. | 47 // The job is queued, but not yet executed. |
(...skipping 23 matching lines...) Expand all Loading... |
69 int total_bytes; | 71 int total_bytes; |
70 | 72 |
71 // Drive path of the file that this job acts on. | 73 // Drive path of the file that this job acts on. |
72 FilePath file_path; | 74 FilePath file_path; |
73 | 75 |
74 // Current state of the operation. | 76 // Current state of the operation. |
75 JobState state; | 77 JobState state; |
76 }; | 78 }; |
77 | 79 |
78 DriveScheduler(Profile* profile, | 80 DriveScheduler(Profile* profile, |
| 81 google_apis::DriveServiceInterface* drive_service, |
79 file_system::DriveOperations* drive_operations); | 82 file_system::DriveOperations* drive_operations); |
80 virtual ~DriveScheduler(); | 83 virtual ~DriveScheduler(); |
81 | 84 |
82 // Initializes the object. This function should be called before any | 85 // Initializes the object. This function should be called before any |
83 // other functions. | 86 // other functions. |
84 void Initialize(); | 87 void Initialize(); |
85 | 88 |
86 // Adds a copy operation to the queue. | 89 // Adds a copy operation to the queue. |
87 void Copy(const FilePath& src_file_path, | 90 void Copy(const FilePath& src_file_path, |
88 const FilePath& dest_file_path, | 91 const FilePath& dest_file_path, |
89 const FileOperationCallback& callback); | 92 const FileOperationCallback& callback); |
90 | 93 |
| 94 // Adds a GetDocuments operation to the queue. |
| 95 void GetDocuments(const GURL& feed_url, |
| 96 int64 start_changestamp, |
| 97 const std::string& search_query, |
| 98 bool shared_with_me, |
| 99 const std::string& directory_resource_id, |
| 100 const google_apis::GetDataCallback& callback); |
| 101 |
91 // Adds a transfer operation to the queue. | 102 // Adds a transfer operation to the queue. |
92 void TransferFileFromRemoteToLocal(const FilePath& remote_src_file_path, | 103 void TransferFileFromRemoteToLocal(const FilePath& remote_src_file_path, |
93 const FilePath& local_dest_file_path, | 104 const FilePath& local_dest_file_path, |
94 const FileOperationCallback& callback); | 105 const FileOperationCallback& callback); |
95 | 106 |
96 // Adds a transfer operation to the queue. | 107 // Adds a transfer operation to the queue. |
97 void TransferFileFromLocalToRemote(const FilePath& local_src_file_path, | 108 void TransferFileFromLocalToRemote(const FilePath& local_src_file_path, |
98 const FilePath& remote_dest_file_path, | 109 const FilePath& remote_dest_file_path, |
99 const FileOperationCallback& callback); | 110 const FileOperationCallback& callback); |
100 | 111 |
(...skipping 11 matching lines...) Expand all Loading... |
112 void Remove(const FilePath& file_path, | 123 void Remove(const FilePath& file_path, |
113 bool is_recursive, | 124 bool is_recursive, |
114 const FileOperationCallback& callback); | 125 const FileOperationCallback& callback); |
115 | 126 |
116 private: | 127 private: |
117 friend class DriveSchedulerTest; | 128 friend class DriveSchedulerTest; |
118 | 129 |
119 // Represents a single entry in the job queue. | 130 // Represents a single entry in the job queue. |
120 struct QueueEntry { | 131 struct QueueEntry { |
121 QueueEntry(JobType in_job_type, | 132 QueueEntry(JobType in_job_type, |
122 FilePath in_file_path, | 133 FilePath in_file_path); |
123 FileOperationCallback in_callback); | |
124 ~QueueEntry(); | 134 ~QueueEntry(); |
125 | 135 |
126 JobInfo job_info; | 136 JobInfo job_info; |
127 | 137 |
128 // Callback for when the operation completes. | 138 // Callback for when the operation completes. |
129 // Used by: | 139 // Used by: |
130 // TYPE_COPY, | 140 // TYPE_COPY, |
131 // TYPE_MOVE, | 141 // TYPE_MOVE, |
132 // TYPE_REMOVE, | 142 // TYPE_REMOVE, |
133 // TYPE_TRANSFER_LOCAL_TO_REMOTE, | 143 // TYPE_TRANSFER_LOCAL_TO_REMOTE, |
134 // TYPE_TRANSFER_REGULAR_FILE, | 144 // TYPE_TRANSFER_REGULAR_FILE, |
135 // TYPE_TRANSFER_REMOTE_TO_LOCAL | 145 // TYPE_TRANSFER_REMOTE_TO_LOCAL |
136 FileOperationCallback callback; | 146 FileOperationCallback file_operation_callback; |
137 | 147 |
138 // Destination of the operation. | 148 // Destination of the operation. |
139 // Used by: | 149 // Used by: |
140 // TYPE_COPY, | 150 // TYPE_COPY, |
141 // TYPE_MOVE, | 151 // TYPE_MOVE, |
142 // TYPE_TRANSFER_LOCAL_TO_REMOTE, | 152 // TYPE_TRANSFER_LOCAL_TO_REMOTE, |
143 // TYPE_TRANSFER_REGULAR_FILE, | 153 // TYPE_TRANSFER_REGULAR_FILE, |
144 // TYPE_TRANSFER_REMOTE_TO_LOCAL | 154 // TYPE_TRANSFER_REMOTE_TO_LOCAL |
145 FilePath dest_file_path; | 155 FilePath dest_file_path; |
146 | 156 |
147 // Whether the operation is recursive. Used by: TYPE_REMOVE | 157 // Whether the operation is recursive. Used by: |
| 158 // TYPE_REMOVE |
148 bool is_recursive; | 159 bool is_recursive; |
| 160 |
| 161 // Parameters for GetDocuments(). Used by: |
| 162 // TYPE_GET_DOCUMENTS |
| 163 GURL feed_url; |
| 164 int64 start_changestamp; |
| 165 std::string search_query; |
| 166 bool shared_with_me; |
| 167 std::string directory_resource_id; |
| 168 google_apis::GetDataCallback get_data_callback; |
149 }; | 169 }; |
150 | 170 |
151 // Adds the specified job to the queue. Takes ownership of |job| | 171 // Adds the specified job to the queue. Takes ownership of |job| |
152 int QueueJob(scoped_ptr<QueueEntry> job); | 172 int QueueJob(scoped_ptr<QueueEntry> job); |
153 | 173 |
154 // Starts the job loop, if it is not already running. | 174 // Starts the job loop, if it is not already running. |
155 void StartJobLoop(); | 175 void StartJobLoop(); |
156 | 176 |
157 // Determines the next job that should run, and starts it. | 177 // Determines the next job that should run, and starts it. |
158 void DoJobLoop(); | 178 void DoJobLoop(); |
159 | 179 |
160 // Checks if operations should be suspended, such as if the network is | 180 // Checks if operations should be suspended, such as if the network is |
161 // disconnected. | 181 // disconnected. |
162 // | 182 // |
163 // Returns true when it should stop, and false if it should continue. | 183 // Returns true when it should stop, and false if it should continue. |
164 bool ShouldStopJobLoop(); | 184 bool ShouldStopJobLoop(); |
165 | 185 |
166 // Increases the throttle delay if it's below the maximum value, and posts a | 186 // Increases the throttle delay if it's below the maximum value, and posts a |
167 // task to continue the loop after the delay. | 187 // task to continue the loop after the delay. |
168 void ThrottleAndContinueJobLoop(); | 188 void ThrottleAndContinueJobLoop(); |
169 | 189 |
170 // Resets the throttle delay to the initial value, and continues the job loop. | 190 // Resets the throttle delay to the initial value, and continues the job loop. |
171 void ResetThrottleAndContinueJobLoop(); | 191 void ResetThrottleAndContinueJobLoop(); |
172 | 192 |
173 // Callback for job finishing. Retries the job if needed, otherwise cleans up | 193 // Retries the job if needed, otherwise cleans up the job, invokes the |
174 // the job, invokes the callback, and continues the job loop. | 194 // callback, and continues the job loop. |
175 void OnJobDone(int job_id, DriveFileError error); | 195 scoped_ptr<QueueEntry> OnJobDone(int job_id, DriveFileError error); |
| 196 |
| 197 // Callback for job finishing with a FileOperationCallback. |
| 198 void OnFileOperationJobDone(int job_id, DriveFileError error); |
| 199 |
| 200 // Callback for job finishing with a GetDataCallback. |
| 201 void OnGetDataJobDone(int job_id, |
| 202 google_apis::GDataErrorCode error, |
| 203 scoped_ptr<base::Value> feed_data); |
176 | 204 |
177 // net::NetworkChangeNotifier::ConnectionTypeObserver override. | 205 // net::NetworkChangeNotifier::ConnectionTypeObserver override. |
178 virtual void OnConnectionTypeChanged( | 206 virtual void OnConnectionTypeChanged( |
179 net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; | 207 net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; |
180 | 208 |
181 // For testing only. Disables throttling so that testing is faster. | 209 // For testing only. Disables throttling so that testing is faster. |
182 void SetDisableThrottling(bool disable) { disable_throttling_ = disable; } | 210 void SetDisableThrottling(bool disable) { disable_throttling_ = disable; } |
183 | 211 |
184 // True when there is a job running. Indicates that new jobs should wait to | 212 // True when there is a job running. Indicates that new jobs should wait to |
185 // be executed. | 213 // be executed. |
(...skipping 13 matching lines...) Expand all Loading... |
199 // Mapping of id to QueueEntry. | 227 // Mapping of id to QueueEntry. |
200 typedef std::map<int, linked_ptr<QueueEntry> > JobMap; | 228 typedef std::map<int, linked_ptr<QueueEntry> > JobMap; |
201 JobMap job_info_map_; | 229 JobMap job_info_map_; |
202 | 230 |
203 // The queue of jobs id. Sorted by priority. | 231 // The queue of jobs id. Sorted by priority. |
204 std::deque<int> queue_; | 232 std::deque<int> queue_; |
205 | 233 |
206 // Drive operations. | 234 // Drive operations. |
207 file_system::DriveOperations* drive_operations_; | 235 file_system::DriveOperations* drive_operations_; |
208 | 236 |
| 237 google_apis::DriveServiceInterface* drive_service_; |
| 238 |
209 Profile* profile_; | 239 Profile* profile_; |
210 | 240 |
211 // Note: This should remain the last member so it'll be destroyed and | 241 // Note: This should remain the last member so it'll be destroyed and |
212 // invalidate its weak pointers before any other members are destroyed. | 242 // invalidate its weak pointers before any other members are destroyed. |
213 base::WeakPtrFactory<DriveScheduler> weak_ptr_factory_; | 243 base::WeakPtrFactory<DriveScheduler> weak_ptr_factory_; |
214 | 244 |
215 // Whether this instance is initialized or not. | 245 // Whether this instance is initialized or not. |
216 bool initialized_; | 246 bool initialized_; |
217 | 247 |
218 DISALLOW_COPY_AND_ASSIGN(DriveScheduler); | 248 DISALLOW_COPY_AND_ASSIGN(DriveScheduler); |
219 }; | 249 }; |
220 | 250 |
221 } // namespace drive | 251 } // namespace drive |
222 | 252 |
223 #endif // CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_SCHEDULER_H_ | 253 #endif // CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_SCHEDULER_H_ |
OLD | NEW |