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