diff options
Diffstat (limited to 'sync/engine/sync_session_job.cc')
-rw-r--r-- | sync/engine/sync_session_job.cc | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/sync/engine/sync_session_job.cc b/sync/engine/sync_session_job.cc new file mode 100644 index 0000000..7dc5661 --- /dev/null +++ b/sync/engine/sync_session_job.cc @@ -0,0 +1,184 @@ +// 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/sync_session_job.h" +#include "sync/internal_api/public/sessions/model_neutral_state.h" + +namespace syncer { + +SyncSessionJob::~SyncSessionJob() {} + +SyncSessionJob::SyncSessionJob( + Purpose purpose, + base::TimeTicks start, + scoped_ptr<sessions::SyncSession> session, + const ConfigurationParams& config_params, + const tracked_objects::Location& from_location) + : purpose_(purpose), + scheduled_start_(start), + session_(session.Pass()), + is_canary_(false), + config_params_(config_params), + finished_(NOT_FINISHED), + from_location_(from_location) { +} + +#define ENUM_CASE(x) case x: return #x; break; +const char* SyncSessionJob::GetPurposeString(SyncSessionJob::Purpose purpose) { + switch (purpose) { + ENUM_CASE(UNKNOWN); + ENUM_CASE(POLL); + ENUM_CASE(NUDGE); + ENUM_CASE(CONFIGURATION); + } + NOTREACHED(); + return ""; +} +#undef ENUM_CASE + +bool SyncSessionJob::Finish(bool early_exit) { + DCHECK_EQ(finished_, NOT_FINISHED); + // Did we run through all SyncerSteps from start_step() to end_step() + // until the SyncSession returned !HasMoreToSync()? + // Note: if not, it's possible the scheduler hasn't started with + // SyncShare yet, it's possible there is still more to sync in the session, + // and it's also possible the job quit part way through due to a premature + // exit condition (such as shutdown). + finished_ = early_exit ? EARLY_EXIT : FINISHED; + + if (early_exit) + return false; + + DCHECK(!session_->HasMoreToSync()); + + // Did we hit any errors along the way? + if (sessions::HasSyncerError( + session_->status_controller().model_neutral_state())) { + return false; + } + + const sessions::ModelNeutralState& state( + session_->status_controller().model_neutral_state()); + switch (purpose_) { + case POLL: + case NUDGE: + DCHECK_NE(state.last_download_updates_result, UNSET); + DCHECK_NE(state.commit_result, UNSET); + break; + case CONFIGURATION: + DCHECK_NE(state.last_download_updates_result, UNSET); + break; + case UNKNOWN: + default: + NOTREACHED(); + } + + if (!config_params_.ready_task.is_null()) + config_params_.ready_task.Run(); + return true; +} + +scoped_ptr<SyncSessionJob> SyncSessionJob::CloneAndAbandon() { + DCHECK_EQ(finished_, NOT_FINISHED); + // Clone |this|, and abandon it by NULL-ing session_. + return scoped_ptr<SyncSessionJob> (new SyncSessionJob( + purpose_, scheduled_start_, session_.Pass(), + config_params_, from_location_)); +} + +scoped_ptr<SyncSessionJob> SyncSessionJob::Clone() const { + DCHECK_GT(finished_, NOT_FINISHED); + return scoped_ptr<SyncSessionJob>(new SyncSessionJob( + purpose_, scheduled_start_, CloneSession().Pass(), + config_params_, from_location_)); +} + +scoped_ptr<SyncSessionJob> SyncSessionJob::CloneFromLocation( + const tracked_objects::Location& from_here) const { + DCHECK_GT(finished_, NOT_FINISHED); + return scoped_ptr<SyncSessionJob>(new SyncSessionJob( + purpose_, scheduled_start_, CloneSession().Pass(), + config_params_, from_here)); +} + +scoped_ptr<sessions::SyncSession> SyncSessionJob::CloneSession() const { + return scoped_ptr<sessions::SyncSession>( + new sessions::SyncSession(session_->context(), + session_->delegate(), session_->source(), session_->routing_info(), + session_->workers())); +} + +bool SyncSessionJob::is_canary() const { + return is_canary_; +} + +SyncSessionJob::Purpose SyncSessionJob::purpose() const { + return purpose_; +} + +base::TimeTicks SyncSessionJob::scheduled_start() const { + return scheduled_start_; +} + +void SyncSessionJob::set_scheduled_start(base::TimeTicks start) { + scheduled_start_ = start; +}; + +const sessions::SyncSession* SyncSessionJob::session() const { + return session_.get(); +} + +sessions::SyncSession* SyncSessionJob::mutable_session() { + return session_.get(); +} + +const tracked_objects::Location& SyncSessionJob::from_location() const { + return from_location_; +} + +ConfigurationParams SyncSessionJob::config_params() const { + return config_params_; +} + +void SyncSessionJob::GrantCanaryPrivilege() { + DCHECK_EQ(finished_, NOT_FINISHED); + DVLOG(2) << "Granting canary priviliege to " << session_.get(); + is_canary_ = true; +} + +SyncerStep SyncSessionJob::start_step() const { + SyncerStep start, end; + GetSyncerStepsForPurpose(purpose_, &start, &end); + return start; +} + +SyncerStep SyncSessionJob::end_step() const { + SyncerStep start, end; + GetSyncerStepsForPurpose(purpose_, &start, &end); + return end; +} + +// static +void SyncSessionJob::GetSyncerStepsForPurpose(Purpose purpose, + SyncerStep* start, + SyncerStep* end) { + switch (purpose) { + case SyncSessionJob::CONFIGURATION: + *start = DOWNLOAD_UPDATES; + *end = APPLY_UPDATES; + return; + case SyncSessionJob::NUDGE: + case SyncSessionJob::POLL: + *start = SYNCER_BEGIN; + *end = SYNCER_END; + return; + default: + NOTREACHED(); + *start = SYNCER_END; + *end = SYNCER_END; + return; + } +} + +} // namespace syncer |