| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_worker.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_worker.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 weak_ptr_factory_(this) { | 60 weak_ptr_factory_(this) { |
| 61 sequence_checker_.DetachFromSequence(); | 61 sequence_checker_.DetachFromSequence(); |
| 62 DCHECK(base_dir_.IsAbsolute()); | 62 DCHECK(base_dir_.IsAbsolute()); |
| 63 } | 63 } |
| 64 | 64 |
| 65 SyncWorker::~SyncWorker() { | 65 SyncWorker::~SyncWorker() { |
| 66 observers_.Clear(); | 66 observers_.Clear(); |
| 67 } | 67 } |
| 68 | 68 |
| 69 void SyncWorker::Initialize(std::unique_ptr<SyncEngineContext> context) { | 69 void SyncWorker::Initialize(std::unique_ptr<SyncEngineContext> context) { |
| 70 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 70 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 71 DCHECK(!task_manager_); | 71 DCHECK(!task_manager_); |
| 72 | 72 |
| 73 context_ = std::move(context); | 73 context_ = std::move(context); |
| 74 | 74 |
| 75 task_manager_.reset(new SyncTaskManager( | 75 task_manager_.reset(new SyncTaskManager( |
| 76 weak_ptr_factory_.GetWeakPtr(), 0 /* maximum_background_task */, | 76 weak_ptr_factory_.GetWeakPtr(), 0 /* maximum_background_task */, |
| 77 context_->GetWorkerTaskRunner(), | 77 context_->GetWorkerTaskRunner(), |
| 78 context_->GetWorkerPool())); | 78 context_->GetWorkerPool())); |
| 79 task_manager_->Initialize(SYNC_STATUS_OK); | 79 task_manager_->Initialize(SYNC_STATUS_OK); |
| 80 | 80 |
| 81 PostInitializeTask(); | 81 PostInitializeTask(); |
| 82 } | 82 } |
| 83 | 83 |
| 84 void SyncWorker::RegisterOrigin( | 84 void SyncWorker::RegisterOrigin( |
| 85 const GURL& origin, | 85 const GURL& origin, |
| 86 const SyncStatusCallback& callback) { | 86 const SyncStatusCallback& callback) { |
| 87 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 87 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 88 | 88 |
| 89 if (!GetMetadataDatabase()) | 89 if (!GetMetadataDatabase()) |
| 90 PostInitializeTask(); | 90 PostInitializeTask(); |
| 91 | 91 |
| 92 std::unique_ptr<RegisterAppTask> task( | 92 std::unique_ptr<RegisterAppTask> task( |
| 93 new RegisterAppTask(context_.get(), origin.host())); | 93 new RegisterAppTask(context_.get(), origin.host())); |
| 94 if (task->CanFinishImmediately()) { | 94 if (task->CanFinishImmediately()) { |
| 95 callback.Run(SYNC_STATUS_OK); | 95 callback.Run(SYNC_STATUS_OK); |
| 96 return; | 96 return; |
| 97 } | 97 } |
| 98 | 98 |
| 99 task_manager_->ScheduleSyncTask(FROM_HERE, std::move(task), | 99 task_manager_->ScheduleSyncTask(FROM_HERE, std::move(task), |
| 100 SyncTaskManager::PRIORITY_HIGH, callback); | 100 SyncTaskManager::PRIORITY_HIGH, callback); |
| 101 } | 101 } |
| 102 | 102 |
| 103 void SyncWorker::EnableOrigin( | 103 void SyncWorker::EnableOrigin( |
| 104 const GURL& origin, | 104 const GURL& origin, |
| 105 const SyncStatusCallback& callback) { | 105 const SyncStatusCallback& callback) { |
| 106 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 106 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 107 | 107 |
| 108 task_manager_->ScheduleTask( | 108 task_manager_->ScheduleTask( |
| 109 FROM_HERE, | 109 FROM_HERE, |
| 110 base::Bind(&SyncWorker::DoEnableApp, | 110 base::Bind(&SyncWorker::DoEnableApp, |
| 111 weak_ptr_factory_.GetWeakPtr(), | 111 weak_ptr_factory_.GetWeakPtr(), |
| 112 origin.host()), | 112 origin.host()), |
| 113 SyncTaskManager::PRIORITY_HIGH, | 113 SyncTaskManager::PRIORITY_HIGH, |
| 114 callback); | 114 callback); |
| 115 } | 115 } |
| 116 | 116 |
| 117 void SyncWorker::DisableOrigin( | 117 void SyncWorker::DisableOrigin( |
| 118 const GURL& origin, | 118 const GURL& origin, |
| 119 const SyncStatusCallback& callback) { | 119 const SyncStatusCallback& callback) { |
| 120 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 120 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 121 | 121 |
| 122 task_manager_->ScheduleTask( | 122 task_manager_->ScheduleTask( |
| 123 FROM_HERE, | 123 FROM_HERE, |
| 124 base::Bind(&SyncWorker::DoDisableApp, | 124 base::Bind(&SyncWorker::DoDisableApp, |
| 125 weak_ptr_factory_.GetWeakPtr(), | 125 weak_ptr_factory_.GetWeakPtr(), |
| 126 origin.host()), | 126 origin.host()), |
| 127 SyncTaskManager::PRIORITY_HIGH, | 127 SyncTaskManager::PRIORITY_HIGH, |
| 128 callback); | 128 callback); |
| 129 } | 129 } |
| 130 | 130 |
| 131 void SyncWorker::UninstallOrigin( | 131 void SyncWorker::UninstallOrigin( |
| 132 const GURL& origin, | 132 const GURL& origin, |
| 133 RemoteFileSyncService::UninstallFlag flag, | 133 RemoteFileSyncService::UninstallFlag flag, |
| 134 const SyncStatusCallback& callback) { | 134 const SyncStatusCallback& callback) { |
| 135 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 135 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 136 | 136 |
| 137 task_manager_->ScheduleSyncTask( | 137 task_manager_->ScheduleSyncTask( |
| 138 FROM_HERE, std::unique_ptr<SyncTask>( | 138 FROM_HERE, std::unique_ptr<SyncTask>( |
| 139 new UninstallAppTask(context_.get(), origin.host(), flag)), | 139 new UninstallAppTask(context_.get(), origin.host(), flag)), |
| 140 SyncTaskManager::PRIORITY_HIGH, callback); | 140 SyncTaskManager::PRIORITY_HIGH, callback); |
| 141 } | 141 } |
| 142 | 142 |
| 143 void SyncWorker::ProcessRemoteChange(const SyncFileCallback& callback) { | 143 void SyncWorker::ProcessRemoteChange(const SyncFileCallback& callback) { |
| 144 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 144 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 145 | 145 |
| 146 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); | 146 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); |
| 147 task_manager_->ScheduleSyncTask( | 147 task_manager_->ScheduleSyncTask( |
| 148 FROM_HERE, std::unique_ptr<SyncTask>(syncer), | 148 FROM_HERE, std::unique_ptr<SyncTask>(syncer), |
| 149 SyncTaskManager::PRIORITY_MED, | 149 SyncTaskManager::PRIORITY_MED, |
| 150 base::Bind(&SyncWorker::DidProcessRemoteChange, | 150 base::Bind(&SyncWorker::DidProcessRemoteChange, |
| 151 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); | 151 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); |
| 152 } | 152 } |
| 153 | 153 |
| 154 void SyncWorker::SetRemoteChangeProcessor( | 154 void SyncWorker::SetRemoteChangeProcessor( |
| 155 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) { | 155 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) { |
| 156 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 156 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 157 | 157 |
| 158 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker); | 158 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker); |
| 159 } | 159 } |
| 160 | 160 |
| 161 RemoteServiceState SyncWorker::GetCurrentState() const { | 161 RemoteServiceState SyncWorker::GetCurrentState() const { |
| 162 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 162 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 163 | 163 |
| 164 if (!sync_enabled_) | 164 if (!sync_enabled_) |
| 165 return REMOTE_SERVICE_DISABLED; | 165 return REMOTE_SERVICE_DISABLED; |
| 166 return service_state_; | 166 return service_state_; |
| 167 } | 167 } |
| 168 | 168 |
| 169 void SyncWorker::GetOriginStatusMap( | 169 void SyncWorker::GetOriginStatusMap( |
| 170 const RemoteFileSyncService::StatusMapCallback& callback) { | 170 const RemoteFileSyncService::StatusMapCallback& callback) { |
| 171 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 171 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 172 | 172 |
| 173 if (!GetMetadataDatabase()) | 173 if (!GetMetadataDatabase()) |
| 174 return; | 174 return; |
| 175 | 175 |
| 176 std::vector<std::string> app_ids; | 176 std::vector<std::string> app_ids; |
| 177 GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); | 177 GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); |
| 178 | 178 |
| 179 std::unique_ptr<RemoteFileSyncService::OriginStatusMap> status_map( | 179 std::unique_ptr<RemoteFileSyncService::OriginStatusMap> status_map( |
| 180 new RemoteFileSyncService::OriginStatusMap); | 180 new RemoteFileSyncService::OriginStatusMap); |
| 181 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | 181 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); |
| 182 itr != app_ids.end(); ++itr) { | 182 itr != app_ids.end(); ++itr) { |
| 183 const std::string& app_id = *itr; | 183 const std::string& app_id = *itr; |
| 184 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | 184 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); |
| 185 (*status_map)[origin] = | 185 (*status_map)[origin] = |
| 186 GetMetadataDatabase()->IsAppEnabled(app_id) ? "Enabled" : "Disabled"; | 186 GetMetadataDatabase()->IsAppEnabled(app_id) ? "Enabled" : "Disabled"; |
| 187 } | 187 } |
| 188 | 188 |
| 189 callback.Run(std::move(status_map)); | 189 callback.Run(std::move(status_map)); |
| 190 } | 190 } |
| 191 | 191 |
| 192 std::unique_ptr<base::ListValue> SyncWorker::DumpFiles(const GURL& origin) { | 192 std::unique_ptr<base::ListValue> SyncWorker::DumpFiles(const GURL& origin) { |
| 193 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 193 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 194 | 194 |
| 195 if (!GetMetadataDatabase()) | 195 if (!GetMetadataDatabase()) |
| 196 return std::unique_ptr<base::ListValue>(); | 196 return std::unique_ptr<base::ListValue>(); |
| 197 return GetMetadataDatabase()->DumpFiles(origin.host()); | 197 return GetMetadataDatabase()->DumpFiles(origin.host()); |
| 198 } | 198 } |
| 199 | 199 |
| 200 std::unique_ptr<base::ListValue> SyncWorker::DumpDatabase() { | 200 std::unique_ptr<base::ListValue> SyncWorker::DumpDatabase() { |
| 201 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 201 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 202 | 202 |
| 203 if (!GetMetadataDatabase()) | 203 if (!GetMetadataDatabase()) |
| 204 return std::unique_ptr<base::ListValue>(); | 204 return std::unique_ptr<base::ListValue>(); |
| 205 return GetMetadataDatabase()->DumpDatabase(); | 205 return GetMetadataDatabase()->DumpDatabase(); |
| 206 } | 206 } |
| 207 | 207 |
| 208 void SyncWorker::SetSyncEnabled(bool enabled) { | 208 void SyncWorker::SetSyncEnabled(bool enabled) { |
| 209 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 209 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 210 | 210 |
| 211 if (sync_enabled_ == enabled) | 211 if (sync_enabled_ == enabled) |
| 212 return; | 212 return; |
| 213 | 213 |
| 214 RemoteServiceState old_state = GetCurrentState(); | 214 RemoteServiceState old_state = GetCurrentState(); |
| 215 sync_enabled_ = enabled; | 215 sync_enabled_ = enabled; |
| 216 if (old_state == GetCurrentState()) | 216 if (old_state == GetCurrentState()) |
| 217 return; | 217 return; |
| 218 | 218 |
| 219 FOR_EACH_OBSERVER( | 219 FOR_EACH_OBSERVER( |
| 220 Observer, | 220 Observer, |
| 221 observers_, | 221 observers_, |
| 222 UpdateServiceState( | 222 UpdateServiceState( |
| 223 GetCurrentState(), | 223 GetCurrentState(), |
| 224 enabled ? "Sync is enabled" : "Sync is disabled")); | 224 enabled ? "Sync is enabled" : "Sync is disabled")); |
| 225 } | 225 } |
| 226 | 226 |
| 227 void SyncWorker::PromoteDemotedChanges(const base::Closure& callback) { | 227 void SyncWorker::PromoteDemotedChanges(const base::Closure& callback) { |
| 228 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 228 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 229 | 229 |
| 230 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 230 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
| 231 if (metadata_db && metadata_db->HasDemotedDirtyTracker()) { | 231 if (metadata_db && metadata_db->HasDemotedDirtyTracker()) { |
| 232 metadata_db->PromoteDemotedTrackers(); | 232 metadata_db->PromoteDemotedTrackers(); |
| 233 FOR_EACH_OBSERVER( | 233 FOR_EACH_OBSERVER( |
| 234 Observer, | 234 Observer, |
| 235 observers_, | 235 observers_, |
| 236 OnPendingFileListUpdated(metadata_db->CountDirtyTracker())); | 236 OnPendingFileListUpdated(metadata_db->CountDirtyTracker())); |
| 237 } | 237 } |
| 238 callback.Run(); | 238 callback.Run(); |
| 239 } | 239 } |
| 240 | 240 |
| 241 void SyncWorker::ApplyLocalChange(const FileChange& local_change, | 241 void SyncWorker::ApplyLocalChange(const FileChange& local_change, |
| 242 const base::FilePath& local_path, | 242 const base::FilePath& local_path, |
| 243 const SyncFileMetadata& local_metadata, | 243 const SyncFileMetadata& local_metadata, |
| 244 const storage::FileSystemURL& url, | 244 const storage::FileSystemURL& url, |
| 245 const SyncStatusCallback& callback) { | 245 const SyncStatusCallback& callback) { |
| 246 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 246 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 247 | 247 |
| 248 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( | 248 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( |
| 249 context_.get(), local_metadata, local_change, local_path, url); | 249 context_.get(), local_metadata, local_change, local_path, url); |
| 250 task_manager_->ScheduleSyncTask( | 250 task_manager_->ScheduleSyncTask( |
| 251 FROM_HERE, std::unique_ptr<SyncTask>(syncer), | 251 FROM_HERE, std::unique_ptr<SyncTask>(syncer), |
| 252 SyncTaskManager::PRIORITY_MED, | 252 SyncTaskManager::PRIORITY_MED, |
| 253 base::Bind(&SyncWorker::DidApplyLocalChange, | 253 base::Bind(&SyncWorker::DidApplyLocalChange, |
| 254 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); | 254 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); |
| 255 } | 255 } |
| 256 | 256 |
| 257 void SyncWorker::MaybeScheduleNextTask() { | 257 void SyncWorker::MaybeScheduleNextTask() { |
| 258 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 258 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 259 | 259 |
| 260 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 260 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
| 261 return; | 261 return; |
| 262 | 262 |
| 263 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. | 263 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. |
| 264 // TODO(tzik): Add an interface to get the number of dirty trackers to | 264 // TODO(tzik): Add an interface to get the number of dirty trackers to |
| 265 // MetadataDatabase. | 265 // MetadataDatabase. |
| 266 | 266 |
| 267 if (MaybeStartFetchChanges()) | 267 if (MaybeStartFetchChanges()) |
| 268 return; | 268 return; |
| 269 | 269 |
| 270 if (!call_on_idle_callback_.is_null()) { | 270 if (!call_on_idle_callback_.is_null()) { |
| 271 base::Closure callback = call_on_idle_callback_; | 271 base::Closure callback = call_on_idle_callback_; |
| 272 call_on_idle_callback_.Reset(); | 272 call_on_idle_callback_.Reset(); |
| 273 callback.Run(); | 273 callback.Run(); |
| 274 } | 274 } |
| 275 } | 275 } |
| 276 | 276 |
| 277 void SyncWorker::NotifyLastOperationStatus( | 277 void SyncWorker::NotifyLastOperationStatus( |
| 278 SyncStatusCode status, | 278 SyncStatusCode status, |
| 279 bool used_network) { | 279 bool used_network) { |
| 280 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 280 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 281 | 281 |
| 282 UpdateServiceStateFromSyncStatusCode(status, used_network); | 282 UpdateServiceStateFromSyncStatusCode(status, used_network); |
| 283 | 283 |
| 284 if (GetMetadataDatabase()) { | 284 if (GetMetadataDatabase()) { |
| 285 FOR_EACH_OBSERVER( | 285 FOR_EACH_OBSERVER( |
| 286 Observer, observers_, | 286 Observer, observers_, |
| 287 OnPendingFileListUpdated(GetMetadataDatabase()->CountDirtyTracker())); | 287 OnPendingFileListUpdated(GetMetadataDatabase()->CountDirtyTracker())); |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 | 290 |
| 291 void SyncWorker::RecordTaskLog(std::unique_ptr<TaskLogger::TaskLog> task_log) { | 291 void SyncWorker::RecordTaskLog(std::unique_ptr<TaskLogger::TaskLog> task_log) { |
| 292 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 292 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 293 | 293 |
| 294 context_->GetUITaskRunner()->PostTask( | 294 context_->GetUITaskRunner()->PostTask( |
| 295 FROM_HERE, | 295 FROM_HERE, |
| 296 base::Bind(&TaskLogger::RecordLog, | 296 base::Bind(&TaskLogger::RecordLog, |
| 297 context_->GetTaskLogger(), | 297 context_->GetTaskLogger(), |
| 298 base::Passed(&task_log))); | 298 base::Passed(&task_log))); |
| 299 } | 299 } |
| 300 | 300 |
| 301 void SyncWorker::ActivateService(RemoteServiceState service_state, | 301 void SyncWorker::ActivateService(RemoteServiceState service_state, |
| 302 const std::string& description) { | 302 const std::string& description) { |
| 303 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 303 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 304 UpdateServiceState(service_state, description); | 304 UpdateServiceState(service_state, description); |
| 305 if (!GetMetadataDatabase()) { | 305 if (!GetMetadataDatabase()) { |
| 306 PostInitializeTask(); | 306 PostInitializeTask(); |
| 307 return; | 307 return; |
| 308 } | 308 } |
| 309 | 309 |
| 310 should_check_remote_change_ = true; | 310 should_check_remote_change_ = true; |
| 311 MaybeScheduleNextTask(); | 311 MaybeScheduleNextTask(); |
| 312 } | 312 } |
| 313 | 313 |
| 314 void SyncWorker::DeactivateService(const std::string& description) { | 314 void SyncWorker::DeactivateService(const std::string& description) { |
| 315 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 315 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 316 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, description); | 316 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, description); |
| 317 } | 317 } |
| 318 | 318 |
| 319 void SyncWorker::DetachFromSequence() { | 319 void SyncWorker::DetachFromSequence() { |
| 320 task_manager_->DetachFromSequence(); | 320 task_manager_->DetachFromSequence(); |
| 321 context_->DetachFromSequence(); | 321 context_->DetachFromSequence(); |
| 322 sequence_checker_.DetachFromSequence(); | 322 sequence_checker_.DetachFromSequence(); |
| 323 } | 323 } |
| 324 | 324 |
| 325 void SyncWorker::AddObserver(Observer* observer) { | 325 void SyncWorker::AddObserver(Observer* observer) { |
| 326 observers_.AddObserver(observer); | 326 observers_.AddObserver(observer); |
| 327 } | 327 } |
| 328 | 328 |
| 329 void SyncWorker::DoDisableApp(const std::string& app_id, | 329 void SyncWorker::DoDisableApp(const std::string& app_id, |
| 330 const SyncStatusCallback& callback) { | 330 const SyncStatusCallback& callback) { |
| 331 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 331 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 332 | 332 |
| 333 if (!GetMetadataDatabase()) { | 333 if (!GetMetadataDatabase()) { |
| 334 callback.Run(SYNC_STATUS_OK); | 334 callback.Run(SYNC_STATUS_OK); |
| 335 return; | 335 return; |
| 336 } | 336 } |
| 337 | 337 |
| 338 SyncStatusCode status = GetMetadataDatabase()->DisableApp(app_id); | 338 SyncStatusCode status = GetMetadataDatabase()->DisableApp(app_id); |
| 339 callback.Run(status); | 339 callback.Run(status); |
| 340 } | 340 } |
| 341 | 341 |
| 342 void SyncWorker::DoEnableApp(const std::string& app_id, | 342 void SyncWorker::DoEnableApp(const std::string& app_id, |
| 343 const SyncStatusCallback& callback) { | 343 const SyncStatusCallback& callback) { |
| 344 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 344 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 345 | 345 |
| 346 if (!GetMetadataDatabase()) { | 346 if (!GetMetadataDatabase()) { |
| 347 callback.Run(SYNC_STATUS_OK); | 347 callback.Run(SYNC_STATUS_OK); |
| 348 return; | 348 return; |
| 349 } | 349 } |
| 350 | 350 |
| 351 SyncStatusCode status = GetMetadataDatabase()->EnableApp(app_id); | 351 SyncStatusCode status = GetMetadataDatabase()->EnableApp(app_id); |
| 352 callback.Run(status); | 352 callback.Run(status); |
| 353 } | 353 } |
| 354 | 354 |
| 355 void SyncWorker::PostInitializeTask() { | 355 void SyncWorker::PostInitializeTask() { |
| 356 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 356 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 357 DCHECK(!GetMetadataDatabase()); | 357 DCHECK(!GetMetadataDatabase()); |
| 358 | 358 |
| 359 // This initializer task may not run if MetadataDatabase in context_ is | 359 // This initializer task may not run if MetadataDatabase in context_ is |
| 360 // already initialized when it runs. | 360 // already initialized when it runs. |
| 361 SyncEngineInitializer* initializer = | 361 SyncEngineInitializer* initializer = |
| 362 new SyncEngineInitializer(context_.get(), | 362 new SyncEngineInitializer(context_.get(), |
| 363 base_dir_.Append(kDatabaseName), | 363 base_dir_.Append(kDatabaseName), |
| 364 env_override_); | 364 env_override_); |
| 365 task_manager_->ScheduleSyncTask( | 365 task_manager_->ScheduleSyncTask( |
| 366 FROM_HERE, std::unique_ptr<SyncTask>(initializer), | 366 FROM_HERE, std::unique_ptr<SyncTask>(initializer), |
| 367 SyncTaskManager::PRIORITY_HIGH, | 367 SyncTaskManager::PRIORITY_HIGH, |
| 368 base::Bind(&SyncWorker::DidInitialize, weak_ptr_factory_.GetWeakPtr(), | 368 base::Bind(&SyncWorker::DidInitialize, weak_ptr_factory_.GetWeakPtr(), |
| 369 initializer)); | 369 initializer)); |
| 370 } | 370 } |
| 371 | 371 |
| 372 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, | 372 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, |
| 373 SyncStatusCode status) { | 373 SyncStatusCode status) { |
| 374 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 374 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 375 | 375 |
| 376 if (status == SYNC_STATUS_ACCESS_FORBIDDEN) { | 376 if (status == SYNC_STATUS_ACCESS_FORBIDDEN) { |
| 377 UpdateServiceState(REMOTE_SERVICE_ACCESS_FORBIDDEN, "Access forbidden"); | 377 UpdateServiceState(REMOTE_SERVICE_ACCESS_FORBIDDEN, "Access forbidden"); |
| 378 return; | 378 return; |
| 379 } | 379 } |
| 380 if (status != SYNC_STATUS_OK) { | 380 if (status != SYNC_STATUS_OK) { |
| 381 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 381 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
| 382 "Could not initialize remote service"); | 382 "Could not initialize remote service"); |
| 383 return; | 383 return; |
| 384 } | 384 } |
| 385 | 385 |
| 386 std::unique_ptr<MetadataDatabase> metadata_database = | 386 std::unique_ptr<MetadataDatabase> metadata_database = |
| 387 initializer->PassMetadataDatabase(); | 387 initializer->PassMetadataDatabase(); |
| 388 if (metadata_database) { | 388 if (metadata_database) { |
| 389 context_->SetMetadataDatabase(std::move(metadata_database)); | 389 context_->SetMetadataDatabase(std::move(metadata_database)); |
| 390 return; | 390 return; |
| 391 } | 391 } |
| 392 | 392 |
| 393 UpdateServiceState(REMOTE_SERVICE_OK, std::string()); | 393 UpdateServiceState(REMOTE_SERVICE_OK, std::string()); |
| 394 UpdateRegisteredApps(); | 394 UpdateRegisteredApps(); |
| 395 } | 395 } |
| 396 | 396 |
| 397 void SyncWorker::UpdateRegisteredApps() { | 397 void SyncWorker::UpdateRegisteredApps() { |
| 398 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 398 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
| 399 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 399 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 400 DCHECK(metadata_db); | 400 DCHECK(metadata_db); |
| 401 | 401 |
| 402 std::unique_ptr<std::vector<std::string>> app_ids( | 402 std::unique_ptr<std::vector<std::string>> app_ids( |
| 403 new std::vector<std::string>); | 403 new std::vector<std::string>); |
| 404 metadata_db->GetRegisteredAppIDs(app_ids.get()); | 404 metadata_db->GetRegisteredAppIDs(app_ids.get()); |
| 405 | 405 |
| 406 AppStatusMap* app_status = new AppStatusMap; | 406 AppStatusMap* app_status = new AppStatusMap; |
| 407 base::Closure callback = | 407 base::Closure callback = |
| 408 base::Bind(&SyncWorker::DidQueryAppStatus, | 408 base::Bind(&SyncWorker::DidQueryAppStatus, |
| 409 weak_ptr_factory_.GetWeakPtr(), | 409 weak_ptr_factory_.GetWeakPtr(), |
| (...skipping 29 matching lines...) Expand all Loading... |
| 439 else if (!extension_service->IsExtensionEnabled(app_id)) | 439 else if (!extension_service->IsExtensionEnabled(app_id)) |
| 440 (*status)[app_id] = APP_STATUS_DISABLED; | 440 (*status)[app_id] = APP_STATUS_DISABLED; |
| 441 else | 441 else |
| 442 (*status)[app_id] = APP_STATUS_ENABLED; | 442 (*status)[app_id] = APP_STATUS_ENABLED; |
| 443 } | 443 } |
| 444 | 444 |
| 445 callback.Run(); | 445 callback.Run(); |
| 446 } | 446 } |
| 447 | 447 |
| 448 void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) { | 448 void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) { |
| 449 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 449 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 450 | 450 |
| 451 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 451 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
| 452 DCHECK(metadata_db); | 452 DCHECK(metadata_db); |
| 453 | 453 |
| 454 // Update the status of every origin using status from ExtensionService. | 454 // Update the status of every origin using status from ExtensionService. |
| 455 for (AppStatusMap::const_iterator itr = app_status->begin(); | 455 for (AppStatusMap::const_iterator itr = app_status->begin(); |
| 456 itr != app_status->end(); ++itr) { | 456 itr != app_status->end(); ++itr) { |
| 457 const std::string& app_id = itr->first; | 457 const std::string& app_id = itr->first; |
| 458 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | 458 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); |
| 459 | 459 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 481 if (is_app_enabled && !is_app_root_tracker_enabled) | 481 if (is_app_enabled && !is_app_root_tracker_enabled) |
| 482 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 482 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 483 else if (!is_app_enabled && is_app_root_tracker_enabled) | 483 else if (!is_app_enabled && is_app_root_tracker_enabled) |
| 484 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 484 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
| 485 } | 485 } |
| 486 } | 486 } |
| 487 | 487 |
| 488 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 488 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
| 489 const SyncFileCallback& callback, | 489 const SyncFileCallback& callback, |
| 490 SyncStatusCode status) { | 490 SyncStatusCode status) { |
| 491 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 491 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 492 | 492 |
| 493 if (syncer->is_sync_root_deletion()) { | 493 if (syncer->is_sync_root_deletion()) { |
| 494 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); | 494 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
| 495 PostInitializeTask(); | 495 PostInitializeTask(); |
| 496 callback.Run(status, syncer->url()); | 496 callback.Run(status, syncer->url()); |
| 497 return; | 497 return; |
| 498 } | 498 } |
| 499 | 499 |
| 500 if (status == SYNC_STATUS_OK) { | 500 if (status == SYNC_STATUS_OK) { |
| 501 if (syncer->sync_action() != SYNC_ACTION_NONE && | 501 if (syncer->sync_action() != SYNC_ACTION_NONE && |
| (...skipping 14 matching lines...) Expand all Loading... |
| 516 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); | 516 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); |
| 517 } | 517 } |
| 518 should_check_conflict_ = true; | 518 should_check_conflict_ = true; |
| 519 } | 519 } |
| 520 callback.Run(status, syncer->url()); | 520 callback.Run(status, syncer->url()); |
| 521 } | 521 } |
| 522 | 522 |
| 523 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, | 523 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, |
| 524 const SyncStatusCallback& callback, | 524 const SyncStatusCallback& callback, |
| 525 SyncStatusCode status) { | 525 SyncStatusCode status) { |
| 526 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 526 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 527 | 527 |
| 528 if ((status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) && | 528 if ((status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) && |
| 529 syncer->url().is_valid() && | 529 syncer->url().is_valid() && |
| 530 syncer->sync_action() != SYNC_ACTION_NONE) { | 530 syncer->sync_action() != SYNC_ACTION_NONE) { |
| 531 storage::FileSystemURL updated_url = syncer->url(); | 531 storage::FileSystemURL updated_url = syncer->url(); |
| 532 if (!syncer->target_path().empty()) { | 532 if (!syncer->target_path().empty()) { |
| 533 updated_url = CreateSyncableFileSystemURL(syncer->url().origin(), | 533 updated_url = CreateSyncableFileSystemURL(syncer->url().origin(), |
| 534 syncer->target_path()); | 534 syncer->target_path()); |
| 535 } | 535 } |
| 536 FOR_EACH_OBSERVER(Observer, observers_, | 536 FOR_EACH_OBSERVER(Observer, observers_, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 561 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 561 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
| 562 } | 562 } |
| 563 | 563 |
| 564 if (status == SYNC_STATUS_OK) | 564 if (status == SYNC_STATUS_OK) |
| 565 should_check_conflict_ = true; | 565 should_check_conflict_ = true; |
| 566 | 566 |
| 567 callback.Run(status); | 567 callback.Run(status); |
| 568 } | 568 } |
| 569 | 569 |
| 570 bool SyncWorker::MaybeStartFetchChanges() { | 570 bool SyncWorker::MaybeStartFetchChanges() { |
| 571 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 571 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 572 | 572 |
| 573 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 573 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
| 574 return false; | 574 return false; |
| 575 | 575 |
| 576 if (!GetMetadataDatabase()) | 576 if (!GetMetadataDatabase()) |
| 577 return false; | 577 return false; |
| 578 | 578 |
| 579 if (listing_remote_changes_) | 579 if (listing_remote_changes_) |
| 580 return false; | 580 return false; |
| 581 | 581 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 601 should_check_remote_change_ = false; | 601 should_check_remote_change_ = false; |
| 602 listing_remote_changes_ = true; | 602 listing_remote_changes_ = true; |
| 603 time_to_check_changes_ = | 603 time_to_check_changes_ = |
| 604 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 604 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
| 605 return true; | 605 return true; |
| 606 } | 606 } |
| 607 return false; | 607 return false; |
| 608 } | 608 } |
| 609 | 609 |
| 610 void SyncWorker::DidResolveConflict(SyncStatusCode status) { | 610 void SyncWorker::DidResolveConflict(SyncStatusCode status) { |
| 611 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 611 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 612 | 612 |
| 613 if (status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) | 613 if (status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) |
| 614 should_check_conflict_ = true; | 614 should_check_conflict_ = true; |
| 615 } | 615 } |
| 616 | 616 |
| 617 void SyncWorker::DidFetchChanges(SyncStatusCode status) { | 617 void SyncWorker::DidFetchChanges(SyncStatusCode status) { |
| 618 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 618 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 619 | 619 |
| 620 if (status == SYNC_STATUS_OK) | 620 if (status == SYNC_STATUS_OK) |
| 621 should_check_conflict_ = true; | 621 should_check_conflict_ = true; |
| 622 listing_remote_changes_ = false; | 622 listing_remote_changes_ = false; |
| 623 } | 623 } |
| 624 | 624 |
| 625 void SyncWorker::UpdateServiceStateFromSyncStatusCode( | 625 void SyncWorker::UpdateServiceStateFromSyncStatusCode( |
| 626 SyncStatusCode status, | 626 SyncStatusCode status, |
| 627 bool used_network) { | 627 bool used_network) { |
| 628 switch (status) { | 628 switch (status) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 break; | 661 break; |
| 662 | 662 |
| 663 default: | 663 default: |
| 664 // Other errors don't affect service state | 664 // Other errors don't affect service state |
| 665 break; | 665 break; |
| 666 } | 666 } |
| 667 } | 667 } |
| 668 | 668 |
| 669 void SyncWorker::UpdateServiceState(RemoteServiceState state, | 669 void SyncWorker::UpdateServiceState(RemoteServiceState state, |
| 670 const std::string& description) { | 670 const std::string& description) { |
| 671 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 671 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 672 | 672 |
| 673 RemoteServiceState old_state = GetCurrentState(); | 673 RemoteServiceState old_state = GetCurrentState(); |
| 674 service_state_ = state; | 674 service_state_ = state; |
| 675 | 675 |
| 676 if (old_state == GetCurrentState()) | 676 if (old_state == GetCurrentState()) |
| 677 return; | 677 return; |
| 678 | 678 |
| 679 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 679 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 680 "Service state changed: %d->%d: %s", | 680 "Service state changed: %d->%d: %s", |
| 681 old_state, GetCurrentState(), description.c_str()); | 681 old_state, GetCurrentState(), description.c_str()); |
| 682 | 682 |
| 683 FOR_EACH_OBSERVER( | 683 FOR_EACH_OBSERVER( |
| 684 Observer, observers_, | 684 Observer, observers_, |
| 685 UpdateServiceState(GetCurrentState(), description)); | 685 UpdateServiceState(GetCurrentState(), description)); |
| 686 } | 686 } |
| 687 | 687 |
| 688 void SyncWorker::CallOnIdleForTesting(const base::Closure& callback) { | 688 void SyncWorker::CallOnIdleForTesting(const base::Closure& callback) { |
| 689 if (task_manager_->ScheduleTaskIfIdle( | 689 if (task_manager_->ScheduleTaskIfIdle( |
| 690 FROM_HERE, | 690 FROM_HERE, |
| 691 base::Bind(&InvokeIdleCallback, callback), | 691 base::Bind(&InvokeIdleCallback, callback), |
| 692 base::Bind(&EmptyStatusCallback))) | 692 base::Bind(&EmptyStatusCallback))) |
| 693 return; | 693 return; |
| 694 call_on_idle_callback_ = base::Bind( | 694 call_on_idle_callback_ = base::Bind( |
| 695 &SyncWorker::CallOnIdleForTesting, | 695 &SyncWorker::CallOnIdleForTesting, |
| 696 weak_ptr_factory_.GetWeakPtr(), | 696 weak_ptr_factory_.GetWeakPtr(), |
| 697 callback); | 697 callback); |
| 698 } | 698 } |
| 699 | 699 |
| 700 drive::DriveServiceInterface* SyncWorker::GetDriveService() { | 700 drive::DriveServiceInterface* SyncWorker::GetDriveService() { |
| 701 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 701 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 702 return context_->GetDriveService(); | 702 return context_->GetDriveService(); |
| 703 } | 703 } |
| 704 | 704 |
| 705 drive::DriveUploaderInterface* SyncWorker::GetDriveUploader() { | 705 drive::DriveUploaderInterface* SyncWorker::GetDriveUploader() { |
| 706 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 706 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 707 return context_->GetDriveUploader(); | 707 return context_->GetDriveUploader(); |
| 708 } | 708 } |
| 709 | 709 |
| 710 MetadataDatabase* SyncWorker::GetMetadataDatabase() { | 710 MetadataDatabase* SyncWorker::GetMetadataDatabase() { |
| 711 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 711 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 712 return context_->GetMetadataDatabase(); | 712 return context_->GetMetadataDatabase(); |
| 713 } | 713 } |
| 714 | 714 |
| 715 } // namespace drive_backend | 715 } // namespace drive_backend |
| 716 } // namespace sync_file_system | 716 } // namespace sync_file_system |
| OLD | NEW |