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