| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "sync/engine/model_changing_syncer_command.h" |
| |
| #include "base/basictypes.h" |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "sync/sessions/status_controller.h" |
| #include "sync/sessions/sync_session.h" |
| |
| namespace syncer { |
| |
| SyncerError ModelChangingSyncerCommand::ExecuteImpl( |
| sessions::SyncSession* session) { |
| work_session_ = session; |
| SyncerError result = SYNCER_OK; |
| |
| const std::set<ModelSafeGroup>& groups_to_change = |
| GetGroupsToChange(*work_session_); |
| for (size_t i = 0; i < session->workers().size(); ++i) { |
| ModelSafeWorker* worker = work_session_->workers()[i]; |
| ModelSafeGroup group = worker->GetModelSafeGroup(); |
| // Skip workers whose group isn't active. |
| if (groups_to_change.count(group) == 0u) { |
| DVLOG(2) << "Skipping worker for group " |
| << ModelSafeGroupToString(group); |
| continue; |
| } |
| |
| sessions::StatusController* status = |
| work_session_->mutable_status_controller(); |
| sessions::ScopedModelSafeGroupRestriction r(status, group); |
| WorkCallback c = base::Bind( |
| &ModelChangingSyncerCommand::StartChangingModel, |
| // We wait until the callback is executed. So it is safe to use |
| // unretained. |
| base::Unretained(this)); |
| |
| SyncerError this_worker_result = worker->DoWorkAndWaitUntilDone(c); |
| // TODO(rlarocque): Figure out a better way to deal with errors from |
| // multiple models at once. See also: crbug.com/109422. |
| if (this_worker_result != SYNCER_OK) |
| result = this_worker_result; |
| } |
| |
| return result; |
| } |
| |
| } // namespace syncer |