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