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