1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/time/time.h"
6#include "chrome/browser/extensions/api/recovery_private/recovery_operation.h"
7#include "chrome/browser/extensions/api/recovery_private/recovery_operation_manager.h"
8
9namespace extensions {
10namespace recovery {
11
12namespace {
13
14recovery_api::Stage nextStage(recovery_api::Stage stage) {
15  if (stage == recovery_api::STAGE_CONFIRMATION) {
16    return recovery_api::STAGE_DOWNLOAD;
17  } else if (stage == recovery_api::STAGE_DOWNLOAD) {
18    return recovery_api::STAGE_VERIFYDOWNLOAD;
19  } else if (stage == recovery_api::STAGE_VERIFYDOWNLOAD) {
20    return recovery_api::STAGE_WRITE;
21  } else if (stage == recovery_api::STAGE_WRITE) {
22    return recovery_api::STAGE_VERIFYWRITE;
23  } else {
24    return recovery_api::STAGE_NONE;
25  }
26}
27
28} // namespace
29
30RecoveryOperation::RecoveryOperation(RecoveryOperationManager* manager,
31                                     const ExtensionId& extension_id)
32    : manager_(manager), extension_id_(extension_id) {
33}
34
35RecoveryOperation::~RecoveryOperation() {
36  timer_.Stop();
37}
38
39void RecoveryOperation::Start(const WriteStartCallback& callback) {
40  timer_.Start(FROM_HERE,
41               base::TimeDelta::FromMilliseconds(100),
42               this,
43               &RecoveryOperation::UpdateProgress);
44
45  stage_ = recovery_api::STAGE_DOWNLOAD;
46  progress_ = 0;
47
48  callback.Run(true);
49}
50
51void RecoveryOperation::Cancel(const WriteCancelCallback& callback) {
52  timer_.Stop();
53  callback.Run(true);
54}
55
56void RecoveryOperation::Abort() {
57  timer_.Stop();
58  manager_->OnError(extension_id_, stage_, progress_);
59}
60
61void RecoveryOperation::UpdateProgress() {
62  if (stage_ == recovery_api::STAGE_NONE) {
63    return;
64  }
65
66  progress_ += 10;
67
68  if (progress_ > 100) {
69    progress_ = 0;
70    stage_ = nextStage(stage_);
71
72    if (stage_ == recovery_api::STAGE_NONE) {
73      timer_.Stop();
74      manager_->OnComplete(extension_id_);
75      return;
76    }
77  }
78
79  manager_->OnProgress(extension_id_, stage_, progress_);
80}
81
82
83} // namespace recovery
84} // namespace extensions
85