Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(448)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/sync_engine.cc

Issue 213473008: [SyncFS] Split SyncEngine and SyncEngineContext (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698