1// Copyright (c) 2006-2008 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/google/google_update.h" 6 7#include "base/message_loop.h" 8#include "base/path_service.h" 9#include "base/string_util.h" 10#include "base/task.h" 11#include "base/threading/thread.h" 12#include "base/utf_string_conversions.h" 13#include "chrome/browser/chromeos/cros/cros_library.h" 14#include "content/browser/browser_thread.h" 15#include "third_party/cros/chromeos_update.h" 16#include "views/window/window.h" 17 18using views::Window; 19 20//////////////////////////////////////////////////////////////////////////////// 21// GoogleUpdate, public: 22 23GoogleUpdate::GoogleUpdate() 24 : listener_(NULL) { 25 chromeos::CrosLibrary::Get()->EnsureLoaded(); 26} 27 28GoogleUpdate::~GoogleUpdate() { 29} 30 31//////////////////////////////////////////////////////////////////////////////// 32// GoogleUpdate, views::DialogDelegate implementation: 33 34void GoogleUpdate::CheckForUpdate(bool install_if_newer, Window* window) { 35 // We need to shunt this request over to InitiateGoogleUpdateCheck and have 36 // it run in the file thread. 37 BrowserThread::PostTask( 38 BrowserThread::FILE, FROM_HERE, 39 NewRunnableMethod( 40 this, &GoogleUpdate::InitiateGoogleUpdateCheck, install_if_newer, 41 window, MessageLoop::current())); 42} 43 44//////////////////////////////////////////////////////////////////////////////// 45// GoogleUpdate, private: 46 47bool GoogleUpdate::InitiateGoogleUpdateCheck(bool install_if_newer, 48 Window* window, 49 MessageLoop* main_loop) { 50 chromeos::UpdateInformation result; 51 bool success = false; 52 53 if (install_if_newer) { 54 // Possible Results: 55 // UPGRADE_SUCCESSFUL 56 // UPGRADE_ALREADY_UP_TO_DATE 57 // UPGRADE_ERROR 58 if (chromeos::Update) { 59 success = chromeos::Update(&result); 60 } 61 } else { 62 // Possible Results: 63 // UPGRADE_ALREADY_UP_TO_DATE 64 // UPGRADE_IS_AVAILABLE 65 // UPGRADE_ERROR 66 if (chromeos::CheckForUpdate) { 67 success = chromeos::CheckForUpdate(&result); 68 } 69 if (result.version_) { 70 UTF8ToWide(result.version_, std::strlen(result.version_), 71 &version_available_); 72 } 73 } 74 75 // Map chromeos::UpdateStatus to GoogleUpdateUpgradeResult 76 77 GoogleUpdateUpgradeResult final = UPGRADE_ERROR; 78 79 switch (result.status_) { 80 case chromeos::UPDATE_ERROR: 81 final = UPGRADE_ERROR; 82 break; 83 case chromeos::UPDATE_IS_AVAILABLE: 84 final = UPGRADE_IS_AVAILABLE; 85 break; 86 case chromeos::UPDATE_SUCCESSFUL: 87 final = UPGRADE_SUCCESSFUL; 88 break; 89 case chromeos::UPDATE_ALREADY_UP_TO_DATE: 90 final = UPGRADE_ALREADY_UP_TO_DATE; 91 break; 92 default: 93 // UPGRADE_ERROR 94 break; 95 } 96 97 // Post the results as a task since this is run on a thread. 98 99 main_loop->PostTask(FROM_HERE, NewRunnableMethod(this, 100 &GoogleUpdate::ReportResults, final, success 101 ? GOOGLE_UPDATE_NO_ERROR : GOOGLE_UPDATE_ERROR_UPDATING)); 102 103 return true; 104} 105 106void GoogleUpdate::ReportResults(GoogleUpdateUpgradeResult results, 107 GoogleUpdateErrorCode error_code) { 108 // If we get an error, then error code must not be blank, and vice versa. 109 DCHECK(results == UPGRADE_ERROR ? error_code != GOOGLE_UPDATE_NO_ERROR : 110 error_code == GOOGLE_UPDATE_NO_ERROR); 111 if (listener_) 112 listener_->OnReportResults(results, error_code, version_available_); 113} 114 115