| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/imageburner/burn_controller.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/files/file_path.h" | |
| 9 #include "base/memory/weak_ptr.h" | |
| 10 #include "chrome/browser/chromeos/imageburner/burn_manager.h" | |
| 11 #include "chromeos/network/network_state_handler.h" | |
| 12 #include "url/gurl.h" | |
| 13 | |
| 14 namespace chromeos { | |
| 15 namespace imageburner { | |
| 16 | |
| 17 namespace { | |
| 18 | |
| 19 // 3.9GB. It is less than 4GB because true device size ussually varies a little. | |
| 20 const uint64 kMinDeviceSize = static_cast<uint64>(3.9 * 1000 * 1000 * 1000); | |
| 21 | |
| 22 class BurnControllerImpl | |
| 23 : public BurnController, | |
| 24 public StateMachine::Observer, | |
| 25 public BurnManager::Observer { | |
| 26 public: | |
| 27 explicit BurnControllerImpl(BurnController::Delegate* delegate) | |
| 28 : burn_manager_(NULL), | |
| 29 state_machine_(NULL), | |
| 30 working_(false), | |
| 31 delegate_(delegate) { | |
| 32 burn_manager_ = BurnManager::GetInstance(); | |
| 33 burn_manager_->AddObserver(this); | |
| 34 state_machine_ = burn_manager_->state_machine(); | |
| 35 state_machine_->AddObserver(this); | |
| 36 } | |
| 37 | |
| 38 virtual ~BurnControllerImpl() { | |
| 39 state_machine_->RemoveObserver(this); | |
| 40 burn_manager_->RemoveObserver(this); | |
| 41 } | |
| 42 | |
| 43 // BurnManager::Observer override. | |
| 44 virtual void OnDeviceAdded( | |
| 45 const disks::DiskMountManager::Disk& disk) override { | |
| 46 delegate_->OnDeviceAdded(disk); | |
| 47 } | |
| 48 | |
| 49 // BurnManager::Observer override. | |
| 50 virtual void OnDeviceRemoved( | |
| 51 const disks::DiskMountManager::Disk& disk) override { | |
| 52 delegate_->OnDeviceRemoved(disk); | |
| 53 } | |
| 54 | |
| 55 // BurnManager::Observer override. | |
| 56 virtual void OnNetworkDetected() override { | |
| 57 delegate_->OnNetworkDetected(); | |
| 58 } | |
| 59 | |
| 60 // BurnManager::Observer override. | |
| 61 virtual void OnSuccess() override { | |
| 62 delegate_->OnSuccess(); | |
| 63 // TODO(hidehiko): Remove |working_| flag. | |
| 64 working_ = false; | |
| 65 } | |
| 66 | |
| 67 // BurnManager::Observer override. | |
| 68 virtual void OnProgressWithRemainingTime( | |
| 69 ProgressType progress_type, | |
| 70 int64 received_bytes, | |
| 71 int64 total_bytes, | |
| 72 const base::TimeDelta& estimated_remaining_time) override { | |
| 73 delegate_->OnProgressWithRemainingTime( | |
| 74 progress_type, received_bytes, total_bytes, estimated_remaining_time); | |
| 75 } | |
| 76 | |
| 77 // BurnManager::Observer override. | |
| 78 virtual void OnProgress(ProgressType progress_type, | |
| 79 int64 received_bytes, | |
| 80 int64 total_bytes) override { | |
| 81 delegate_->OnProgress(progress_type, received_bytes, total_bytes); | |
| 82 } | |
| 83 | |
| 84 // StateMachine::Observer interface. | |
| 85 virtual void OnBurnStateChanged(StateMachine::State state) override { | |
| 86 if (state != StateMachine::INITIAL && !working_) { | |
| 87 // User has started burn process, so let's start observing. | |
| 88 StartBurnImage(base::FilePath(), base::FilePath()); | |
| 89 } | |
| 90 } | |
| 91 | |
| 92 virtual void OnError(int error_message_id) override { | |
| 93 delegate_->OnFail(error_message_id); | |
| 94 working_ = false; | |
| 95 } | |
| 96 | |
| 97 // BurnController override. | |
| 98 virtual void Init() override { | |
| 99 if (state_machine_->state() == StateMachine::BURNING) { | |
| 100 // There is nothing else left to do but observe burn progress. | |
| 101 burn_manager_->DoBurn(); | |
| 102 } else if (state_machine_->state() != StateMachine::INITIAL) { | |
| 103 // User has started burn process, so let's start observing. | |
| 104 StartBurnImage(base::FilePath(), base::FilePath()); | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 // BurnController override. | |
| 109 virtual std::vector<disks::DiskMountManager::Disk> GetBurnableDevices() | |
| 110 override { | |
| 111 // Now this is just a proxy to the BurnManager. | |
| 112 // TODO(hidehiko): Remove this method. | |
| 113 return burn_manager_->GetBurnableDevices(); | |
| 114 } | |
| 115 | |
| 116 // BurnController override. | |
| 117 virtual void CancelBurnImage() override { | |
| 118 burn_manager_->Cancel(); | |
| 119 } | |
| 120 | |
| 121 // BurnController override. | |
| 122 // May be called with empty values if there is a handler that has started | |
| 123 // burning, and thus set the target paths. | |
| 124 virtual void StartBurnImage(const base::FilePath& target_device_path, | |
| 125 const base::FilePath& target_file_path) override { | |
| 126 if (!target_device_path.empty() && !target_file_path.empty() && | |
| 127 state_machine_->new_burn_posible()) { | |
| 128 if (!NetworkHandler::Get()->network_state_handler()->DefaultNetwork()) { | |
| 129 delegate_->OnNoNetwork(); | |
| 130 return; | |
| 131 } | |
| 132 burn_manager_->set_target_device_path(target_device_path); | |
| 133 burn_manager_->set_target_file_path(target_file_path); | |
| 134 uint64 device_size = GetDeviceSize( | |
| 135 burn_manager_->target_device_path().value()); | |
| 136 if (device_size < kMinDeviceSize) { | |
| 137 delegate_->OnDeviceTooSmall(device_size); | |
| 138 return; | |
| 139 } | |
| 140 } | |
| 141 if (working_) | |
| 142 return; | |
| 143 working_ = true; | |
| 144 // Send progress signal now so ui doesn't hang in intial state until we get | |
| 145 // config file | |
| 146 delegate_->OnProgress(DOWNLOADING, 0, 0); | |
| 147 if (burn_manager_->GetImageDir().empty()) { | |
| 148 burn_manager_->CreateImageDir(); | |
| 149 } else { | |
| 150 burn_manager_->FetchConfigFile(); | |
| 151 } | |
| 152 } | |
| 153 | |
| 154 private: | |
| 155 int64 GetDeviceSize(const std::string& device_path) { | |
| 156 disks::DiskMountManager* disk_mount_manager = | |
| 157 disks::DiskMountManager::GetInstance(); | |
| 158 const disks::DiskMountManager::Disk* disk = | |
| 159 disk_mount_manager->FindDiskBySourcePath(device_path); | |
| 160 return disk ? disk->total_size_in_bytes() : 0; | |
| 161 } | |
| 162 | |
| 163 BurnManager* burn_manager_; | |
| 164 StateMachine* state_machine_; | |
| 165 bool working_; | |
| 166 BurnController::Delegate* delegate_; | |
| 167 | |
| 168 DISALLOW_COPY_AND_ASSIGN(BurnControllerImpl); | |
| 169 }; | |
| 170 | |
| 171 } // namespace | |
| 172 | |
| 173 // static | |
| 174 BurnController* BurnController::CreateBurnController( | |
| 175 content::WebContents* web_contents, | |
| 176 Delegate* delegate) { | |
| 177 return new BurnControllerImpl(delegate); | |
| 178 } | |
| 179 | |
| 180 } // namespace imageburner | |
| 181 } // namespace chromeos | |
| OLD | NEW |