| // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/google/google_update.h" |
| |
| #include "base/message_loop.h" |
| #include "base/path_service.h" |
| #include "base/string_util.h" |
| #include "base/task.h" |
| #include "base/threading/thread.h" |
| #include "base/utf_string_conversions.h" |
| #include "chrome/browser/chromeos/cros/cros_library.h" |
| #include "content/browser/browser_thread.h" |
| #include "third_party/cros/chromeos_update.h" |
| #include "views/window/window.h" |
| |
| using views::Window; |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // GoogleUpdate, public: |
| |
| GoogleUpdate::GoogleUpdate() |
| : listener_(NULL) { |
| chromeos::CrosLibrary::Get()->EnsureLoaded(); |
| } |
| |
| GoogleUpdate::~GoogleUpdate() { |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // GoogleUpdate, views::DialogDelegate implementation: |
| |
| void GoogleUpdate::CheckForUpdate(bool install_if_newer, Window* window) { |
| // We need to shunt this request over to InitiateGoogleUpdateCheck and have |
| // it run in the file thread. |
| BrowserThread::PostTask( |
| BrowserThread::FILE, FROM_HERE, |
| NewRunnableMethod( |
| this, &GoogleUpdate::InitiateGoogleUpdateCheck, install_if_newer, |
| window, MessageLoop::current())); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // GoogleUpdate, private: |
| |
| bool GoogleUpdate::InitiateGoogleUpdateCheck(bool install_if_newer, |
| Window* window, |
| MessageLoop* main_loop) { |
| chromeos::UpdateInformation result; |
| bool success = false; |
| |
| if (install_if_newer) { |
| // Possible Results: |
| // UPGRADE_SUCCESSFUL |
| // UPGRADE_ALREADY_UP_TO_DATE |
| // UPGRADE_ERROR |
| if (chromeos::Update) { |
| success = chromeos::Update(&result); |
| } |
| } else { |
| // Possible Results: |
| // UPGRADE_ALREADY_UP_TO_DATE |
| // UPGRADE_IS_AVAILABLE |
| // UPGRADE_ERROR |
| if (chromeos::CheckForUpdate) { |
| success = chromeos::CheckForUpdate(&result); |
| } |
| if (result.version_) { |
| UTF8ToWide(result.version_, std::strlen(result.version_), |
| &version_available_); |
| } |
| } |
| |
| // Map chromeos::UpdateStatus to GoogleUpdateUpgradeResult |
| |
| GoogleUpdateUpgradeResult final = UPGRADE_ERROR; |
| |
| switch (result.status_) { |
| case chromeos::UPDATE_ERROR: |
| final = UPGRADE_ERROR; |
| break; |
| case chromeos::UPDATE_IS_AVAILABLE: |
| final = UPGRADE_IS_AVAILABLE; |
| break; |
| case chromeos::UPDATE_SUCCESSFUL: |
| final = UPGRADE_SUCCESSFUL; |
| break; |
| case chromeos::UPDATE_ALREADY_UP_TO_DATE: |
| final = UPGRADE_ALREADY_UP_TO_DATE; |
| break; |
| default: |
| // UPGRADE_ERROR |
| break; |
| } |
| |
| // Post the results as a task since this is run on a thread. |
| |
| main_loop->PostTask(FROM_HERE, NewRunnableMethod(this, |
| &GoogleUpdate::ReportResults, final, success |
| ? GOOGLE_UPDATE_NO_ERROR : GOOGLE_UPDATE_ERROR_UPDATING)); |
| |
| return true; |
| } |
| |
| void GoogleUpdate::ReportResults(GoogleUpdateUpgradeResult results, |
| GoogleUpdateErrorCode error_code) { |
| // If we get an error, then error code must not be blank, and vice versa. |
| DCHECK(results == UPGRADE_ERROR ? error_code != GOOGLE_UPDATE_NO_ERROR : |
| error_code == GOOGLE_UPDATE_NO_ERROR); |
| if (listener_) |
| listener_->OnReportResults(results, error_code, version_available_); |
| } |
| |