Index: chrome/browser/google/google_update.cc |
diff --git a/chrome/browser/google/google_update.cc b/chrome/browser/google/google_update.cc |
deleted file mode 100644 |
index b502f6b13922a0402d52d90be1a99d303de02d10..0000000000000000000000000000000000000000 |
--- a/chrome/browser/google/google_update.cc |
+++ /dev/null |
@@ -1,413 +0,0 @@ |
-// Copyright (c) 2012 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 <atlbase.h> |
-#include <atlcom.h> |
- |
-#include "base/bind.h" |
-#include "base/file_path.h" |
-#include "base/message_loop.h" |
-#include "base/path_service.h" |
-#include "base/string_util.h" |
-#include "base/stringprintf.h" |
-#include "base/threading/thread.h" |
-#include "base/win/scoped_comptr.h" |
-#include "base/win/windows_version.h" |
-#include "chrome/installer/util/browser_distribution.h" |
-#include "chrome/installer/util/google_update_settings.h" |
-#include "chrome/installer/util/helper.h" |
-#include "chrome/installer/util/install_util.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "google_update/google_update_idl.h" |
-#include "grit/generated_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/views/widget/widget.h" |
- |
-using content::BrowserThread; |
- |
-namespace { |
- |
-// Check if the currently running instance can be updated by Google Update. |
-// Returns GOOGLE_UPDATE_NO_ERROR only if the instance running is a Google |
-// Chrome distribution installed in a standard location. |
-GoogleUpdateErrorCode CanUpdateCurrentChrome( |
- const FilePath& chrome_exe_path) { |
-#if !defined(GOOGLE_CHROME_BUILD) |
- return CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY; |
-#else |
- // TODO(tommi): Check if using the default distribution is always the right |
- // thing to do. |
- BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
- FilePath user_exe_path = installer::GetChromeInstallPath(false, dist); |
- FilePath machine_exe_path = installer::GetChromeInstallPath(true, dist); |
- if (!FilePath::CompareEqualIgnoreCase(chrome_exe_path.value(), |
- user_exe_path.value()) && |
- !FilePath::CompareEqualIgnoreCase(chrome_exe_path.value(), |
- machine_exe_path.value())) { |
- LOG(ERROR) << L"Google Update cannot update Chrome installed in a " |
- << L"non-standard location: " << chrome_exe_path.value().c_str() |
- << L". The standard location is: " |
- << user_exe_path.value().c_str() |
- << L" or " << machine_exe_path.value().c_str() << L"."; |
- return CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY; |
- } |
- |
- string16 app_guid = installer::GetAppGuidForUpdates( |
- !InstallUtil::IsPerUserInstall(chrome_exe_path.value().c_str())); |
- DCHECK(!app_guid.empty()); |
- |
- if (GoogleUpdateSettings::GetAppUpdatePolicy(app_guid, NULL) == |
- GoogleUpdateSettings::UPDATES_DISABLED) |
- return GOOGLE_UPDATE_DISABLED_BY_POLICY; |
- |
- return GOOGLE_UPDATE_NO_ERROR; |
-#endif |
-} |
- |
-// Creates an instance of a COM Local Server class using either plain vanilla |
-// CoCreateInstance, or using the Elevation moniker if running on Vista. |
-// hwnd must refer to a foregound window in order to get the UAC prompt |
-// showing up in the foreground if running on Vista. It can also be NULL if |
-// background UAC prompts are desired. |
-HRESULT CoCreateInstanceAsAdmin(REFCLSID class_id, REFIID interface_id, |
- HWND hwnd, void** interface_ptr) { |
- if (!interface_ptr) |
- return E_POINTER; |
- |
- // For Vista we need to instantiate the COM server via the elevation |
- // moniker. This ensures that the UAC dialog shows up. |
- if (base::win::GetVersion() >= base::win::VERSION_VISTA) { |
- wchar_t class_id_as_string[MAX_PATH] = {0}; |
- StringFromGUID2(class_id, class_id_as_string, |
- arraysize(class_id_as_string)); |
- |
- string16 elevation_moniker_name = |
- base::StringPrintf(L"Elevation:Administrator!new:%ls", |
- class_id_as_string); |
- |
- BIND_OPTS3 bind_opts; |
- memset(&bind_opts, 0, sizeof(bind_opts)); |
- bind_opts.cbStruct = sizeof(bind_opts); |
- bind_opts.dwClassContext = CLSCTX_LOCAL_SERVER; |
- bind_opts.hwnd = hwnd; |
- |
- return CoGetObject(elevation_moniker_name.c_str(), &bind_opts, |
- interface_id, reinterpret_cast<void**>(interface_ptr)); |
- } |
- |
- return CoCreateInstance(class_id, NULL, CLSCTX_LOCAL_SERVER, |
- interface_id, |
- reinterpret_cast<void**>(interface_ptr)); |
-} |
- |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// |
-// The GoogleUpdateJobObserver COM class is responsible for receiving status |
-// reports from google Update. It keeps track of the progress as Google Update |
-// notifies us and ends the message loop we are spinning in once Google Update |
-// reports that it is done. |
-// |
-//////////////////////////////////////////////////////////////////////////////// |
-class GoogleUpdateJobObserver |
- : public CComObjectRootEx<CComSingleThreadModel>, |
- public IJobObserver { |
- public: |
- BEGIN_COM_MAP(GoogleUpdateJobObserver) |
- COM_INTERFACE_ENTRY(IJobObserver) |
- END_COM_MAP() |
- |
- GoogleUpdateJobObserver() |
- : result_(UPGRADE_ERROR) { |
- } |
- virtual ~GoogleUpdateJobObserver() {} |
- |
- // Notifications from Google Update: |
- STDMETHOD(OnShow)() { |
- return S_OK; |
- } |
- STDMETHOD(OnCheckingForUpdate)() { |
- result_ = UPGRADE_CHECK_STARTED; |
- return S_OK; |
- } |
- STDMETHOD(OnUpdateAvailable)(const TCHAR* version_string) { |
- result_ = UPGRADE_IS_AVAILABLE; |
- new_version_ = version_string; |
- return S_OK; |
- } |
- STDMETHOD(OnWaitingToDownload)() { |
- return S_OK; |
- } |
- STDMETHOD(OnDownloading)(int time_remaining_ms, int pos) { |
- return S_OK; |
- } |
- STDMETHOD(OnWaitingToInstall)() { |
- return S_OK; |
- } |
- STDMETHOD(OnInstalling)() { |
- result_ = UPGRADE_STARTED; |
- return S_OK; |
- } |
- STDMETHOD(OnPause)() { |
- return S_OK; |
- } |
- STDMETHOD(OnComplete)(LegacyCompletionCodes code, const TCHAR* text) { |
- switch (code) { |
- case COMPLETION_CODE_SUCCESS_CLOSE_UI: |
- case COMPLETION_CODE_SUCCESS: { |
- if (result_ == UPGRADE_STARTED) |
- result_ = UPGRADE_SUCCESSFUL; |
- else if (result_ == UPGRADE_CHECK_STARTED) |
- result_ = UPGRADE_ALREADY_UP_TO_DATE; |
- break; |
- } |
- case COMPLETION_CODE_ERROR: |
- error_message_ = text; |
- default: { |
- NOTREACHED(); |
- result_ = UPGRADE_ERROR; |
- break; |
- } |
- } |
- |
- event_sink_ = NULL; |
- |
- // We no longer need to spin the message loop that we started spinning in |
- // InitiateGoogleUpdateCheck. |
- MessageLoop::current()->Quit(); |
- return S_OK; |
- } |
- STDMETHOD(SetEventSink)(IProgressWndEvents* event_sink) { |
- event_sink_ = event_sink; |
- return S_OK; |
- } |
- |
- // Returns the results of the update operation. |
- STDMETHOD(GetResult)(GoogleUpdateUpgradeResult* result) { |
- // Intermediary steps should never be reported to the client. |
- DCHECK(result_ != UPGRADE_STARTED && result_ != UPGRADE_CHECK_STARTED); |
- |
- *result = result_; |
- return S_OK; |
- } |
- |
- // Returns which version Google Update found on the server (if a more |
- // recent version was found). Otherwise, this will be blank. |
- STDMETHOD(GetVersionInfo)(string16* version_string) { |
- *version_string = new_version_; |
- return S_OK; |
- } |
- |
- // Returns the Google Update supplied error string that describes the error |
- // that occurred during the update check/upgrade. |
- STDMETHOD(GetErrorMessage)(string16* error_message) { |
- *error_message = error_message_; |
- return S_OK; |
- } |
- |
- private: |
- // The status/result of the Google Update operation. |
- GoogleUpdateUpgradeResult result_; |
- |
- // The version string Google Update found. |
- string16 new_version_; |
- |
- // An error message, if any. |
- string16 error_message_; |
- |
- // Allows us control the upgrade process to a small degree. After OnComplete |
- // has been called, this object can not be used. |
- base::win::ScopedComPtr<IProgressWndEvents> event_sink_; |
-}; |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// GoogleUpdate, public: |
- |
-GoogleUpdate::GoogleUpdate() |
- : listener_(NULL) { |
-} |
- |
-GoogleUpdate::~GoogleUpdate() { |
-} |
- |
-void GoogleUpdate::CheckForUpdate(bool install_if_newer, |
- views::Widget* window) { |
- // We need to shunt this request over to InitiateGoogleUpdateCheck and have |
- // it run in the file thread. |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&GoogleUpdate::InitiateGoogleUpdateCheck, this, |
- install_if_newer, window, MessageLoop::current())); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// GoogleUpdate, private: |
- |
-void GoogleUpdate::InitiateGoogleUpdateCheck(bool install_if_newer, |
- views::Widget* window, |
- MessageLoop* main_loop) { |
- FilePath chrome_exe; |
- if (!PathService::Get(base::DIR_EXE, &chrome_exe)) |
- NOTREACHED(); |
- |
- GoogleUpdateErrorCode error_code = CanUpdateCurrentChrome(chrome_exe); |
- if (error_code != GOOGLE_UPDATE_NO_ERROR) { |
- main_loop->PostTask( |
- FROM_HERE, |
- base::Bind(&GoogleUpdate::ReportResults, this, |
- UPGRADE_ERROR, error_code, string16())); |
- return; |
- } |
- |
- CComObject<GoogleUpdateJobObserver>* job_observer; |
- HRESULT hr = |
- CComObject<GoogleUpdateJobObserver>::CreateInstance(&job_observer); |
- if (hr != S_OK) { |
- // Most of the error messages come straight from Google Update. This one is |
- // deemed worthy enough to also warrant its own error. |
- GoogleUpdateErrorCode error = GOOGLE_UPDATE_JOB_SERVER_CREATION_FAILED; |
- string16 error_code = base::StringPrintf(L"%d: 0x%x", error, hr); |
- ReportFailure( |
- hr, error, |
- l10n_util::GetStringFUTF16(IDS_ABOUT_BOX_ERROR_UPDATE_CHECK_FAILED, |
- error_code), |
- main_loop); |
- return; |
- } |
- |
- base::win::ScopedComPtr<IJobObserver> job_holder(job_observer); |
- |
- base::win::ScopedComPtr<IGoogleUpdate> on_demand; |
- |
- bool system_level = false; |
- |
- if (InstallUtil::IsPerUserInstall(chrome_exe.value().c_str())) { |
- hr = on_demand.CreateInstance(CLSID_OnDemandUserAppsClass); |
- } else { |
- // The Update operation needs Admin privileges for writing |
- // to %ProgramFiles%. On Vista we need to elevate before instantiating |
- // the updater instance. |
- if (!install_if_newer) { |
- hr = on_demand.CreateInstance(CLSID_OnDemandMachineAppsClass); |
- } else { |
- HWND foreground_hwnd = NULL; |
- if (window != NULL) { |
- foreground_hwnd = window->GetNativeWindow(); |
- } |
- |
- hr = CoCreateInstanceAsAdmin(CLSID_OnDemandMachineAppsClass, |
- IID_IGoogleUpdate, foreground_hwnd, |
- reinterpret_cast<void**>(on_demand.Receive())); |
- } |
- system_level = true; |
- } |
- |
- if (hr != S_OK) { |
- GoogleUpdateErrorCode error = GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND; |
- string16 error_code = base::StringPrintf(L"%d: 0x%x", error, hr); |
- if (system_level) |
- error_code += L" -- system level"; |
- ReportFailure(hr, error, |
- l10n_util::GetStringFUTF16( |
- IDS_ABOUT_BOX_ERROR_UPDATE_CHECK_FAILED, |
- error_code), |
- main_loop); |
- return; |
- } |
- |
- string16 app_guid = installer::GetAppGuidForUpdates(system_level); |
- DCHECK(!app_guid.empty()); |
- |
- if (!install_if_newer) |
- hr = on_demand->CheckForUpdate(app_guid.c_str(), job_observer); |
- else |
- hr = on_demand->Update(app_guid.c_str(), job_observer); |
- |
- if (hr != S_OK) { |
- GoogleUpdateErrorCode error = GOOGLE_UPDATE_ONDEMAND_CLASS_REPORTED_ERROR; |
- string16 error_code = base::StringPrintf(L"%d: 0x%x", error, hr); |
- ReportFailure(hr, error, |
- l10n_util::GetStringFUTF16( |
- IDS_ABOUT_BOX_ERROR_UPDATE_CHECK_FAILED, |
- error_code), |
- main_loop); |
- return; |
- } |
- |
- // We need to spin the message loop while Google Update is running so that it |
- // can report back to us through GoogleUpdateJobObserver. This message loop |
- // will terminate once Google Update sends us the completion status |
- // (success/error). See OnComplete(). |
- MessageLoop::current()->Run(); |
- |
- GoogleUpdateUpgradeResult results; |
- hr = job_observer->GetResult(&results); |
- |
- if (hr != S_OK) { |
- GoogleUpdateErrorCode error = GOOGLE_UPDATE_GET_RESULT_CALL_FAILED; |
- string16 error_code = base::StringPrintf(L"%d: 0x%x", error, hr); |
- ReportFailure(hr, error, |
- l10n_util::GetStringFUTF16( |
- IDS_ABOUT_BOX_ERROR_UPDATE_CHECK_FAILED, |
- error_code), |
- main_loop); |
- return; |
- } |
- |
- if (results == UPGRADE_ERROR) { |
- string16 error_message; |
- job_observer->GetErrorMessage(&error_message); |
- ReportFailure(hr, GOOGLE_UPDATE_ERROR_UPDATING, error_message, main_loop); |
- return; |
- } |
- |
- hr = job_observer->GetVersionInfo(&version_available_); |
- if (hr != S_OK) { |
- GoogleUpdateErrorCode error = GOOGLE_UPDATE_GET_VERSION_INFO_FAILED; |
- string16 error_code = base::StringPrintf(L"%d: 0x%x", error, hr); |
- ReportFailure(hr, error, |
- l10n_util::GetStringFUTF16( |
- IDS_ABOUT_BOX_ERROR_UPDATE_CHECK_FAILED, |
- error_code), |
- main_loop); |
- return; |
- } |
- |
- main_loop->PostTask( |
- FROM_HERE, |
- base::Bind(&GoogleUpdate::ReportResults, this, |
- results, GOOGLE_UPDATE_NO_ERROR, string16())); |
- job_holder = NULL; |
- on_demand = NULL; |
-} |
- |
-void GoogleUpdate::ReportResults(GoogleUpdateUpgradeResult results, |
- GoogleUpdateErrorCode error_code, |
- const string16& error_message) { |
- // 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, error_message, version_available_); |
- } |
-} |
- |
-bool GoogleUpdate::ReportFailure(HRESULT hr, |
- GoogleUpdateErrorCode error_code, |
- const string16& error_message, |
- MessageLoop* main_loop) { |
- NOTREACHED() << "Communication with Google Update failed: " << hr |
- << " error: " << error_code |
- << ", message: " << error_message.c_str(); |
- main_loop->PostTask( |
- FROM_HERE, |
- base::Bind(&GoogleUpdate::ReportResults, this, |
- UPGRADE_ERROR, error_code, error_message)); |
- return false; |
-} |