// 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. #ifndef CHROME_BROWSER_GOOGLE_GOOGLE_UPDATE_WIN_H_ #define CHROME_BROWSER_GOOGLE_GOOGLE_UPDATE_WIN_H_ #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "base/strings/string16.h" #include "google_update/google_update_idl.h" namespace base { class MessageLoop; } namespace views { class Widget; } // The status of the upgrade. UPGRADE_STARTED and UPGRADE_CHECK_STARTED are // internal states and will not be reported as results to the listener. enum GoogleUpdateUpgradeResult { // The upgrade has started. UPGRADE_STARTED = 0, // A check for upgrade has been initiated. UPGRADE_CHECK_STARTED, // An update is available. UPGRADE_IS_AVAILABLE, // The upgrade happened successfully. UPGRADE_SUCCESSFUL, // No need to upgrade, Chrome is up to date. UPGRADE_ALREADY_UP_TO_DATE, // An error occurred. UPGRADE_ERROR, }; enum GoogleUpdateErrorCode { // The upgrade completed successfully (or hasn't been started yet). GOOGLE_UPDATE_NO_ERROR = 0, // Google Update only supports upgrading if Chrome is installed in the default // location. This error will appear for developer builds and with // installations unzipped to random locations. CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY, // Failed to create Google Update JobServer COM class. GOOGLE_UPDATE_JOB_SERVER_CREATION_FAILED, // Failed to create Google Update OnDemand COM class. GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND, // Google Update OnDemand COM class reported an error during a check for // update (or while upgrading). GOOGLE_UPDATE_ONDEMAND_CLASS_REPORTED_ERROR, // A call to GetResults failed. GOOGLE_UPDATE_GET_RESULT_CALL_FAILED, // A call to GetVersionInfo failed. GOOGLE_UPDATE_GET_VERSION_INFO_FAILED, // An error occurred while upgrading (or while checking for update). // Check the Google Update log in %TEMP% for more details. GOOGLE_UPDATE_ERROR_UPDATING, // Updates can not be downloaded because the administrator has disabled all // types of updating. GOOGLE_UPDATE_DISABLED_BY_POLICY, // Updates can not be downloaded because the administrator has disabled // manual (on-demand) updates. Automatic background updates are allowed. GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY, }; // The GoogleUpdateStatusListener interface is used by components to receive // notifications about the results of an Google Update operation. class GoogleUpdateStatusListener { public: // This function is called when Google Update has finished its operation and // wants to notify us about the results. |results| represents what the end // state is, |error_code| represents what error occurred, |error_message| is a // string version of the same (might be blank) and |version| specifies what // new version Google Update detected (or installed). This value can be a // blank string, if the version tag in the Update{} block (in Google Update's // server config for Chrome) is blank. virtual void OnReportResults(GoogleUpdateUpgradeResult results, GoogleUpdateErrorCode error_code, const base::string16& error_message, const base::string16& version) = 0; }; //////////////////////////////////////////////////////////////////////////////// // // The Google Update class is responsible for communicating with Google Update // and get it to perform operations on our behalf (for example, CheckForUpdate). // This class will report back to its parent via the GoogleUpdateStatusListener // interface and will delete itself after reporting back. // //////////////////////////////////////////////////////////////////////////////// class GoogleUpdate : public base::RefCountedThreadSafe<GoogleUpdate> { public: GoogleUpdate(); // Ask Google Update to see if a new version is available. If the parameter // |install_if_newer| is true then Google Update will also install that new // version. // |window| should point to a foreground window. This is needed to ensure // that Vista/Windows 7 UAC prompts show up in the foreground. It may also // be null. void CheckForUpdate(bool install_if_newer, HWND window); // Pass NULL to clear the listener void set_status_listener(GoogleUpdateStatusListener* listener) { listener_ = listener; } private: friend class base::RefCountedThreadSafe<GoogleUpdate>; virtual ~GoogleUpdate(); // This function reports failure from the Google Update operation to the // listener. // Note, after this function completes, this object will have deleted itself. bool ReportFailure(HRESULT hr, GoogleUpdateErrorCode error_code, const base::string16& error_message, base::MessageLoop* main_loop); // The update check needs to run on another thread than the main thread, and // therefore CheckForUpdate will delegate to this function. |main_loop| points // to the message loop that the response must come from. // |window| should point to a foreground window. This is needed to ensure that // Vista/Windows 7 UAC prompts show up in the foreground. It may also be null. void InitiateGoogleUpdateCheck(bool install_if_newer, HWND window, base::MessageLoop* main_loop); // This function reports the results of the GoogleUpdate operation to the // listener. If results indicates an error, the |error_code| and // |error_message| will indicate which error occurred. // Note, after this function completes, this object will have deleted itself. void ReportResults(GoogleUpdateUpgradeResult results, GoogleUpdateErrorCode error_code, const base::string16& error_message); // Which version string Google Update found (if a new one was available). // Otherwise, this will be blank. base::string16 version_available_; // The listener who is interested in finding out the result of the operation. GoogleUpdateStatusListener* listener_; DISALLOW_COPY_AND_ASSIGN(GoogleUpdate); }; #endif // CHROME_BROWSER_GOOGLE_GOOGLE_UPDATE_WIN_H_