blob: 9c69be27a2784d68c7b2bb011e9ea32031bc9393 [file] [log] [blame]
// Copyright 2015 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 "components/update_client/action_wait.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/location.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/update_client/update_client_errors.h"
#include "components/update_client/update_engine.h"
namespace update_client {
ActionWait::ActionWait(const base::TimeDelta& time_delta)
: time_delta_(time_delta) {
}
ActionWait::~ActionWait() {
DCHECK(thread_checker_.CalledOnValidThread());
}
void ActionWait::Run(UpdateContext* update_context, Callback callback) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(update_context);
ActionImpl::Run(update_context, callback);
const bool result = base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE, base::Bind(&ActionWait::WaitComplete, base::Unretained(this)),
time_delta_);
if (!result) {
// Move all items pending updates to the |kNoUpdate| state then return the
// control flow to the update engine, as the updates in this context are
// completed with an error.
while (!update_context->queue.empty()) {
auto* item = FindUpdateItemById(update_context->queue.front());
DCHECK(item);
item->error_category = static_cast<int>(ErrorCategory::kServiceError);
item->error_code = static_cast<int>(ServiceError::SERVICE_WAIT_FAILED);
ChangeItemState(item, CrxUpdateItem::State::kNoUpdate);
update_context->queue.pop();
}
callback.Run(Error::SERVICE_ERROR);
}
NotifyObservers(UpdateClient::Observer::Events::COMPONENT_WAIT,
update_context_->queue.front());
}
void ActionWait::WaitComplete() {
DCHECK(thread_checker_.CalledOnValidThread());
UpdateCrx();
}
} // namespace update_client