blob: d4e5cc490b31003b80ecf740414cb41a7f624936 [file] [log] [blame]
// Copyright (c) 2009 The Chromium OS 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 "update_engine/action_processor.h"
#include <string>
#include "base/logging.h"
#include "update_engine/action.h"
using std::string;
namespace chromeos_update_engine {
ActionProcessor::ActionProcessor()
: current_action_(NULL), delegate_(NULL) {}
ActionProcessor::~ActionProcessor() {
if (IsRunning()) {
StopProcessing();
}
for (std::deque<AbstractAction*>::iterator it = actions_.begin();
it != actions_.end(); ++it) {
(*it)->SetProcessor(NULL);
}
}
void ActionProcessor::EnqueueAction(AbstractAction* action) {
actions_.push_back(action);
action->SetProcessor(this);
}
void ActionProcessor::StartProcessing() {
CHECK(!IsRunning());
if (!actions_.empty()) {
current_action_ = actions_.front();
LOG(INFO) << "ActionProcessor::StartProcessing: "
<< current_action_->Type();
actions_.pop_front();
current_action_->PerformAction();
}
}
void ActionProcessor::StopProcessing() {
CHECK(IsRunning());
CHECK(current_action_);
current_action_->TerminateProcessing();
CHECK(current_action_);
current_action_->SetProcessor(NULL);
LOG(INFO) << "ActionProcessor::StopProcessing: aborted "
<< current_action_->Type();
current_action_ = NULL;
if (delegate_)
delegate_->ProcessingStopped(this);
}
void ActionProcessor::ActionComplete(AbstractAction* actionptr,
ErrorCode code) {
CHECK_EQ(actionptr, current_action_);
if (delegate_)
delegate_->ActionCompleted(this, actionptr, code);
string old_type = current_action_->Type();
current_action_->SetProcessor(NULL);
current_action_ = NULL;
if (actions_.empty()) {
LOG(INFO) << "ActionProcessor::ActionComplete: finished last action of"
" type " << old_type;
} else if (code != kErrorCodeSuccess) {
LOG(INFO) << "ActionProcessor::ActionComplete: " << old_type
<< " action failed. Aborting processing.";
actions_.clear();
}
if (actions_.empty()) {
LOG(INFO) << "ActionProcessor::ActionComplete: finished last action of"
" type " << old_type;
if (delegate_) {
delegate_->ProcessingDone(this, code);
}
return;
}
current_action_ = actions_.front();
actions_.pop_front();
LOG(INFO) << "ActionProcessor::ActionComplete: finished " << old_type
<< ", starting " << current_action_->Type();
current_action_->PerformAction();
}
} // namespace chromeos_update_engine