1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_GOOGLE_GOOGLE_UPDATE_WIN_H_ 6 #define CHROME_BROWSER_GOOGLE_GOOGLE_UPDATE_WIN_H_ 7 8 #include "base/basictypes.h" 9 #include "base/memory/ref_counted.h" 10 #include "base/strings/string16.h" 11 #include "google_update/google_update_idl.h" 12 13 namespace base { 14 class MessageLoop; 15 } 16 17 namespace views { 18 class Widget; 19 } 20 21 // The status of the upgrade. UPGRADE_STARTED and UPGRADE_CHECK_STARTED are 22 // internal states and will not be reported as results to the listener. 23 // These values are used for a histogram. Do not reorder. 24 enum GoogleUpdateUpgradeResult { 25 // The upgrade has started. 26 UPGRADE_STARTED = 0, 27 // A check for upgrade has been initiated. 28 UPGRADE_CHECK_STARTED = 1, 29 // An update is available. 30 UPGRADE_IS_AVAILABLE = 2, 31 // The upgrade happened successfully. 32 UPGRADE_SUCCESSFUL = 3, 33 // No need to upgrade, Chrome is up to date. 34 UPGRADE_ALREADY_UP_TO_DATE = 4, 35 // An error occurred. 36 UPGRADE_ERROR = 5, 37 NUM_UPGRADE_RESULTS 38 }; 39 40 // These values are used for a histogram. Do not reorder. 41 enum GoogleUpdateErrorCode { 42 // The upgrade completed successfully (or hasn't been started yet). 43 GOOGLE_UPDATE_NO_ERROR = 0, 44 // Google Update only supports upgrading if Chrome is installed in the default 45 // location. This error will appear for developer builds and with 46 // installations unzipped to random locations. 47 CANNOT_UPGRADE_CHROME_IN_THIS_DIRECTORY = 1, 48 // Failed to create Google Update JobServer COM class. 49 GOOGLE_UPDATE_JOB_SERVER_CREATION_FAILED = 2, 50 // Failed to create Google Update OnDemand COM class. 51 GOOGLE_UPDATE_ONDEMAND_CLASS_NOT_FOUND = 3, 52 // Google Update OnDemand COM class reported an error during a check for 53 // update (or while upgrading). 54 GOOGLE_UPDATE_ONDEMAND_CLASS_REPORTED_ERROR = 4, 55 // A call to GetResults failed. 56 GOOGLE_UPDATE_GET_RESULT_CALL_FAILED = 5, 57 // A call to GetVersionInfo failed. 58 GOOGLE_UPDATE_GET_VERSION_INFO_FAILED = 6, 59 // An error occurred while upgrading (or while checking for update). 60 // Check the Google Update log in %TEMP% for more details. 61 GOOGLE_UPDATE_ERROR_UPDATING = 7, 62 // Updates can not be downloaded because the administrator has disabled all 63 // types of updating. 64 GOOGLE_UPDATE_DISABLED_BY_POLICY = 8, 65 // Updates can not be downloaded because the administrator has disabled 66 // manual (on-demand) updates. Automatic background updates are allowed. 67 GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY = 9, 68 NUM_ERROR_CODES 69 }; 70 71 // The GoogleUpdateStatusListener interface is used by components to receive 72 // notifications about the results of an Google Update operation. 73 class GoogleUpdateStatusListener { 74 public: 75 // This function is called when Google Update has finished its operation and 76 // wants to notify us about the results. |results| represents what the end 77 // state is, |error_code| represents what error occurred, |error_message| is a 78 // string version of the same (might be blank) and |version| specifies what 79 // new version Google Update detected (or installed). This value can be a 80 // blank string, if the version tag in the Update{} block (in Google Update's 81 // server config for Chrome) is blank. 82 virtual void OnReportResults(GoogleUpdateUpgradeResult results, 83 GoogleUpdateErrorCode error_code, 84 const base::string16& error_message, 85 const base::string16& version) = 0; 86 }; 87 88 //////////////////////////////////////////////////////////////////////////////// 89 // 90 // The Google Update class is responsible for communicating with Google Update 91 // and get it to perform operations on our behalf (for example, CheckForUpdate). 92 // This class will report back to its parent via the GoogleUpdateStatusListener 93 // interface and will delete itself after reporting back. 94 // 95 //////////////////////////////////////////////////////////////////////////////// 96 class GoogleUpdate : public base::RefCountedThreadSafe<GoogleUpdate> { 97 public: 98 GoogleUpdate(); 99 100 // Ask Google Update to see if a new version is available. If the parameter 101 // |install_if_newer| is true then Google Update will also install that new 102 // version. 103 // |window| should point to a foreground window. This is needed to ensure 104 // that Vista/Windows 7 UAC prompts show up in the foreground. It may also 105 // be null. 106 void CheckForUpdate(bool install_if_newer, HWND window); 107 108 // Pass NULL to clear the listener 109 void set_status_listener(GoogleUpdateStatusListener* listener) { 110 listener_ = listener; 111 } 112 113 private: 114 friend class base::RefCountedThreadSafe<GoogleUpdate>; 115 116 virtual ~GoogleUpdate(); 117 118 // This function reports failure from the Google Update operation to the 119 // listener. 120 // Note, after this function completes, this object will have deleted itself. 121 bool ReportFailure(HRESULT hr, GoogleUpdateErrorCode error_code, 122 const base::string16& error_message, 123 base::MessageLoop* main_loop); 124 125 // The update check needs to run on another thread than the main thread, and 126 // therefore CheckForUpdate will delegate to this function. |main_loop| points 127 // to the message loop that the response must come from. 128 // |window| should point to a foreground window. This is needed to ensure that 129 // Vista/Windows 7 UAC prompts show up in the foreground. It may also be null. 130 void InitiateGoogleUpdateCheck(bool install_if_newer, HWND window, 131 base::MessageLoop* main_loop); 132 133 // This function reports the results of the GoogleUpdate operation to the 134 // listener. If results indicates an error, the |error_code| and 135 // |error_message| will indicate which error occurred. 136 // Note, after this function completes, this object will have deleted itself. 137 void ReportResults(GoogleUpdateUpgradeResult results, 138 GoogleUpdateErrorCode error_code, 139 const base::string16& error_message); 140 141 // Which version string Google Update found (if a new one was available). 142 // Otherwise, this will be blank. 143 base::string16 version_available_; 144 145 // The listener who is interested in finding out the result of the operation. 146 GoogleUpdateStatusListener* listener_; 147 148 DISALLOW_COPY_AND_ASSIGN(GoogleUpdate); 149 }; 150 151 #endif // CHROME_BROWSER_GOOGLE_GOOGLE_UPDATE_WIN_H_ 152