1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
// Copyright (c) 2006-2008 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_UPDATE_H_
#define CHROME_BROWSER_GOOGLE_UPDATE_H_
#include <string>
#include "base/basictypes.h"
#include "base/ref_counted.h"
#include "google_update_idl.h"
class MessageLoop;
// 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, we are 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,
};
// 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 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 std::wstring& 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();
virtual ~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.
void CheckForUpdate(bool install_if_newer);
// Adds/removes a listener to report status back to. Only one listener is
// maintained at the moment.
void AddStatusChangeListener(GoogleUpdateStatusListener* listener);
void RemoveStatusChangeListener();
private:
// We need to run the update check on another thread than the main thread, and
// therefore CheckForUpdate will delegate to this function. |main_loop| points
// to the message loop that we want the response to come from.
bool InitiateGoogleUpdateCheck(bool install_if_newer, MessageLoop* main_loop);
// This function reports the results of the GoogleUpdate operation to the
// listener. If results indicates an error, the error_code will indicate which
// error occurred.
// Note, after this function completes, this object will have deleted itself.
void ReportResults(GoogleUpdateUpgradeResult results,
GoogleUpdateErrorCode error_code);
// 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,
MessageLoop* main_loop);
// The listener who is interested in finding out the result of the operation.
GoogleUpdateStatusListener* listener_;
// Which version string Google Update found (if a new one was available).
// Otherwise, this will be blank.
std::wstring version_available_;
DISALLOW_EVIL_CONSTRUCTORS(GoogleUpdate);
};
#endif // CHROME_BROWSER_GOOGLE_UPDATE_H_
|