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