blob: 01886eb5373cd3f453160bfa6cf386944efd97c4 [file] [log] [blame]
// 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_