| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/imageburner/burn_manager.h" | 5 #include "chrome/browser/chromeos/imageburner/burn_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "chrome/browser/browser_process.h" |
| 11 #include "chrome/browser/download/download_util.h" | 12 #include "chrome/browser/download/download_util.h" |
| 12 #include "chrome/browser/tab_contents/tab_util.h" | |
| 13 #include "chrome/common/chrome_paths.h" | 13 #include "chrome/common/chrome_paths.h" |
| 14 #include "content/browser/download/download_types.h" | 14 #include "content/browser/download/download_types.h" |
| 15 #include "content/browser/renderer_host/render_view_host.h" | |
| 16 #include "content/public/browser/browser_context.h" | 15 #include "content/public/browser/browser_context.h" |
| 17 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 18 #include "content/public/browser/render_process_host.h" | 17 #include "content/public/browser/download_manager.h" |
| 19 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
| 19 #include "content/public/common/url_fetcher.h" |
| 20 #include "net/base/file_stream.h" |
| 21 #include "net/url_request/url_request_status.h" |
| 20 | 22 |
| 21 using content::BrowserThread; | 23 using content::BrowserThread; |
| 22 using content::DownloadItem; | |
| 23 using content::DownloadManager; | 24 using content::DownloadManager; |
| 24 using content::WebContents; | 25 using content::WebContents; |
| 25 | 26 |
| 26 namespace chromeos { | 27 namespace chromeos { |
| 27 namespace imageburner { | 28 namespace imageburner { |
| 28 | 29 |
| 29 namespace { | 30 namespace { |
| 30 | 31 |
| 31 const char kConfigFileUrl[] = | 32 const char kConfigFileUrl[] = |
| 32 "https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf"; | 33 "https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf"; |
| 33 const char kTempImageFolderName[] = "chromeos_image"; | 34 const char kTempImageFolderName[] = "chromeos_image"; |
| 34 const char kConfigFileName[] = "recovery.conf"; | |
| 35 | 35 |
| 36 BurnManager* g_burn_manager = NULL; | 36 BurnManager* g_burn_manager = NULL; |
| 37 | 37 |
| 38 // Cretes a directory and calls |callback| with the result on UI thread. | 38 // Cretes a directory and calls |callback| with the result on UI thread. |
| 39 void CreateDirectory(const FilePath& path, | 39 void CreateDirectory(const FilePath& path, |
| 40 base::Callback<void(bool success)> callback) { | 40 base::Callback<void(bool success)> callback) { |
| 41 const bool success = file_util::CreateDirectory(path); | 41 const bool success = file_util::CreateDirectory(path); |
| 42 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 42 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 43 base::Bind(callback, success)); | 43 base::Bind(callback, success)); |
| 44 } | 44 } |
| 45 | 45 |
| 46 // Reads file content and calls |callback| with the result on UI thread. | |
| 47 void ReadFile(const FilePath& path, | |
| 48 base::Callback<void(bool success, | |
| 49 const std::string& file_content)> callback) { | |
| 50 std::string file_content; | |
| 51 const bool success = file_util::ReadFileToString(path, &file_content); | |
| 52 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 53 base::Bind(callback, success, file_content)); | |
| 54 } | |
| 55 | |
| 56 // Creates a FileStream and calls |callback| with the result on UI thread. | 46 // Creates a FileStream and calls |callback| with the result on UI thread. |
| 57 void CreateFileStream( | 47 void CreateFileStream( |
| 58 const FilePath& file_path, | 48 const FilePath& file_path, |
| 59 base::Callback<void(net::FileStream* file_stream)> callback) { | 49 base::Callback<void(net::FileStream* file_stream)> callback) { |
| 60 scoped_ptr<net::FileStream> file_stream(new net::FileStream(NULL)); | 50 scoped_ptr<net::FileStream> file_stream(new net::FileStream(NULL)); |
| 61 // TODO(tbarzic): Save temp image file to temp folder instead of Downloads | 51 // TODO(tbarzic): Save temp image file to temp folder instead of Downloads |
| 62 // once extracting image directly to removalbe device is implemented | 52 // once extracting image directly to removalbe device is implemented |
| 63 if (file_stream->OpenSync(file_path, base::PLATFORM_FILE_OPEN_ALWAYS | | 53 if (file_stream->OpenSync(file_path, base::PLATFORM_FILE_OPEN_ALWAYS | |
| 64 base::PLATFORM_FILE_WRITE)) | 54 base::PLATFORM_FILE_WRITE)) |
| 65 file_stream.reset(); | 55 file_stream.reset(); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 } | 212 } |
| 223 | 213 |
| 224 //////////////////////////////////////////////////////////////////////////////// | 214 //////////////////////////////////////////////////////////////////////////////// |
| 225 // | 215 // |
| 226 // BurnManager | 216 // BurnManager |
| 227 // | 217 // |
| 228 //////////////////////////////////////////////////////////////////////////////// | 218 //////////////////////////////////////////////////////////////////////////////// |
| 229 | 219 |
| 230 BurnManager::BurnManager() | 220 BurnManager::BurnManager() |
| 231 : weak_ptr_factory_(this), | 221 : weak_ptr_factory_(this), |
| 232 download_manager_(NULL), | |
| 233 download_item_observer_added_(false), | |
| 234 active_download_item_(NULL), | |
| 235 config_file_url_(kConfigFileUrl), | 222 config_file_url_(kConfigFileUrl), |
| 236 config_file_requested_(false), | |
| 237 config_file_fetched_(false), | |
| 238 state_machine_(new StateMachine()), | 223 state_machine_(new StateMachine()), |
| 239 downloader_(NULL) { | 224 downloader_(NULL) { |
| 240 } | 225 } |
| 241 | 226 |
| 242 BurnManager::~BurnManager() { | 227 BurnManager::~BurnManager() { |
| 243 if (!image_dir_.empty()) { | 228 if (!image_dir_.empty()) { |
| 244 file_util::Delete(image_dir_, true); | 229 file_util::Delete(image_dir_, true); |
| 245 } | 230 } |
| 246 if (active_download_item_) | |
| 247 active_download_item_->RemoveObserver(this); | |
| 248 if (download_manager_) | |
| 249 download_manager_->RemoveObserver(this); | |
| 250 } | 231 } |
| 251 | 232 |
| 252 // static | 233 // static |
| 253 void BurnManager::Initialize() { | 234 void BurnManager::Initialize() { |
| 254 if (g_burn_manager) { | 235 if (g_burn_manager) { |
| 255 LOG(WARNING) << "BurnManager was already initialized"; | 236 LOG(WARNING) << "BurnManager was already initialized"; |
| 256 return; | 237 return; |
| 257 } | 238 } |
| 258 g_burn_manager = new BurnManager(); | 239 g_burn_manager = new BurnManager(); |
| 259 VLOG(1) << "BurnManager initialized"; | 240 VLOG(1) << "BurnManager initialized"; |
| 260 } | 241 } |
| 261 | 242 |
| 262 // static | 243 // static |
| 263 void BurnManager::Shutdown() { | 244 void BurnManager::Shutdown() { |
| 264 if (!g_burn_manager) { | 245 if (!g_burn_manager) { |
| 265 LOG(WARNING) << "BurnManager::Shutdown() called with NULL manager"; | 246 LOG(WARNING) << "BurnManager::Shutdown() called with NULL manager"; |
| 266 return; | 247 return; |
| 267 } | 248 } |
| 268 delete g_burn_manager; | 249 delete g_burn_manager; |
| 269 g_burn_manager = NULL; | 250 g_burn_manager = NULL; |
| 270 VLOG(1) << "BurnManager Shutdown completed"; | 251 VLOG(1) << "BurnManager Shutdown completed"; |
| 271 } | 252 } |
| 272 | 253 |
| 273 // static | 254 // static |
| 274 BurnManager* BurnManager::GetInstance() { | 255 BurnManager* BurnManager::GetInstance() { |
| 275 return g_burn_manager; | 256 return g_burn_manager; |
| 276 } | 257 } |
| 277 | 258 |
| 278 void BurnManager::OnDownloadUpdated(DownloadItem* download) { | |
| 279 if (download->IsCancelled()) { | |
| 280 ConfigFileFetched(false, ""); | |
| 281 DCHECK(!download_item_observer_added_); | |
| 282 DCHECK(active_download_item_ == NULL); | |
| 283 } else if (download->IsComplete()) { | |
| 284 OnConfigFileDownloaded(); | |
| 285 } | |
| 286 } | |
| 287 | |
| 288 void BurnManager::OnConfigFileDownloaded() { | |
| 289 BrowserThread::PostBlockingPoolTask( | |
| 290 FROM_HERE, | |
| 291 base::Bind(ReadFile, | |
| 292 config_file_path_, | |
| 293 base::Bind(&BurnManager::ConfigFileFetched, | |
| 294 weak_ptr_factory_.GetWeakPtr()))); | |
| 295 } | |
| 296 | |
| 297 void BurnManager::ModelChanged(DownloadManager* manager) { | |
| 298 DCHECK_EQ(download_manager_, manager); | |
| 299 | |
| 300 std::vector<DownloadItem*> downloads; | |
| 301 download_manager_->GetTemporaryDownloads(GetImageDir(), &downloads); | |
| 302 if (download_item_observer_added_) | |
| 303 return; | |
| 304 for (std::vector<DownloadItem*>::const_iterator it = downloads.begin(); | |
| 305 it != downloads.end(); | |
| 306 ++it) { | |
| 307 if ((*it)->GetURL() == config_file_url_) { | |
| 308 download_item_observer_added_ = true; | |
| 309 (*it)->AddObserver(this); | |
| 310 active_download_item_ = *it; | |
| 311 break; | |
| 312 } | |
| 313 } | |
| 314 } | |
| 315 | |
| 316 void BurnManager::OnBurnDownloadStarted(bool success) { | |
| 317 if (!success) | |
| 318 ConfigFileFetched(false, ""); | |
| 319 } | |
| 320 | |
| 321 void BurnManager::CreateImageDir(Delegate* delegate) { | 259 void BurnManager::CreateImageDir(Delegate* delegate) { |
| 322 if (image_dir_.empty()) { | 260 if (image_dir_.empty()) { |
| 323 CHECK(PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &image_dir_)); | 261 CHECK(PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &image_dir_)); |
| 324 image_dir_ = image_dir_.Append(kTempImageFolderName); | 262 image_dir_ = image_dir_.Append(kTempImageFolderName); |
| 325 BrowserThread::PostBlockingPoolTask( | 263 BrowserThread::PostBlockingPoolTask( |
| 326 FROM_HERE, | 264 FROM_HERE, |
| 327 base::Bind(CreateDirectory, | 265 base::Bind(CreateDirectory, |
| 328 image_dir_, | 266 image_dir_, |
| 329 base::Bind(&BurnManager::OnImageDirCreated, | 267 base::Bind(&BurnManager::OnImageDirCreated, |
| 330 weak_ptr_factory_.GetWeakPtr(), | 268 weak_ptr_factory_.GetWeakPtr(), |
| 331 delegate))); | 269 delegate))); |
| 332 } else { | 270 } else { |
| 333 const bool success = true; | 271 const bool success = true; |
| 334 OnImageDirCreated(delegate, success); | 272 OnImageDirCreated(delegate, success); |
| 335 } | 273 } |
| 336 } | 274 } |
| 337 | 275 |
| 338 void BurnManager::OnImageDirCreated(Delegate* delegate, bool success) { | 276 void BurnManager::OnImageDirCreated(Delegate* delegate, bool success) { |
| 339 delegate->OnImageDirCreated(success); | 277 delegate->OnImageDirCreated(success); |
| 340 } | 278 } |
| 341 | 279 |
| 342 const FilePath& BurnManager::GetImageDir() { | 280 const FilePath& BurnManager::GetImageDir() { |
| 343 return image_dir_; | 281 return image_dir_; |
| 344 } | 282 } |
| 345 | 283 |
| 346 void BurnManager::FetchConfigFile(WebContents* web_contents, | 284 void BurnManager::FetchConfigFile(Delegate* delegate) { |
| 347 Delegate* delegate) { | 285 if (config_file_fetched()) { |
| 348 if (config_file_fetched_) { | |
| 349 delegate->OnConfigFileFetched(config_file_, true); | 286 delegate->OnConfigFileFetched(config_file_, true); |
| 350 return; | 287 return; |
| 351 } | 288 } |
| 352 downloaders_.push_back(delegate->AsWeakPtr()); | 289 downloaders_.push_back(delegate->AsWeakPtr()); |
| 353 | 290 |
| 354 if (config_file_requested_) | 291 if (config_fetcher_.get()) |
| 355 return; | 292 return; |
| 356 config_file_requested_ = true; | |
| 357 | 293 |
| 358 config_file_path_ = GetImageDir().Append(kConfigFileName); | 294 config_fetcher_.reset(content::URLFetcher::Create( |
| 359 download_manager_ = web_contents->GetBrowserContext()->GetDownloadManager(); | 295 config_file_url_, content::URLFetcher::GET, this)); |
| 360 download_manager_->AddObserver(this); | 296 config_fetcher_->StartWithRequestContextGetter( |
| 361 downloader()->AddListener(this, config_file_url_); | 297 g_browser_process->system_request_context()); |
| 362 downloader()->DownloadFile(config_file_url_, config_file_path_, web_contents); | 298 } |
| 299 |
| 300 void BurnManager::OnURLFetchComplete(const content::URLFetcher* source) { |
| 301 if (source == config_fetcher_.get()) { |
| 302 std::string data; |
| 303 const bool success = |
| 304 source->GetStatus().status() == net::URLRequestStatus::SUCCESS; |
| 305 if (success) |
| 306 config_fetcher_->GetResponseAsString(&data); |
| 307 config_fetcher_.reset(); |
| 308 ConfigFileFetched(success, data); |
| 309 } |
| 363 } | 310 } |
| 364 | 311 |
| 365 void BurnManager::ConfigFileFetched(bool fetched, const std::string& content) { | 312 void BurnManager::ConfigFileFetched(bool fetched, const std::string& content) { |
| 366 if (config_file_fetched_) | 313 if (config_file_fetched()) |
| 367 return; | 314 return; |
| 368 | 315 |
| 369 if (active_download_item_) { | |
| 370 active_download_item_->RemoveObserver(this); | |
| 371 active_download_item_ = NULL; | |
| 372 } | |
| 373 download_item_observer_added_ = false; | |
| 374 if (download_manager_) | |
| 375 download_manager_->RemoveObserver(this); | |
| 376 | |
| 377 config_file_fetched_ = fetched; | |
| 378 | |
| 379 if (fetched) { | 316 if (fetched) { |
| 380 config_file_.reset(content); | 317 config_file_.reset(content); |
| 381 } else { | 318 } else { |
| 382 config_file_.clear(); | 319 config_file_.clear(); |
| 383 } | 320 } |
| 384 | 321 |
| 385 for (size_t i = 0; i < downloaders_.size(); ++i) { | 322 for (size_t i = 0; i < downloaders_.size(); ++i) { |
| 386 if (downloaders_[i]) { | 323 if (downloaders_[i]) { |
| 387 downloaders_[i]->OnConfigFileFetched(config_file_, fetched); | 324 downloaders_[i]->OnConfigFileFetched(config_file_, fetched); |
| 388 } | 325 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 current_listener != listener_range.second; | 388 current_listener != listener_range.second; |
| 452 ++current_listener) { | 389 ++current_listener) { |
| 453 if (current_listener->second) | 390 if (current_listener->second) |
| 454 current_listener->second->OnBurnDownloadStarted(success); | 391 current_listener->second->OnBurnDownloadStarted(success); |
| 455 } | 392 } |
| 456 listeners_.erase(listener_range.first, listener_range.second); | 393 listeners_.erase(listener_range.first, listener_range.second); |
| 457 } | 394 } |
| 458 | 395 |
| 459 } // namespace imageburner | 396 } // namespace imageburner |
| 460 } // namespace chromeos | 397 } // namespace chromeos |
| OLD | NEW |