summaryrefslogtreecommitdiffstats
path: root/components/update_client/action_wait.cc
diff options
context:
space:
mode:
Diffstat (limited to 'components/update_client/action_wait.cc')
-rw-r--r--components/update_client/action_wait.cc61
1 files changed, 61 insertions, 0 deletions
diff --git a/components/update_client/action_wait.cc b/components/update_client/action_wait.cc
new file mode 100644
index 0000000..1e8f8059
--- /dev/null
+++ b/components/update_client/action_wait.cc
@@ -0,0 +1,61 @@
+// 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/thread_task_runner_handle.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()) {
+ const auto item = FindUpdateItemById(update_context->queue.front());
+ if (!item) {
+ item->error_category = static_cast<int>(ErrorCategory::kServiceError);
+ item->error_code = static_cast<int>(ServiceError::ERROR_WAIT);
+ ChangeItemState(item, CrxUpdateItem::State::kNoUpdate);
+ } else {
+ NOTREACHED();
+ }
+ update_context->queue.pop();
+ }
+ callback.Run(static_cast<int>(ServiceError::ERROR_WAIT));
+ }
+
+ NotifyObservers(UpdateClient::Observer::Events::COMPONENT_WAIT,
+ update_context_->queue.front());
+}
+
+void ActionWait::WaitComplete() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ UpdateCrx();
+}
+
+} // namespace update_client