OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "chrome/browser/sync_file_system/drive_backend/sync_engine.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/threading/sequenced_worker_pool.h" | 10 #include "base/threading/sequenced_worker_pool.h" |
11 #include "base/values.h" | 11 #include "base/values.h" |
12 #include "chrome/browser/drive/drive_api_service.h" | 12 #include "chrome/browser/drive/drive_api_service.h" |
13 #include "chrome/browser/drive/drive_notification_manager.h" | 13 #include "chrome/browser/drive/drive_notification_manager.h" |
14 #include "chrome/browser/drive/drive_notification_manager_factory.h" | 14 #include "chrome/browser/drive/drive_notification_manager_factory.h" |
15 #include "chrome/browser/drive/drive_service_interface.h" | 15 #include "chrome/browser/drive/drive_service_interface.h" |
16 #include "chrome/browser/drive/drive_uploader.h" | 16 #include "chrome/browser/drive/drive_uploader.h" |
17 #include "chrome/browser/extensions/extension_service.h" | 17 #include "chrome/browser/extensions/extension_service.h" |
18 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
19 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 19 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
20 #include "chrome/browser/signin/signin_manager.h" | 20 #include "chrome/browser/signin/signin_manager.h" |
21 #include "chrome/browser/signin/signin_manager_factory.h" | 21 #include "chrome/browser/signin/signin_manager_factory.h" |
22 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" | 22 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" |
23 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" | 23 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" |
24 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h" | 24 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h" |
25 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" | 25 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" |
26 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 26 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
27 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" | 27 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" |
28 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h
" | 28 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h
" |
| 29 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" |
29 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" | 30 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" |
30 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" | 31 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" |
31 #include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.h" | 32 #include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.h" |
32 #include "chrome/browser/sync_file_system/file_status_observer.h" | 33 #include "chrome/browser/sync_file_system/file_status_observer.h" |
33 #include "chrome/browser/sync_file_system/logger.h" | 34 #include "chrome/browser/sync_file_system/logger.h" |
| 35 #include "chrome/browser/sync_file_system/remote_change_processor.h" |
34 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" | 36 #include "chrome/browser/sync_file_system/syncable_file_system_util.h" |
35 #include "components/signin/core/profile_oauth2_token_service.h" | 37 #include "components/signin/core/profile_oauth2_token_service.h" |
36 #include "content/public/browser/browser_thread.h" | 38 #include "content/public/browser/browser_thread.h" |
37 #include "extensions/browser/extension_system.h" | 39 #include "extensions/browser/extension_system.h" |
38 #include "extensions/browser/extension_system_provider.h" | 40 #include "extensions/browser/extension_system_provider.h" |
39 #include "extensions/browser/extensions_browser_client.h" | 41 #include "extensions/browser/extensions_browser_client.h" |
40 #include "extensions/common/extension.h" | 42 #include "extensions/common/extension.h" |
41 #include "google_apis/drive/drive_api_url_generator.h" | 43 #include "google_apis/drive/drive_api_url_generator.h" |
42 #include "google_apis/drive/gdata_wapi_url_generator.h" | 44 #include "google_apis/drive/gdata_wapi_url_generator.h" |
43 #include "webkit/common/blob/scoped_file.h" | 45 #include "webkit/common/blob/scoped_file.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 std::set<BrowserContextKeyedServiceFactory*>* factories) { | 116 std::set<BrowserContextKeyedServiceFactory*>* factories) { |
115 DCHECK(factories); | 117 DCHECK(factories); |
116 factories->insert(drive::DriveNotificationManagerFactory::GetInstance()); | 118 factories->insert(drive::DriveNotificationManagerFactory::GetInstance()); |
117 factories->insert(SigninManagerFactory::GetInstance()); | 119 factories->insert(SigninManagerFactory::GetInstance()); |
118 factories->insert( | 120 factories->insert( |
119 extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); | 121 extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); |
120 } | 122 } |
121 | 123 |
122 SyncEngine::~SyncEngine() { | 124 SyncEngine::~SyncEngine() { |
123 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); | 125 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
124 drive_service_->RemoveObserver(this); | 126 context_->GetDriveService()->RemoveObserver(this); |
125 if (notification_manager_) | 127 if (notification_manager_) |
126 notification_manager_->RemoveObserver(this); | 128 notification_manager_->RemoveObserver(this); |
127 } | 129 } |
128 | 130 |
129 void SyncEngine::Initialize() { | 131 void SyncEngine::Initialize() { |
130 DCHECK(!task_manager_); | 132 DCHECK(!task_manager_); |
131 task_manager_.reset(new SyncTaskManager(weak_ptr_factory_.GetWeakPtr())); | 133 task_manager_.reset(new SyncTaskManager(weak_ptr_factory_.GetWeakPtr())); |
132 task_manager_->Initialize(SYNC_STATUS_OK); | 134 task_manager_->Initialize(SYNC_STATUS_OK); |
133 | 135 |
134 PostInitializeTask(); | 136 PostInitializeTask(); |
135 | 137 |
136 if (notification_manager_) | 138 if (notification_manager_) |
137 notification_manager_->AddObserver(this); | 139 notification_manager_->AddObserver(this); |
138 drive_service_->AddObserver(this); | 140 context_->GetDriveService()->AddObserver(this); |
139 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); | 141 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
140 | 142 |
141 net::NetworkChangeNotifier::ConnectionType type = | 143 net::NetworkChangeNotifier::ConnectionType type = |
142 net::NetworkChangeNotifier::GetConnectionType(); | 144 net::NetworkChangeNotifier::GetConnectionType(); |
143 network_available_ = | 145 network_available_ = |
144 type != net::NetworkChangeNotifier::CONNECTION_NONE; | 146 type != net::NetworkChangeNotifier::CONNECTION_NONE; |
145 } | 147 } |
146 | 148 |
147 void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) { | 149 void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) { |
148 service_observers_.AddObserver(observer); | 150 service_observers_.AddObserver(observer); |
149 } | 151 } |
150 | 152 |
151 void SyncEngine::AddFileStatusObserver(FileStatusObserver* observer) { | 153 void SyncEngine::AddFileStatusObserver(FileStatusObserver* observer) { |
152 file_status_observers_.AddObserver(observer); | 154 file_status_observers_.AddObserver(observer); |
153 } | 155 } |
154 | 156 |
155 void SyncEngine::RegisterOrigin( | 157 void SyncEngine::RegisterOrigin( |
156 const GURL& origin, | 158 const GURL& origin, |
157 const SyncStatusCallback& callback) { | 159 const SyncStatusCallback& callback) { |
158 if (!metadata_database_ && drive_service_->HasRefreshToken()) | 160 if (!context_->GetMetadataDatabase() && |
| 161 context_->GetDriveService()->HasRefreshToken()) |
159 PostInitializeTask(); | 162 PostInitializeTask(); |
160 | 163 |
161 scoped_ptr<RegisterAppTask> task(new RegisterAppTask(this, origin.host())); | 164 scoped_ptr<RegisterAppTask> task( |
| 165 new RegisterAppTask(context_.get(), origin.host())); |
162 if (task->CanFinishImmediately()) { | 166 if (task->CanFinishImmediately()) { |
163 callback.Run(SYNC_STATUS_OK); | 167 callback.Run(SYNC_STATUS_OK); |
164 return; | 168 return; |
165 } | 169 } |
166 | 170 |
167 task_manager_->ScheduleSyncTask( | 171 task_manager_->ScheduleSyncTask( |
168 FROM_HERE, | 172 FROM_HERE, |
169 task.PassAs<SyncTask>(), | 173 task.PassAs<SyncTask>(), |
170 SyncTaskManager::PRIORITY_HIGH, | 174 SyncTaskManager::PRIORITY_HIGH, |
171 callback); | 175 callback); |
(...skipping 22 matching lines...) Expand all Loading... |
194 SyncTaskManager::PRIORITY_HIGH, | 198 SyncTaskManager::PRIORITY_HIGH, |
195 callback); | 199 callback); |
196 } | 200 } |
197 | 201 |
198 void SyncEngine::UninstallOrigin( | 202 void SyncEngine::UninstallOrigin( |
199 const GURL& origin, | 203 const GURL& origin, |
200 UninstallFlag flag, | 204 UninstallFlag flag, |
201 const SyncStatusCallback& callback) { | 205 const SyncStatusCallback& callback) { |
202 task_manager_->ScheduleSyncTask( | 206 task_manager_->ScheduleSyncTask( |
203 FROM_HERE, | 207 FROM_HERE, |
204 scoped_ptr<SyncTask>(new UninstallAppTask(this, origin.host(), flag)), | 208 scoped_ptr<SyncTask>( |
| 209 new UninstallAppTask(context_.get(), origin.host(), flag)), |
205 SyncTaskManager::PRIORITY_HIGH, | 210 SyncTaskManager::PRIORITY_HIGH, |
206 callback); | 211 callback); |
207 } | 212 } |
208 | 213 |
209 void SyncEngine::ProcessRemoteChange( | 214 void SyncEngine::ProcessRemoteChange( |
210 const SyncFileCallback& callback) { | 215 const SyncFileCallback& callback) { |
211 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(this); | 216 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); |
212 task_manager_->ScheduleSyncTask( | 217 task_manager_->ScheduleSyncTask( |
213 FROM_HERE, | 218 FROM_HERE, |
214 scoped_ptr<SyncTask>(syncer), | 219 scoped_ptr<SyncTask>(syncer), |
215 SyncTaskManager::PRIORITY_MED, | 220 SyncTaskManager::PRIORITY_MED, |
216 base::Bind(&SyncEngine::DidProcessRemoteChange, | 221 base::Bind(&SyncEngine::DidProcessRemoteChange, |
217 weak_ptr_factory_.GetWeakPtr(), | 222 weak_ptr_factory_.GetWeakPtr(), |
218 syncer, callback)); | 223 syncer, callback)); |
219 } | 224 } |
220 | 225 |
221 void SyncEngine::SetRemoteChangeProcessor( | 226 void SyncEngine::SetRemoteChangeProcessor( |
(...skipping 11 matching lines...) Expand all Loading... |
233 } | 238 } |
234 | 239 |
235 RemoteServiceState SyncEngine::GetCurrentState() const { | 240 RemoteServiceState SyncEngine::GetCurrentState() const { |
236 if (!sync_enabled_) | 241 if (!sync_enabled_) |
237 return REMOTE_SERVICE_DISABLED; | 242 return REMOTE_SERVICE_DISABLED; |
238 return service_state_; | 243 return service_state_; |
239 } | 244 } |
240 | 245 |
241 void SyncEngine::GetOriginStatusMap(OriginStatusMap* status_map) { | 246 void SyncEngine::GetOriginStatusMap(OriginStatusMap* status_map) { |
242 DCHECK(status_map); | 247 DCHECK(status_map); |
243 if (!extension_service_ || !metadata_database_) | 248 if (!extension_service_ || !context_->GetMetadataDatabase()) |
244 return; | 249 return; |
245 | 250 |
246 std::vector<std::string> app_ids; | 251 std::vector<std::string> app_ids; |
247 metadata_database_->GetRegisteredAppIDs(&app_ids); | 252 context_->GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); |
248 | 253 |
249 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | 254 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); |
250 itr != app_ids.end(); ++itr) { | 255 itr != app_ids.end(); ++itr) { |
251 const std::string& app_id = *itr; | 256 const std::string& app_id = *itr; |
252 GURL origin = | 257 GURL origin = |
253 extensions::Extension::GetBaseURLFromExtensionId(app_id); | 258 extensions::Extension::GetBaseURLFromExtensionId(app_id); |
254 (*status_map)[origin] = | 259 (*status_map)[origin] = |
255 metadata_database_->IsAppEnabled(app_id) ? "Enabled" : "Disabled"; | 260 context_->GetMetadataDatabase()->IsAppEnabled(app_id) ? |
| 261 "Enabled" : "Disabled"; |
256 } | 262 } |
257 } | 263 } |
258 | 264 |
259 scoped_ptr<base::ListValue> SyncEngine::DumpFiles(const GURL& origin) { | 265 scoped_ptr<base::ListValue> SyncEngine::DumpFiles(const GURL& origin) { |
260 if (!metadata_database_) | 266 if (!context_->GetMetadataDatabase()) |
261 return scoped_ptr<base::ListValue>(); | 267 return scoped_ptr<base::ListValue>(); |
262 return metadata_database_->DumpFiles(origin.host()); | 268 return context_->GetMetadataDatabase()->DumpFiles(origin.host()); |
263 } | 269 } |
264 | 270 |
265 scoped_ptr<base::ListValue> SyncEngine::DumpDatabase() { | 271 scoped_ptr<base::ListValue> SyncEngine::DumpDatabase() { |
266 if (!metadata_database_) | 272 if (!context_->GetMetadataDatabase()) |
267 return scoped_ptr<base::ListValue>(); | 273 return scoped_ptr<base::ListValue>(); |
268 return metadata_database_->DumpDatabase(); | 274 return context_->GetMetadataDatabase()->DumpDatabase(); |
269 } | 275 } |
270 | 276 |
271 void SyncEngine::SetSyncEnabled(bool enabled) { | 277 void SyncEngine::SetSyncEnabled(bool enabled) { |
272 if (sync_enabled_ == enabled) | 278 if (sync_enabled_ == enabled) |
273 return; | 279 return; |
274 | 280 |
275 RemoteServiceState old_state = GetCurrentState(); | 281 RemoteServiceState old_state = GetCurrentState(); |
276 sync_enabled_ = enabled; | 282 sync_enabled_ = enabled; |
277 if (old_state == GetCurrentState()) | 283 if (old_state == GetCurrentState()) |
278 return; | 284 return; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 | 323 |
318 void SyncEngine::DownloadRemoteVersion( | 324 void SyncEngine::DownloadRemoteVersion( |
319 const fileapi::FileSystemURL& url, | 325 const fileapi::FileSystemURL& url, |
320 const std::string& version_id, | 326 const std::string& version_id, |
321 const DownloadVersionCallback& callback) { | 327 const DownloadVersionCallback& callback) { |
322 // TODO(tzik): Implement this before we support manual conflict resolution. | 328 // TODO(tzik): Implement this before we support manual conflict resolution. |
323 callback.Run(SYNC_STATUS_FAILED, webkit_blob::ScopedFile()); | 329 callback.Run(SYNC_STATUS_FAILED, webkit_blob::ScopedFile()); |
324 } | 330 } |
325 | 331 |
326 void SyncEngine::PromoteDemotedChanges() { | 332 void SyncEngine::PromoteDemotedChanges() { |
327 if (metadata_database_ && metadata_database_->HasLowPriorityDirtyTracker()) { | 333 if (context_->GetMetadataDatabase() && |
328 metadata_database_->PromoteLowerPriorityTrackersToNormal(); | 334 context_->GetMetadataDatabase()->HasLowPriorityDirtyTracker()) { |
| 335 context_->GetMetadataDatabase()->PromoteLowerPriorityTrackersToNormal(); |
329 FOR_EACH_OBSERVER( | 336 FOR_EACH_OBSERVER( |
330 Observer, | 337 Observer, |
331 service_observers_, | 338 service_observers_, |
332 OnRemoteChangeQueueUpdated( | 339 OnRemoteChangeQueueUpdated( |
333 metadata_database_->CountDirtyTracker())); | 340 context_->GetMetadataDatabase()->CountDirtyTracker())); |
334 } | 341 } |
335 } | 342 } |
336 | 343 |
337 void SyncEngine::ApplyLocalChange( | 344 void SyncEngine::ApplyLocalChange( |
338 const FileChange& local_change, | 345 const FileChange& local_change, |
339 const base::FilePath& local_path, | 346 const base::FilePath& local_path, |
340 const SyncFileMetadata& local_metadata, | 347 const SyncFileMetadata& local_metadata, |
341 const fileapi::FileSystemURL& url, | 348 const fileapi::FileSystemURL& url, |
342 const SyncStatusCallback& callback) { | 349 const SyncStatusCallback& callback) { |
343 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( | 350 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( |
344 this, local_metadata, local_change, local_path, url); | 351 context_.get(), local_metadata, local_change, local_path, url); |
345 task_manager_->ScheduleSyncTask( | 352 task_manager_->ScheduleSyncTask( |
346 FROM_HERE, | 353 FROM_HERE, |
347 scoped_ptr<SyncTask>(syncer), | 354 scoped_ptr<SyncTask>(syncer), |
348 SyncTaskManager::PRIORITY_MED, | 355 SyncTaskManager::PRIORITY_MED, |
349 base::Bind(&SyncEngine::DidApplyLocalChange, | 356 base::Bind(&SyncEngine::DidApplyLocalChange, |
350 weak_ptr_factory_.GetWeakPtr(), | 357 weak_ptr_factory_.GetWeakPtr(), |
351 syncer, callback)); | 358 syncer, callback)); |
352 } | 359 } |
353 | 360 |
354 void SyncEngine::MaybeScheduleNextTask() { | 361 void SyncEngine::MaybeScheduleNextTask() { |
355 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 362 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
356 return; | 363 return; |
357 | 364 |
358 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. | 365 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. |
359 // TODO(tzik): Add an interface to get the number of dirty trackers to | 366 // TODO(tzik): Add an interface to get the number of dirty trackers to |
360 // MetadataDatabase. | 367 // MetadataDatabase. |
361 | 368 |
362 MaybeStartFetchChanges(); | 369 MaybeStartFetchChanges(); |
363 } | 370 } |
364 | 371 |
365 void SyncEngine::NotifyLastOperationStatus( | 372 void SyncEngine::NotifyLastOperationStatus( |
366 SyncStatusCode sync_status, | 373 SyncStatusCode sync_status, |
367 bool used_network) { | 374 bool used_network) { |
368 UpdateServiceStateFromSyncStatusCode(sync_status, used_network); | 375 UpdateServiceStateFromSyncStatusCode(sync_status, used_network); |
369 if (metadata_database_) { | 376 if (context_->GetMetadataDatabase()) { |
370 FOR_EACH_OBSERVER( | 377 FOR_EACH_OBSERVER( |
371 Observer, | 378 Observer, |
372 service_observers_, | 379 service_observers_, |
373 OnRemoteChangeQueueUpdated( | 380 OnRemoteChangeQueueUpdated( |
374 metadata_database_->CountDirtyTracker())); | 381 context_->GetMetadataDatabase()->CountDirtyTracker())); |
375 } | 382 } |
376 } | 383 } |
377 | 384 |
378 void SyncEngine::OnNotificationReceived() { | 385 void SyncEngine::OnNotificationReceived() { |
379 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) | 386 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) |
380 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); | 387 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); |
381 | 388 |
382 should_check_remote_change_ = true; | 389 should_check_remote_change_ = true; |
383 MaybeScheduleNextTask(); | 390 MaybeScheduleNextTask(); |
384 } | 391 } |
385 | 392 |
386 void SyncEngine::OnPushNotificationEnabled(bool enabled) {} | 393 void SyncEngine::OnPushNotificationEnabled(bool enabled) {} |
387 | 394 |
388 void SyncEngine::OnReadyToSendRequests() { | 395 void SyncEngine::OnReadyToSendRequests() { |
389 if (service_state_ == REMOTE_SERVICE_OK) | 396 if (service_state_ == REMOTE_SERVICE_OK) |
390 return; | 397 return; |
391 UpdateServiceState(REMOTE_SERVICE_OK, "Authenticated"); | 398 UpdateServiceState(REMOTE_SERVICE_OK, "Authenticated"); |
392 | 399 |
393 if (!metadata_database_ && signin_manager_) { | 400 if (!context_->GetMetadataDatabase() && signin_manager_) { |
394 drive_service_->Initialize(signin_manager_->GetAuthenticatedAccountId()); | 401 context_->GetDriveService()->Initialize( |
| 402 signin_manager_->GetAuthenticatedAccountId()); |
395 PostInitializeTask(); | 403 PostInitializeTask(); |
396 return; | 404 return; |
397 } | 405 } |
398 | 406 |
399 should_check_remote_change_ = true; | 407 should_check_remote_change_ = true; |
400 MaybeScheduleNextTask(); | 408 MaybeScheduleNextTask(); |
401 } | 409 } |
402 | 410 |
403 void SyncEngine::OnRefreshTokenInvalid() { | 411 void SyncEngine::OnRefreshTokenInvalid() { |
404 UpdateServiceState( | 412 UpdateServiceState( |
(...skipping 10 matching lines...) Expand all Loading... |
415 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, "Disconnected"); | 423 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, "Disconnected"); |
416 } else if (!network_available_ && new_network_availability) { | 424 } else if (!network_available_ && new_network_availability) { |
417 UpdateServiceState(REMOTE_SERVICE_OK, "Connected"); | 425 UpdateServiceState(REMOTE_SERVICE_OK, "Connected"); |
418 should_check_remote_change_ = true; | 426 should_check_remote_change_ = true; |
419 MaybeStartFetchChanges(); | 427 MaybeStartFetchChanges(); |
420 } | 428 } |
421 network_available_ = new_network_availability; | 429 network_available_ = new_network_availability; |
422 } | 430 } |
423 | 431 |
424 drive::DriveServiceInterface* SyncEngine::GetDriveService() { | 432 drive::DriveServiceInterface* SyncEngine::GetDriveService() { |
425 return drive_service_.get(); | 433 return context_->GetDriveService(); |
426 } | 434 } |
427 | 435 |
428 drive::DriveUploaderInterface* SyncEngine::GetDriveUploader() { | 436 drive::DriveUploaderInterface* SyncEngine::GetDriveUploader() { |
429 return drive_uploader_.get(); | 437 return context_->GetDriveUploader(); |
430 } | 438 } |
431 | 439 |
432 MetadataDatabase* SyncEngine::GetMetadataDatabase() { | 440 MetadataDatabase* SyncEngine::GetMetadataDatabase() { |
433 return metadata_database_.get(); | 441 return context_->GetMetadataDatabase(); |
434 } | 442 } |
435 | 443 |
436 RemoteChangeProcessor* SyncEngine::GetRemoteChangeProcessor() { | 444 RemoteChangeProcessor* SyncEngine::GetRemoteChangeProcessor() { |
437 return remote_change_processor_; | 445 return remote_change_processor_; |
438 } | 446 } |
439 | 447 |
440 base::SequencedTaskRunner* SyncEngine::GetBlockingTaskRunner() { | 448 base::SequencedTaskRunner* SyncEngine::GetBlockingTaskRunner() { |
441 return task_runner_.get(); | 449 return context_->GetBlockingTaskRunner(); |
442 } | 450 } |
443 | 451 |
444 SyncEngine::SyncEngine(const base::FilePath& base_dir, | 452 SyncEngine::SyncEngine(const base::FilePath& base_dir, |
445 base::SequencedTaskRunner* task_runner, | 453 base::SequencedTaskRunner* task_runner, |
446 scoped_ptr<drive::DriveServiceInterface> drive_service, | 454 scoped_ptr<drive::DriveServiceInterface> drive_service, |
447 scoped_ptr<drive::DriveUploaderInterface> drive_uploader, | 455 scoped_ptr<drive::DriveUploaderInterface> drive_uploader, |
448 drive::DriveNotificationManager* notification_manager, | 456 drive::DriveNotificationManager* notification_manager, |
449 ExtensionServiceInterface* extension_service, | 457 ExtensionServiceInterface* extension_service, |
450 SigninManagerBase* signin_manager, | 458 SigninManagerBase* signin_manager, |
451 leveldb::Env* env_override) | 459 leveldb::Env* env_override) |
452 : base_dir_(base_dir), | 460 : base_dir_(base_dir), |
453 task_runner_(task_runner), | |
454 env_override_(env_override), | 461 env_override_(env_override), |
455 drive_service_(drive_service.Pass()), | |
456 drive_uploader_(drive_uploader.Pass()), | |
457 notification_manager_(notification_manager), | 462 notification_manager_(notification_manager), |
458 extension_service_(extension_service), | 463 extension_service_(extension_service), |
459 signin_manager_(signin_manager), | 464 signin_manager_(signin_manager), |
460 remote_change_processor_(NULL), | 465 remote_change_processor_(NULL), |
461 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), | 466 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), |
462 should_check_conflict_(true), | 467 should_check_conflict_(true), |
463 should_check_remote_change_(true), | 468 should_check_remote_change_(true), |
464 listing_remote_changes_(false), | 469 listing_remote_changes_(false), |
465 sync_enabled_(false), | 470 sync_enabled_(false), |
466 default_conflict_resolution_policy_( | 471 default_conflict_resolution_policy_( |
467 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), | 472 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), |
468 network_available_(false), | 473 network_available_(false), |
469 weak_ptr_factory_(this) {} | 474 context_(new SyncEngineContext()), |
| 475 weak_ptr_factory_(this) { |
| 476 // TODO(peria): Move following setters into constructor of Context. |
| 477 context_->SetDriveService(drive_service.Pass()); |
| 478 context_->SetDriveUploader(drive_uploader.Pass()); |
| 479 context_->SetSequencedTaskRunner(task_runner); |
| 480 } |
470 | 481 |
471 void SyncEngine::DoDisableApp(const std::string& app_id, | 482 void SyncEngine::DoDisableApp(const std::string& app_id, |
472 const SyncStatusCallback& callback) { | 483 const SyncStatusCallback& callback) { |
473 if (metadata_database_) | 484 if (context_->GetMetadataDatabase()) |
474 metadata_database_->DisableApp(app_id, callback); | 485 context_->GetMetadataDatabase()->DisableApp(app_id, callback); |
475 else | 486 else |
476 callback.Run(SYNC_STATUS_OK); | 487 callback.Run(SYNC_STATUS_OK); |
477 } | 488 } |
478 | 489 |
479 void SyncEngine::DoEnableApp(const std::string& app_id, | 490 void SyncEngine::DoEnableApp(const std::string& app_id, |
480 const SyncStatusCallback& callback) { | 491 const SyncStatusCallback& callback) { |
481 if (metadata_database_) | 492 if (context_->GetMetadataDatabase()) |
482 metadata_database_->EnableApp(app_id, callback); | 493 context_->GetMetadataDatabase()->EnableApp(app_id, callback); |
483 else | 494 else |
484 callback.Run(SYNC_STATUS_OK); | 495 callback.Run(SYNC_STATUS_OK); |
485 } | 496 } |
486 | 497 |
487 void SyncEngine::PostInitializeTask() { | 498 void SyncEngine::PostInitializeTask() { |
488 DCHECK(!metadata_database_); | 499 DCHECK(!context_->GetMetadataDatabase()); |
489 | 500 |
490 // This initializer task may not run if metadata_database_ is already | 501 // This initializer task may not run if MetadataDatabase in context_ is |
491 // initialized when it runs. | 502 // already initialized when it runs. |
492 SyncEngineInitializer* initializer = | 503 SyncEngineInitializer* initializer = |
493 new SyncEngineInitializer(this, | 504 new SyncEngineInitializer(context_.get(), |
494 task_runner_.get(), | 505 context_->GetBlockingTaskRunner(), |
495 drive_service_.get(), | 506 context_->GetDriveService(), |
496 base_dir_.Append(kDatabaseName), | 507 base_dir_.Append(kDatabaseName), |
497 env_override_); | 508 env_override_); |
498 task_manager_->ScheduleSyncTask( | 509 task_manager_->ScheduleSyncTask( |
499 FROM_HERE, | 510 FROM_HERE, |
500 scoped_ptr<SyncTask>(initializer), | 511 scoped_ptr<SyncTask>(initializer), |
501 SyncTaskManager::PRIORITY_HIGH, | 512 SyncTaskManager::PRIORITY_HIGH, |
502 base::Bind(&SyncEngine::DidInitialize, weak_ptr_factory_.GetWeakPtr(), | 513 base::Bind(&SyncEngine::DidInitialize, weak_ptr_factory_.GetWeakPtr(), |
503 initializer)); | 514 initializer)); |
504 } | 515 } |
505 | 516 |
506 void SyncEngine::DidInitialize(SyncEngineInitializer* initializer, | 517 void SyncEngine::DidInitialize(SyncEngineInitializer* initializer, |
507 SyncStatusCode status) { | 518 SyncStatusCode status) { |
508 if (status != SYNC_STATUS_OK) { | 519 if (status != SYNC_STATUS_OK) { |
509 if (drive_service_->HasRefreshToken()) { | 520 if (context_->GetDriveService()->HasRefreshToken()) { |
510 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 521 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
511 "Could not initialize remote service"); | 522 "Could not initialize remote service"); |
512 } else { | 523 } else { |
513 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 524 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
514 "Authentication required."); | 525 "Authentication required."); |
515 } | 526 } |
516 return; | 527 return; |
517 } | 528 } |
518 | 529 |
519 scoped_ptr<MetadataDatabase> metadata_database = | 530 scoped_ptr<MetadataDatabase> metadata_database = |
520 initializer->PassMetadataDatabase(); | 531 initializer->PassMetadataDatabase(); |
521 if (metadata_database) | 532 if (metadata_database) |
522 metadata_database_ = metadata_database.Pass(); | 533 context_->SetMetadataDatabase(metadata_database.Pass()); |
523 | 534 |
524 DCHECK(metadata_database_); | |
525 UpdateRegisteredApps(); | 535 UpdateRegisteredApps(); |
526 } | 536 } |
527 | 537 |
528 void SyncEngine::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 538 void SyncEngine::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
529 const SyncFileCallback& callback, | 539 const SyncFileCallback& callback, |
530 SyncStatusCode status) { | 540 SyncStatusCode status) { |
531 if (syncer->is_sync_root_deletion()) { | 541 if (syncer->is_sync_root_deletion()) { |
532 MetadataDatabase::ClearDatabase(metadata_database_.Pass()); | 542 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
533 PostInitializeTask(); | 543 PostInitializeTask(); |
534 callback.Run(status, syncer->url()); | 544 callback.Run(status, syncer->url()); |
535 return; | 545 return; |
536 } | 546 } |
537 | 547 |
538 if (status == SYNC_STATUS_OK) { | 548 if (status == SYNC_STATUS_OK) { |
539 if (syncer->sync_action() != SYNC_ACTION_NONE && | 549 if (syncer->sync_action() != SYNC_ACTION_NONE && |
540 syncer->url().is_valid()) { | 550 syncer->url().is_valid()) { |
541 FOR_EACH_OBSERVER(FileStatusObserver, | 551 FOR_EACH_OBSERVER(FileStatusObserver, |
542 file_status_observers_, | 552 file_status_observers_, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 | 587 |
578 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { | 588 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { |
579 RegisterOrigin(syncer->url().origin(), | 589 RegisterOrigin(syncer->url().origin(), |
580 base::Bind(&EmptyStatusCallback)); | 590 base::Bind(&EmptyStatusCallback)); |
581 } | 591 } |
582 | 592 |
583 if (syncer->needs_remote_change_listing() && | 593 if (syncer->needs_remote_change_listing() && |
584 !listing_remote_changes_) { | 594 !listing_remote_changes_) { |
585 task_manager_->ScheduleSyncTask( | 595 task_manager_->ScheduleSyncTask( |
586 FROM_HERE, | 596 FROM_HERE, |
587 scoped_ptr<SyncTask>(new ListChangesTask(this)), | 597 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
588 SyncTaskManager::PRIORITY_HIGH, | 598 SyncTaskManager::PRIORITY_HIGH, |
589 base::Bind(&SyncEngine::DidFetchChanges, | 599 base::Bind(&SyncEngine::DidFetchChanges, |
590 weak_ptr_factory_.GetWeakPtr())); | 600 weak_ptr_factory_.GetWeakPtr())); |
591 should_check_remote_change_ = false; | 601 should_check_remote_change_ = false; |
592 listing_remote_changes_ = true; | 602 listing_remote_changes_ = true; |
593 time_to_check_changes_ = | 603 time_to_check_changes_ = |
594 base::TimeTicks::Now() + | 604 base::TimeTicks::Now() + |
595 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 605 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
596 } | 606 } |
597 | 607 |
598 if (status != SYNC_STATUS_OK && | 608 if (status != SYNC_STATUS_OK && |
599 status != SYNC_STATUS_NO_CHANGE_TO_SYNC) { | 609 status != SYNC_STATUS_NO_CHANGE_TO_SYNC) { |
600 callback.Run(status); | 610 callback.Run(status); |
601 return; | 611 return; |
602 } | 612 } |
603 | 613 |
604 if (status == SYNC_STATUS_OK) | 614 if (status == SYNC_STATUS_OK) |
605 should_check_conflict_ = true; | 615 should_check_conflict_ = true; |
606 | 616 |
607 callback.Run(status); | 617 callback.Run(status); |
608 } | 618 } |
609 | 619 |
610 void SyncEngine::MaybeStartFetchChanges() { | 620 void SyncEngine::MaybeStartFetchChanges() { |
611 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 621 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
612 return; | 622 return; |
613 | 623 |
614 if (!metadata_database_) | 624 if (!context_->GetMetadataDatabase()) |
615 return; | 625 return; |
616 | 626 |
617 if (listing_remote_changes_) | 627 if (listing_remote_changes_) |
618 return; | 628 return; |
619 | 629 |
620 base::TimeTicks now = base::TimeTicks::Now(); | 630 base::TimeTicks now = base::TimeTicks::Now(); |
621 if (!should_check_remote_change_ && now < time_to_check_changes_) { | 631 if (!should_check_remote_change_ && now < time_to_check_changes_) { |
622 if (!metadata_database_->HasDirtyTracker() && should_check_conflict_) { | 632 if (!context_->GetMetadataDatabase()->HasDirtyTracker() && |
| 633 should_check_conflict_) { |
623 should_check_conflict_ = false; | 634 should_check_conflict_ = false; |
624 task_manager_->ScheduleSyncTaskIfIdle( | 635 task_manager_->ScheduleSyncTaskIfIdle( |
625 FROM_HERE, | 636 FROM_HERE, |
626 scoped_ptr<SyncTask>(new ConflictResolver(this)), | 637 scoped_ptr<SyncTask>(new ConflictResolver(context_.get())), |
627 base::Bind(&SyncEngine::DidResolveConflict, | 638 base::Bind(&SyncEngine::DidResolveConflict, |
628 weak_ptr_factory_.GetWeakPtr())); | 639 weak_ptr_factory_.GetWeakPtr())); |
629 } | 640 } |
630 return; | 641 return; |
631 } | 642 } |
632 | 643 |
633 if (task_manager_->ScheduleSyncTaskIfIdle( | 644 if (task_manager_->ScheduleSyncTaskIfIdle( |
634 FROM_HERE, | 645 FROM_HERE, |
635 scoped_ptr<SyncTask>(new ListChangesTask(this)), | 646 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
636 base::Bind(&SyncEngine::DidFetchChanges, | 647 base::Bind(&SyncEngine::DidFetchChanges, |
637 weak_ptr_factory_.GetWeakPtr()))) { | 648 weak_ptr_factory_.GetWeakPtr()))) { |
638 should_check_remote_change_ = false; | 649 should_check_remote_change_ = false; |
639 listing_remote_changes_ = true; | 650 listing_remote_changes_ = true; |
640 time_to_check_changes_ = | 651 time_to_check_changes_ = |
641 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 652 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
642 } | 653 } |
643 } | 654 } |
644 | 655 |
645 void SyncEngine::DidResolveConflict(SyncStatusCode status) { | 656 void SyncEngine::DidResolveConflict(SyncStatusCode status) { |
(...skipping 26 matching lines...) Expand all Loading... |
672 case SYNC_STATUS_ACCESS_FORBIDDEN: | 683 case SYNC_STATUS_ACCESS_FORBIDDEN: |
673 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 684 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
674 "Access forbidden"); | 685 "Access forbidden"); |
675 break; | 686 break; |
676 | 687 |
677 // Errors which could make the service temporarily unavailable. | 688 // Errors which could make the service temporarily unavailable. |
678 case SYNC_STATUS_SERVICE_TEMPORARILY_UNAVAILABLE: | 689 case SYNC_STATUS_SERVICE_TEMPORARILY_UNAVAILABLE: |
679 case SYNC_STATUS_NETWORK_ERROR: | 690 case SYNC_STATUS_NETWORK_ERROR: |
680 case SYNC_STATUS_ABORT: | 691 case SYNC_STATUS_ABORT: |
681 case SYNC_STATUS_FAILED: | 692 case SYNC_STATUS_FAILED: |
682 if (drive_service_->HasRefreshToken()) { | 693 if (context_->GetDriveService()->HasRefreshToken()) { |
683 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 694 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
684 "Network or temporary service error."); | 695 "Network or temporary service error."); |
685 } else { | 696 } else { |
686 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 697 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
687 "Authentication required"); | 698 "Authentication required"); |
688 } | 699 } |
689 break; | 700 break; |
690 | 701 |
691 // Errors which would require manual user intervention to resolve. | 702 // Errors which would require manual user intervention to resolve. |
692 case SYNC_DATABASE_ERROR_CORRUPTION: | 703 case SYNC_DATABASE_ERROR_CORRUPTION: |
(...skipping 22 matching lines...) Expand all Loading... |
715 old_state, GetCurrentState(), description.c_str()); | 726 old_state, GetCurrentState(), description.c_str()); |
716 FOR_EACH_OBSERVER( | 727 FOR_EACH_OBSERVER( |
717 Observer, service_observers_, | 728 Observer, service_observers_, |
718 OnRemoteServiceStateUpdated(GetCurrentState(), description)); | 729 OnRemoteServiceStateUpdated(GetCurrentState(), description)); |
719 } | 730 } |
720 | 731 |
721 void SyncEngine::UpdateRegisteredApps() { | 732 void SyncEngine::UpdateRegisteredApps() { |
722 if (!extension_service_) | 733 if (!extension_service_) |
723 return; | 734 return; |
724 | 735 |
725 DCHECK(metadata_database_); | 736 DCHECK(context_->GetMetadataDatabase()); |
726 std::vector<std::string> app_ids; | 737 std::vector<std::string> app_ids; |
727 metadata_database_->GetRegisteredAppIDs(&app_ids); | 738 context_->GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); |
728 | 739 |
729 // Update the status of every origin using status from ExtensionService. | 740 // Update the status of every origin using status from ExtensionService. |
730 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | 741 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); |
731 itr != app_ids.end(); ++itr) { | 742 itr != app_ids.end(); ++itr) { |
732 const std::string& app_id = *itr; | 743 const std::string& app_id = *itr; |
733 GURL origin = | 744 GURL origin = |
734 extensions::Extension::GetBaseURLFromExtensionId(app_id); | 745 extensions::Extension::GetBaseURLFromExtensionId(app_id); |
735 if (!extension_service_->GetInstalledExtension(app_id)) { | 746 if (!extension_service_->GetInstalledExtension(app_id)) { |
736 // Extension has been uninstalled. | 747 // Extension has been uninstalled. |
737 // (At this stage we can't know if it was unpacked extension or not, | 748 // (At this stage we can't know if it was unpacked extension or not, |
738 // so just purge the remote folder.) | 749 // so just purge the remote folder.) |
739 UninstallOrigin(origin, | 750 UninstallOrigin(origin, |
740 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, | 751 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, |
741 base::Bind(&EmptyStatusCallback)); | 752 base::Bind(&EmptyStatusCallback)); |
742 continue; | 753 continue; |
743 } | 754 } |
744 FileTracker tracker; | 755 FileTracker tracker; |
745 if (!metadata_database_->FindAppRootTracker(app_id, &tracker)) { | 756 if (!context_->GetMetadataDatabase()->FindAppRootTracker(app_id, |
| 757 &tracker)) { |
746 // App will register itself on first run. | 758 // App will register itself on first run. |
747 continue; | 759 continue; |
748 } | 760 } |
749 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); | 761 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); |
750 bool is_app_root_tracker_enabled = | 762 bool is_app_root_tracker_enabled = |
751 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | 763 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; |
752 if (is_app_enabled && !is_app_root_tracker_enabled) | 764 if (is_app_enabled && !is_app_root_tracker_enabled) |
753 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 765 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
754 else if (!is_app_enabled && is_app_root_tracker_enabled) | 766 else if (!is_app_enabled && is_app_root_tracker_enabled) |
755 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 767 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
756 } | 768 } |
757 } | 769 } |
758 | 770 |
759 } // namespace drive_backend | 771 } // namespace drive_backend |
760 } // namespace sync_file_system | 772 } // namespace sync_file_system |
OLD | NEW |