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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
// Copyright (c) 2010 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_
#pragma once
#include <string>
#include "base/basictypes.h"
#include "base/ref_counted.h"
#if defined(OS_WIN)
#include "google_update_idl.h"
#endif
class MessageLoop;
namespace views {
class Window;
}
// 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();
// 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, views::Window* window);
// Pass NULL to clear the listener
void set_status_listener(GoogleUpdateStatusListener* listener) {
listener_ = listener;
}
private:
friend class base::RefCountedThreadSafe<GoogleUpdate>;
virtual ~GoogleUpdate();
// The chromeos implementation is in browser/chromeos/google_update.cpp
#if defined(OS_WIN)
// 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);
#endif
// 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.
// |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.
bool InitiateGoogleUpdateCheck(bool install_if_newer, views::Window* window,
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);
// Which version string Google Update found (if a new one was available).
// Otherwise, this will be blank.
std::wstring 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_UPDATE_H_
|