// Copyright 2009-2010 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================

import "oaidl.idl";
import "ocidl.idl";

// When adding interfaces to this file:
//  * Do not use "Google" or "GoogleUpdate" directly. Instead, use preprocessor
//    defines.
//  * Add a test for the Google-specific value to
//    omaha_customization_goopdate_apis_unittest.cc.

//
// Enums.
// These values can be passed to interface methods and/or compared to their
// output.
//

// Must be kept in sync with the enum in base/browser_utils.h.
typedef enum BrowserType {
  BROWSER_UNKNOWN           = 0,
  BROWSER_DEFAULT           = 1,
  BROWSER_INTERNET_EXPLORER = 2,
  BROWSER_FIREFOX           = 3,
  BROWSER_CHROME            = 4,
} BrowserType;

// The normal install flow proceeds from STATE_INIT through
// STATE_INSTALL_COMPLETE in order, skipping states that are not relevant.
// All exceptions and terminal states are start with STATE_INSTALL_COMPLETE.
typedef enum CurrentState {
  STATE_INIT = 1,
  STATE_WAITING_TO_CHECK_FOR_UPDATE = 2,
  STATE_CHECKING_FOR_UPDATE = 3,
  STATE_UPDATE_AVAILABLE = 4,
  STATE_WAITING_TO_DOWNLOAD = 5,
  STATE_RETRYING_DOWNLOAD = 6,
  STATE_DOWNLOADING = 7,
  STATE_DOWNLOAD_COMPLETE = 8,
  STATE_EXTRACTING = 9,
  STATE_APPLYING_DIFFERENTIAL_PATCH = 10,
  // TODO(omaha3): Should we move STATE_DOWNLOAD_COMPLETE here and eliminate
  // STATE_READY_TO_INSTALL?
  STATE_READY_TO_INSTALL = 11,
  STATE_WAITING_TO_INSTALL = 12,
  STATE_INSTALLING = 13,
  STATE_INSTALL_COMPLETE = 14,
  STATE_PAUSED = 15,
  STATE_NO_UPDATE = 16,
  STATE_ERROR = 17,
} CurrentState;

typedef enum InstallPriority {
  INSTALL_PRIORITY_LOW = 0,
  INSTALL_PRIORITY_HIGH = 10,
} InstallPriority;

// Specifies what the client should do after installation.
typedef enum PostInstallAction {
  POST_INSTALL_ACTION_DEFAULT = 0,

  // Caller should exit silently.
  POST_INSTALL_ACTION_EXIT_SILENTLY = 1,

  // Caller should launch the command.
  POST_INSTALL_ACTION_LAUNCH_COMMAND = 2,

  // Caller should launch the command and exit silently.
  POST_INSTALL_ACTION_EXIT_SILENTLY_ON_LAUNCH_COMMAND = 3,

  // The caller should ask the user to restart the browser. If the value of
  // IApp's browser is supported and postInstallUrl is valid, the client should
  // offer to restart the browser. If the user chooses to do so, the client
  // should launch the ICurrentState::postInstallUrl after shutting down and
  // restarting the browser.
  POST_INSTALL_ACTION_RESTART_BROWSER = 4,

  // Similar to POST_INSTALL_ACTION_RESTART_BROWSER, but ask the user to shut
  // down all browsers.
  POST_INSTALL_ACTION_RESTART_ALL_BROWSERS = 5,

  // The caller should ask the user to reboot the machine.
  POST_INSTALL_ACTION_REBOOT = 6,
} PostInstallAction;

enum AppCommandStatus {
  // The command has never been executed.
  COMMAND_STATUS_INIT = 1,
  // The command is running.
  COMMAND_STATUS_RUNNING = 2,
  // An error occurred while launching or monitoring the command.
  COMMAND_STATUS_ERROR = 3,
  // The command has completed execution.
  COMMAND_STATUS_COMPLETE = 4,
};

[
  object,
  dual,
  uuid(6DB17455-4E85-46e7-9D23-E555E4B005AF),
  helpstring("IGoogleUpdate3 Interface"),
  pointer_default(unique)
]
interface IGoogleUpdate3 : IDispatch {
  // TODO(Omaha): Perhaps this interface exposes helpers such as
  // RestartBrowsers, etc.

  // Returns the count of the AppBundles in this IGoogleUpdate3 interface.
  [id(1), propget] HRESULT Count([out, retval] long* count);

  // Returns an IDispatch of the AppBundle in this IGoogleUpdate3 interface at
  // the specified 0-based index. This property has the dispid of DISPID_VALUE
  // to make it the default property of IGoogleUpdate3.
  [id(DISPID_VALUE), propget] HRESULT Item([in] long index,
                                           [out, retval] IDispatch** bundle);
  // Returns an IDispatch to a newly created empty AppBundle.
  [id(2)] HRESULT createAppBundle([out, retval] IDispatch** app_bundle);
}

[
  object,
  dual,
  uuid(fe908cdd-22bb-472a-9870-1a0390e42f36),
  helpstring("IAppBundle Interface"),
  pointer_default(unique)
]
interface IAppBundle : IDispatch {
  // TODO(omaha3): AppBundle::display_name_ is never used. Should we remove?
  [propget] HRESULT displayName([out, retval] BSTR*);
  [propput] HRESULT displayName([in] BSTR);

  [propget] HRESULT displayLanguage([out, retval] BSTR*);
  [propput] HRESULT displayLanguage([in] BSTR);

  [propget] HRESULT installSource([out, retval] BSTR*);
  [propput] HRESULT installSource([in] BSTR);

  [propget] HRESULT originURL([out, retval] BSTR*);
  [propput] HRESULT originURL([in] BSTR);

  [propget] HRESULT offlineDirectory([out, retval] BSTR* offline_dir);
  [propput] HRESULT offlineDirectory([in] BSTR offline_dir);

  [propget] HRESULT sessionId([out, retval] BSTR* session_id);
  [propput] HRESULT sessionId([in] BSTR session_id);

  // Controls whether or not event pings should be sent at the end of
  // an operation.
  [propget] HRESULT sendPings([out, retval] VARIANT_BOOL* send_pings);
  [propput] HRESULT sendPings([in] VARIANT_BOOL send_pings);

  // The priority property determines download speed/priority and the number/
  // frequency of retries.  Use values from the InstallPriority enum.
  [propget] HRESULT priority([out, retval] long* priority);
  [propput] HRESULT priority([in] long priority);

  // Returns the count of the Apps in the AppBundle.
  [id(1), propget] HRESULT Count([out, retval] long* count);

  // Returns an IDispatch of the App in the AppBundle at the specified 0-based
  // index. This property has the dispid of DISPID_VALUE to make it the default
  // property of IAppBundle.
  [id(DISPID_VALUE), propget] HRESULT Item([in] long index,
                                           [out, retval] IDispatch** app);

  // Impersonation and primary tokens set by the client. Typically only
  // set by the gupdatem service. The gupdatem service exposes a narrow
  // interface to medium integrity clients. When a medium integrity client calls
  // into the gupdatem service, the gupdatem service captures the token of the
  // caller, and then calls put_altTokens() on the gupdate service, so that the
  // gupdate service can use it for future download() and install() requests.
  [propput] HRESULT altTokens([in] ULONG_PTR impersonation_token,
                              [in] ULONG_PTR primary_token,
                              [in] DWORD caller_proc_id);

  // Sets a HWND to associate with the client, if any.  This will be used as
  // the parent window for any dialogs that the server may need to display.
  [propput] HRESULT parentHWND([in] ULONG_PTR hwnd);

  // Initializes the bundle with the properties that have been set.
  [id(2)] HRESULT initialize();

  // Returns an IDispatch to a new App for the specified app id.
  // The App is added to the Bundle.
  [id(3)] HRESULT createApp([in] BSTR app_id,
                            [out, retval] IDispatch** app);

  // Returns an IDispatch to a newly created App for the specified app ID. The
  // App is populated with information from the existing installation and added
  // to the Bundle. Fails if the specified app is not installed.
  [id(4)] HRESULT createInstalledApp([in] BSTR app_id,
                                     [out, retval] IDispatch** app);

  // Creates App instances for all installed apps managed by this Omaha
  // instance. Each App is populated with information from the existing install.
  [id(5)] HRESULT createAllInstalledApps();

  // These methods are non-blocking. The operation is scheduled.
  [id(6)] HRESULT checkForUpdate();
  [id(7)] HRESULT download();
  [id(8)] HRESULT install();

  // All-in-one function for automatically updating all apps. Populates the
  // bundle then schedules the update, which includes the update check and
  // download and install, if necessary.
  [id(9)] HRESULT updateAllApps();

  // These three methods are non-blocking. The operation is requested.
  [id(10)] HRESULT stop();
  [id(11)] HRESULT pause();
  [id(12)] HRESULT resume();

  // Returns true if the bundle has an uncompleted non-blocking request.
  [id(13)] HRESULT isBusy([out, retval] VARIANT_BOOL* is_busy);

  // Downloads a package of an installed application.
  [id(14)] HRESULT downloadPackage([in] BSTR app_id, [in] BSTR package_name);

  // TODO(omaha): Define this aggregated bundle state. Is this really a property
  // or should it be getCurrentState?
  // The server and bundle are the only thing that can provide aggregated
  // time estimates for downloads. Also, aggregate percentage is not currently
  // available to the client because the total bytes to download is not
  // available from App in all post-update check states.
  // To do this, we will probably need to know the total expected download
  // size for all packages to be installed - those that are required or in use -
  // by the time the update check phase is complete.
  [id(15), propget] HRESULT currentState([out, retval] VARIANT* current_state);
};

[
  object,
  dual,
  uuid(76F7B787-A67C-4c73-82C7-31F5E3AABC5C),
  helpstring("IApp Interface"),
  pointer_default(unique)
]
interface IApp : IDispatch {
  // Returns a version IDispatch object.
  [id(1), propget] HRESULT currentVersion([out, retval] IDispatch** current);
  [id(2), propget] HRESULT nextVersion([out, retval] IDispatch** next);

  [propget] HRESULT appId([out, retval] BSTR*);

  [propget] HRESULT displayName([out, retval] BSTR*);
  [propput] HRESULT displayName([in] BSTR);

  [propget] HRESULT language([out, retval] BSTR*);
  [propput] HRESULT language([in] BSTR);

  [propget] HRESULT ap([out, retval] BSTR*);
  [propput] HRESULT ap([in] BSTR);

  [propget] HRESULT ttToken([out, retval] BSTR*);
  [propput] HRESULT ttToken([in] BSTR);

  [propget] HRESULT iid([out, retval] BSTR*);
  [propput] HRESULT iid([in] BSTR);

  [propget] HRESULT brandCode([out, retval] BSTR*);
  [propput] HRESULT brandCode([in] BSTR);

  [propget] HRESULT clientId([out, retval] BSTR*);
  [propput] HRESULT clientId([in] BSTR);

  [propget] HRESULT labels([out, retval] BSTR*);
  [propput] HRESULT labels([in] BSTR);

  [propget] HRESULT referralId([out, retval] BSTR*);
  [propput] HRESULT referralId([in] BSTR);

  // Returns an IDispatch to a command defined by this installed app with the
  // specified ID, or NULL if this app is not installed or the command ID is not
  // recognized.
  [propget] HRESULT command([in] BSTR command_id,
                            [out, retval] IDispatch** command);

  // Use values from the BrowserType enum.
  [propget] HRESULT browserType([out, retval] UINT*);
  [propput] HRESULT browserType([in] UINT);

  [propget] HRESULT clientInstallData([out, retval] BSTR*);
  [propput] HRESULT clientInstallData([in] BSTR);

  [propget] HRESULT serverInstallDataIndex([out, retval] BSTR*);
  [propput] HRESULT serverInstallDataIndex([in] BSTR);

  // Set as soon as possible. Error pings are disabled until set to true.
  [propget] HRESULT isEulaAccepted([out, retval] VARIANT_BOOL*);
  [propput] HRESULT isEulaAccepted([in] VARIANT_BOOL);

  [propget] HRESULT usageStatsEnable([out, retval] UINT*);
  [propput] HRESULT usageStatsEnable([in] UINT);

  [propget] HRESULT installTimeDiffSec([out, retval] UINT*);

  // Returns an ICurrentState interface. The object underlying the interface has
  // static data that does not get updated as the server state changes. To get
  // the most "current" state, the currentState property needs to be queried
  // again.
  [propget] HRESULT currentState([out, retval] IDispatch**);
};

[
  object,
  dual,
  uuid(084D78A8-B084-4E14-A629-A2C419B0E3D9),
  helpstring("IApp2 Interface"),
  pointer_default(unique)
]
interface IApp2 : IApp {
  [propget] HRESULT untrustedData([out, retval] BSTR*);
  [propput] HRESULT untrustedData([in] BSTR);
};

[
  object,
  dual,
  uuid(4DE778FE-F195-4ee3-9DAB-FE446C239221),
  helpstring("IAppCommand Interface"),
  pointer_default(unique)
]
interface IAppCommand : IDispatch {
  [propget] HRESULT isWebAccessible([out, retval] VARIANT_BOOL*);
  // Use values from the AppCommandStatus enum.
  [propget] HRESULT status([out, retval] UINT*);
  [propget] HRESULT exitCode([out, retval] DWORD*);
  HRESULT execute([in, optional] VARIANT arg1,
                  [in, optional] VARIANT arg2,
                  [in, optional] VARIANT arg3,
                  [in, optional] VARIANT arg4,
                  [in, optional] VARIANT arg5,
                  [in, optional] VARIANT arg6,
                  [in, optional] VARIANT arg7,
                  [in, optional] VARIANT arg8,
                  [in, optional] VARIANT arg9);
};

[
  object,
  dual,
  uuid(3D05F64F-71E3-48A5-BF6B-83315BC8AE1F),
  helpstring("IAppCommand2 Interface"),
  pointer_default(unique)
]
interface IAppCommand2 : IAppCommand {
  [propget] HRESULT output([out, retval] BSTR*);
};

[
  object,
  dual,
  uuid(BCDCB538-01C0-46d1-A6A7-52F4D021C272),
  helpstring("IAppVersion Interface"),
  pointer_default(unique)
]
interface IAppVersion : IDispatch {
  [propget] HRESULT version([out, retval] BSTR*);

  // [propget] HRESULT installManifest([out, retval] BSTR*);

  // Returns the count of the Packages in the AppVersion.
  [propget] HRESULT packageCount([out, retval] long* count);

  // Returns an IDispatch of the Package in the AppVersion at the specified
  // 0-based index.
  [propget] HRESULT package([in] long index,
                            [out, retval] IDispatch** package);
};

[
  object,
  dual,
  uuid(DCAB8386-4F03-4dbd-A366-D90BC9F68DE6),
  helpstring("IPackage Interface"),
  pointer_default(unique)
]
interface IPackage : IDispatch {
  // Retrieves the package from the package cache and copies it to the
  // directory provided. Returns an error is the package is not available
  // locally.
  [id(1)] HRESULT get([in] BSTR dir);

  // Returns true if the package has been downloaded and is available
  // locally.
  [propget] HRESULT isAvailable([out, retval] VARIANT_BOOL*);

  // Returns the manifest name of the package.
  [propget] HRESULT filename([out, retval] BSTR*);
};

// TODO(omaha3): We should figure out what else we are going to want in this
// interface before dogfood even if we do not implement it.
[
  object,
  dual,
  uuid(247954F9-9EDC-4E68-8CC3-150C2B89EADF),
  helpstring("ICurrentState Interface"),
  pointer_default(unique)
]
interface ICurrentState : IDispatch {
  // This interface is exposed to web clients!
  // TODO(omaha3): Update valid comments once we settle on an implementation.

  // A value from the CurrentState enum. This value determines which of the
  // properties below are valid.
  [propget] HRESULT stateValue([out, retval] LONG*);

  // The remaining properties are only valid in the specified states. For all
  // other states, the values are not specified.

  // This property is valid only when stateValue is STATE_UPDATE_AVAILABLE.
  [propget] HRESULT availableVersion([out, retval] BSTR*);

  // The following three properties are only valid when stateValue is
  // STATE_WAITING_TO_DOWNLOAD, STATE_RETRYING_DOWNLOAD, STATE_DOWNLOADING,
  // STATE_DOWNLOAD_COMPLETE, STATE_EXTRACTING,
  // STATE_APPLYING_DIFFERENTIAL_PATCH, or STATE_READY_TO_INSTALL.

  // Bytes downloaded so far.
  [propget] HRESULT bytesDownloaded([out, retval] ULONG*);

  // Total bytes to download.
  [propget] HRESULT totalBytesToDownload([out, retval] ULONG*);

  // Estimated download time remaining in ms. -1 indicates unknown.
  // Progress may not always be available, so clients should handle the -1 case.
  [propget] HRESULT downloadTimeRemainingMs([out, retval] LONG*);

  [propget] HRESULT nextRetryTime([out, retval] ULONGLONG*);

  // TODO(omaha 3): Need some way to indicate reconnecting, retrying, etc.

  // The following two properties are only valid when stateValue is
  // STATE_INSTALLING or STATE_INSTALL_COMPLETE.

  // Current install progress in percentage from 0 to 100. -1 indicates unknown.
  // Progress may not always be available, so clients should handle the -1 case.
  [propget] HRESULT installProgress([out, retval] LONG*);

  // Estimated download time remaining in ms. -1 indicates unknown.
  // Progress may not always be available, so clients should handle the -1 case.
  [propget] HRESULT installTimeRemainingMs([out, retval] LONG*);

  // The following four properties are only valid when stateValue is
  // STATE_ERROR:

  // Returns true if the app has been canceled.
  [propget] HRESULT isCanceled([out, retval] VARIANT_BOOL* is_canceled);

  // Error code.
  [propget] HRESULT errorCode([out, retval] LONG*);

  // Error extra code.
  [propget] HRESULT extraCode1([out, retval] LONG*);

  // The following three properties are only valid when stateValue is
  // STATE_ERROR or STATE_INSTALL_COMPLETE.
  // TODO(omaha3): If STATE_DOWNLOAD_COMPLETE or STATE_READY_TO_INSTALL becomes
  // a terminal state, does it support completion messages?

  // Completion message, localized in the specified language.
  // TODO(omaha3): If we're going to have bundle error messages too, should the
  // language be at bundle level? Should bundle have its own language setter?
  [propget] HRESULT completionMessage([out, retval] BSTR*);

  // Application installer result code. This is to be used as additional
  // information only. Success/failure should be determined using errorCode.
  // This is an error if errorCode is GOOPDATEINSTALL_E_INSTALLER_FAILED.
  [propget] HRESULT installerResultCode([out, retval] LONG*);

  // Application installer extra code.
  [propget] HRESULT installerResultExtraCode1([out, retval] LONG*);

  // A command that needs to be launched by the client after installation.
  [propget] HRESULT postInstallLaunchCommandLine([out, retval] BSTR*);

  // URL to be launched after restarting the browser.
  [propget] HRESULT postInstallUrl([out, retval] BSTR*);

  // Returns a PostInstallAction value indicating the action to be taken by the
  // client after installation.
  [propget] HRESULT postInstallAction([out, retval] LONG*);
}

[
  object,
  dual,
  uuid(4E223325-C16B-4eeb-AEDC-19AA99A237FA),
  helpstring("IRegistrationUpdateHook Interface"),
  pointer_default(unique)
]
interface IRegistrationUpdateHook : IDispatch {
  HRESULT UpdateRegistry([in] BSTR app_id, [in] VARIANT_BOOL is_machine);
};

[
  object,
  uuid(b3a47570-0a85-4aea-8270-529d47899603),
  helpstring("ICredentialDialog Interface"),
  pointer_default(unique)
]
interface ICredentialDialog : IUnknown {
  HRESULT QueryUserForCredentials([in] ULONG_PTR owner_hwnd,
                                  [in] BSTR server,
                                  [in] BSTR message,
                                  [out] BSTR* username,
                                  [out] BSTR* password);
};

[
  object,
  dual,
  uuid(F63F6F8B-ACD5-413C-A44B-0409136D26CB),
  helpstring("IPolicyStatus Interface"),
  pointer_default(unique)
]
interface IPolicyStatus : IDispatch {
  // Global Update Policies

  // Returns the time interval between update checks in minutes.
  // 0 indicates updates are disabled.
  [propget] HRESULT lastCheckPeriodMinutes([out, retval] DWORD* minutes);

  // For domain-joined machines, returns the suppressed times if any, and also
  // checks the current time against the times that updates are suppressed.
  // Updates are suppressed if the current time falls between the start time and
  // the duration.
  // The duration does not account for daylight savings time. For instance, if
  // the start time is 22:00 hours, and with a duration of 8 hours, the updates
  // will be suppressed for 8 hours regardless of whether daylight savings time
  // changes happen in between.
  [propget] HRESULT updatesSuppressedTimes(
      [out] DWORD* start_hour,
      [out] DWORD* start_min,
      [out] DWORD* duration_min,
      [out] VARIANT_BOOL* are_updates_suppressed);

  // Returns the value of the "DownloadPreference" group policy or an
  // empty string if the group policy does not exist, the policy is unknown, or
  // an error happened.
  [propget] HRESULT downloadPreferenceGroupPolicy([out, retval] BSTR* pref);

  // Gets the total disk size limit for cached packages. When this limit is hit,
  // packages may be deleted from oldest until total size is below the limit.
  [propget] HRESULT packageCacheSizeLimitMBytes([out, retval] DWORD* limit);

  // Gets the package cache life limit. If a cached package is older than this
  // limit, it may be deleted.
  [propget] HRESULT packageCacheExpirationTimeDays([out, retval] DWORD* days);

  // Application Update Policies

  // Returns 1 if installation of the specified app is allowed.
  // Otherwise, returns 0.
  [propget] HRESULT effectivePolicyForAppInstalls([in] BSTR app_id,
                                                  [out, retval] DWORD* policy);

  // Returns 1 if updates of the specified app is allowed.
  // Otherwise, returns one of 0 (Disabled), 2 (ManualUpdatesOnly), or
  // 3 (AutomaticUpdatesOnly).
  [propget] HRESULT effectivePolicyForAppUpdates([in] BSTR app_id,
                                                 [out, retval] DWORD* policy);

  // Returns the target version prefix for the app, if the machine is joined to
  // a domain and has the corresponding policy set.
  // Examples:
  // * "" (or not configured): update to latest version available.
  // * "55.": update to any minor version of 55 (e.g. 55.24.34 or 55.60.2).
  // * "55.2.": update to any minor version of 55.2 (e.g. 55.2.34 or 55.2.2).
  // * "55.24.34": update to this specific version only.
  [propget] HRESULT targetVersionPrefix([in] BSTR app_id,
                                        [out, retval] BSTR* prefix);

  // Returns whether the RollbackToTargetVersion policy has been set for the
  // app. If RollbackToTargetVersion is set, the TargetVersionPrefix policy
  // governs the version to rollback clients with higher versions to.
  [propget] HRESULT isRollbackToTargetVersionAllowed(
      [in] BSTR app_id,
      [out, retval] VARIANT_BOOL* rollback_allowed);
};

// BEGIN gupdatem interfaces.

// The following interfaces are exposed as a narrower version of the
// IGoogleUpdate3 interface from the gupdatem service. These interfaces are
// meant for use from medium and low integrity clients.

[
  object,
  dual,
  uuid(494B20CF-282E-4BDD-9F5D-B70CB09D351E),
  helpstring("IGoogleUpdate3Web Interface"),
  pointer_default(unique)
]
interface IGoogleUpdate3Web : IDispatch {
  HRESULT createAppBundleWeb([out, retval] IDispatch** app_bundle_web);
};

[
  object,
  uuid(2D363682-561D-4c3a-81C6-F2F82107562A),
  helpstring("IGoogleUpdate3WebSecurity Interface"),
  pointer_default(unique)
]
interface IGoogleUpdate3WebSecurity : IUnknown {
  HRESULT setOriginURL([in] BSTR origin_url);
};

[
  object,
  dual,
  uuid(DD42475D-6D46-496a-924E-BD5630B4CBBA),
  helpstring("IAppBundleWeb Interface"),
  pointer_default(unique)
]
interface IAppBundleWeb : IDispatch {
  [id(2)] HRESULT createApp([in] BSTR app_guid,
                            [in] BSTR brand_code,
                            [in] BSTR language,
                            [in] BSTR ap);
  [id(3)] HRESULT createInstalledApp([in] BSTR app_id);
  [id(4)] HRESULT createAllInstalledApps();

  [propget] HRESULT displayLanguage([out, retval] BSTR*);
  [propput] HRESULT displayLanguage([in] BSTR);

  [propput] HRESULT parentHWND([in] ULONG_PTR hwnd);

  [propget] HRESULT length([out, retval] int* index);
  [id(DISPID_VALUE), propget] HRESULT appWeb(
      [in] int index, [out, retval] IDispatch** app_web);

  HRESULT initialize();

  HRESULT checkForUpdate();
  HRESULT download();
  HRESULT install();

  HRESULT pause();
  HRESULT resume();
  HRESULT cancel();

  HRESULT downloadPackage([in] BSTR app_id, [in] BSTR package_name);

  [propget] HRESULT currentState([out, retval] VARIANT* current_state);
};

[
  object,
  dual,
  uuid(18D0F672-18B4-48e6-AD36-6E6BF01DBBC4),
  helpstring("IAppWeb Interface"),
  pointer_default(unique)
]
interface IAppWeb : IDispatch {
  [propget] HRESULT appId([out, retval] BSTR*);

  // Returns an IAppVersionWeb IDispatch object.
  [propget] HRESULT currentVersionWeb([out, retval] IDispatch** current);
  [propget] HRESULT nextVersionWeb([out, retval] IDispatch** next);

  // Returns an IAppCommandWeb IDispatch object, or NULL.
  [propget] HRESULT command([in] BSTR command_id,
                            [out, retval] IDispatch** command);

  HRESULT cancel();

  [propget] HRESULT currentState([out, retval] IDispatch** current_state);

  HRESULT launch();
  HRESULT uninstall();

  [propget] HRESULT serverInstallDataIndex([out, retval] BSTR*);
  [propput] HRESULT serverInstallDataIndex([in] BSTR);
};

[
  object,
  dual,
  uuid(8476CE12-AE1F-4198-805C-BA0F9B783F57),
  helpstring("IAppCommandWeb Interface"),
  pointer_default(unique)
]
interface IAppCommandWeb : IDispatch {
  // Use values from the AppCommandStatus enum.
  [propget] HRESULT status([out, retval] UINT*);
  [propget] HRESULT exitCode([out, retval] DWORD*);
  [propget] HRESULT output([out, retval] BSTR*);
  HRESULT execute([in, optional] VARIANT arg1,
                  [in, optional] VARIANT arg2,
                  [in, optional] VARIANT arg3,
                  [in, optional] VARIANT arg4,
                  [in, optional] VARIANT arg5,
                  [in, optional] VARIANT arg6,
                  [in, optional] VARIANT arg7,
                  [in, optional] VARIANT arg8,
                  [in, optional] VARIANT arg9);
};

[
  object,
  dual,
  uuid(0CD01D1E-4A1C-489d-93B9-9B6672877C57),
  helpstring("IAppVersionWeb Interface"),
  pointer_default(unique)
]
interface IAppVersionWeb : IDispatch {
  [propget] HRESULT version([out, retval] BSTR*);

  // Returns the count of the Packages in the AppVersion.
  [propget] HRESULT packageCount([out, retval] long* count);

  // TODO(omaha3): Implement this after a security review.
  // Returns an IDispatch of the Package in the AppVersion at the specified
  // 0-based index.
  [propget] HRESULT packageWeb([in] long index,
                               [out, retval] IDispatch** package);
};

[
  object,
  dual,
  uuid(2E629606-312A-482f-9B12-2C4ABF6F0B6D),
  helpstring("ICoCreateAsyncStatus Interface"),
  pointer_default(unique)
]
interface ICoCreateAsyncStatus : IDispatch {
  [propget] HRESULT isDone([out, retval] VARIANT_BOOL* is_done);
  [propget] HRESULT completionHResult([out, retval] LONG* hr);
  [propget] HRESULT createdInstance([out, retval] IDispatch** instance);
};

[
  object,
  uuid(DAB1D343-1B2A-47f9-B445-93DC50704BFE),
  helpstring("ICoCreateAsync Interface"),
  pointer_default(unique)
]
interface ICoCreateAsync : IUnknown {
  HRESULT createOmahaMachineServerAsync(
      [in] BSTR origin_url,
      [in] BOOL create_elevated,
      [out, retval] ICoCreateAsyncStatus** status);
};

// END gupdatem interfaces.

// BEGIN Legacy google_update_idl interfaces.

[
  object,
  uuid(5B25A8DC-1780-4178-A629-6BE8B8DEFAA2),
  oleautomation,
  nonextensible,
  pointer_default(unique)
]
interface IBrowserHttpRequest2 : IUnknown {
  // This method will send request/data from the browser process.
  // @param url                     URL where request will be send.
  // @param post_data               POST data, if any. Can be NULL.
  // @param request_headers         HTTP request headers, if any. Can be NULL.
  // @param response_headers_needed HTTP response headers that are needed.
  //                                Should be one of the values listed here:
  //                                    http://msdn.microsoft.com/aa385351.aspx
  //                                The input is a SAFEARRAY of DWORD. Can be a
  //                                VT_EMPTY.
  // @param response_headers        HTTP response headers, returned as SAFEARRAY
  //                                of BSTR. The values corresponding one-to-one
  //                                with the response_headers_needed values. Can
  //                                be NULL if response_headers_needed==VT_EMPTY
  // @param response_code           HTTP response code.
  // @param cache_filename          Cache file that contains the response data.
  HRESULT Send([in] BSTR url,
               [in] BSTR post_data,
               [in] BSTR request_headers,
               [in] VARIANT response_headers_needed,
               [out] VARIANT* response_headers,
               [out] DWORD* response_code,
               [out] BSTR* cache_filename);
};

[
  object,
  oleautomation,
  uuid(128C2DA6-2BC0-44c0-B3F6-4EC22E647964),
  helpstring("Google Update IProcessLauncher Interface"),
  pointer_default(unique)
]
interface IProcessLauncher : IUnknown {
  // @param cmd_line The full command line to execute.
  HRESULT LaunchCmdLine([in, string] const WCHAR* cmd_line);

  // @param browser_type The browser to start.
  // @param url The url to launch the browser with.
  HRESULT LaunchBrowser([in] DWORD browser_type,
                        [in, string] const WCHAR* url);

  // @param app_id Unique id to identify the calling client application
  // @param event_id Unique id for the command
  // @param caller_proc_id The process id of the calling process
  // @param proc_handle The process handle valid in the caller's context
  HRESULT LaunchCmdElevated([in, string] const WCHAR* app_guid,
                            [in, string] const WCHAR* cmd_id,
                            [in] DWORD caller_proc_id,
                            [out] ULONG_PTR* proc_handle);
};

[
  object,
  oleautomation,
  uuid(D106AB5F-A70E-400E-A21B-96208C1D8DBB),
  helpstring("Google Update IProcessLauncher2 Interface"),
  pointer_default(unique)
]
interface IProcessLauncher2 : IProcessLauncher {
  // Launches the command line, returning the COM server's process ID and
  // handles to the launched process and its stdout. The caller is responsible
  // for closing the returned handles (by passing DUPLICATE_CLOSE_SOURCE to
  // DuplicateHandle, for instance).
  // @param cmd_line The full command line to execute.
  // @param server_proc_id The process id of the IProcessLauncher2 COM server.
  // @param proc_handle The process handle valid in the server's context
  // @param stdout_handle The child process's stdout handle valid in the
  //                      server's context.
  HRESULT LaunchCmdLineEx([in, string] const WCHAR* cmd_line,
                          [out] DWORD* server_proc_id,
                          [out] ULONG_PTR* proc_handle,
                          [out] ULONG_PTR* stdout_handle);
};

[
  object,
  oleautomation,
  uuid(5CCCB0EF-7073-4516-8028-4C628D0C8AAB),
  helpstring("Google Update IOneClickProcessLauncher Interface"),
  pointer_default(unique)
]
interface IOneClickProcessLauncher : IUnknown {
  HRESULT LaunchAppCommand([in, string] const WCHAR* app_guid,
                           [in, string] const WCHAR* cmd_id);
};

typedef enum {
  COMPLETION_CODE_SUCCESS = 1,
  COMPLETION_CODE_SUCCESS_CLOSE_UI,
  COMPLETION_CODE_ERROR,
  COMPLETION_CODE_RESTART_ALL_BROWSERS,
  COMPLETION_CODE_REBOOT,
  COMPLETION_CODE_RESTART_BROWSER,
  COMPLETION_CODE_RESTART_ALL_BROWSERS_NOTICE_ONLY,
  COMPLETION_CODE_REBOOT_NOTICE_ONLY,
  COMPLETION_CODE_RESTART_BROWSER_NOTICE_ONLY,
  COMPLETION_CODE_RUN_COMMAND,
} LegacyCompletionCodes;

[
  object,
  oleautomation,
  uuid(1C642CED-CA3B-4013-A9DF-CA6CE5FF6503),
  helpstring("GoogleUpdate UI-specific events Interface"),
  pointer_default(unique)
]
interface IProgressWndEvents : IUnknown {
  // The UI is closing down. The user has clicked on either the "X" or the
  // other buttons of the UI to close the window.
  HRESULT DoClose();

  // Pause has been clicked on.
  HRESULT DoPause();

  // Resume has been clicked on.
  HRESULT DoResume();

  // RestartBrowsers button has been clicked on.
  HRESULT DoRestartBrowsers();

  // Reboot button has been clicked on.
  HRESULT DoReboot();

  // Launch Browser.
  HRESULT DoLaunchBrowser([in, string] const WCHAR* url);
};


[
  object,
  oleautomation,
  uuid(49D7563B-2DDB-4831-88C8-768A53833837),
  helpstring("IJobObserver Interface"),
  pointer_default(unique)
]
interface IJobObserver : IUnknown {
  HRESULT OnShow();
  HRESULT OnCheckingForUpdate();
  HRESULT OnUpdateAvailable([in, string] const WCHAR* version_string);
  HRESULT OnWaitingToDownload();
  HRESULT OnDownloading([in] int time_remaining_ms, [in] int pos);
  HRESULT OnWaitingToInstall();
  HRESULT OnInstalling();
  HRESULT OnPause();
  HRESULT OnComplete([in] LegacyCompletionCodes code,
                     [in, string] const WCHAR* completion_text);
  HRESULT SetEventSink([in] IProgressWndEvents* ui_sink);
};

[
  object,
  oleautomation,
  uuid(19692F10-ADD2-4EFF-BE54-E61C62E40D13),
  helpstring("IJobObserver2 Interface"),
  pointer_default(unique)
]
interface IJobObserver2 : IUnknown {
  // @param time_remaining_ms Remaining install time.
  // @param pos Current install progress in percentage from 0 to 100. -1
  //     indicates unknown.
  HRESULT OnInstalling2([in] int time_remaining_ms, [in] int pos);
};

[
  object,
  oleautomation,
  uuid(31AC3F11-E5EA-4a85-8A3D-8E095A39C27B),
  helpstring("IGoogleUpdate Interface"),
  pointer_default(unique)
]
interface IGoogleUpdate : IUnknown {
  // @param guid The guid for the app to be updated.
  // @param observer The eventing interface.
  HRESULT CheckForUpdate([in, string] const WCHAR* guid,
                         [in] IJobObserver* observer);

  // @param guid The guid for the app to be updated.
  // @param observer The eventing interface.
  HRESULT Update([in, string] const WCHAR* guid,
                 [in] IJobObserver* observer);
};

// IGoogleUpdateCore is an internal Omaha interface.
[
  object,
  oleautomation,
  uuid(909489C2-85A6-4322-AA56-D25278649D67),
  helpstring("Google Update Core Interface"),
  pointer_default(unique)
]
interface IGoogleUpdateCore : IUnknown
{
  // Runs a command elevated.
  //
  // @param app_id Unique id to identify the calling client application
  // @param event_id Unique id for the command
  // @param caller_proc_id The process id of the calling process
  // @param proc_handle The process handle valid in the caller's context
  HRESULT LaunchCmdElevated([in, string] const WCHAR* app_guid,
                            [in, string] const WCHAR* cmd_id,
                            [in] DWORD caller_proc_id,
                            [out] ULONG_PTR* proc_handle);
};

// END Legacy google_update_idl interfaces.

[
  uuid(655DD85A-3C0D-4674-9C58-AF7168C5861E),
  version(1.0),
  helpstring("Google Update 3.0 Type Library")
]
library GoogleUpdate3Lib {
  importlib("stdole2.tlb");

  // These Interfaces are forward declared to ensure that they are described in
  // the generated TLB file. This is required for ATL to correctly implement the
  // corresponding IDispatch interfaces.
  interface IGoogleUpdate3;
  interface IAppBundle;
  interface IApp;
  interface IApp2;
  interface IAppCommand;
  interface IAppCommand2;
  interface IAppVersion;
  interface IPackage;
  interface ICurrentState;

  interface IGoogleUpdate3Web;
  interface IAppBundleWeb;
  interface IAppWeb;
  interface IAppCommandWeb;
  interface IAppVersionWeb;
  interface ICoCreateAsyncStatus;

  [
    uuid(022105BD-948A-40c9-AB42-A3300DDF097F),
    helpstring("GoogleUpdate3 Class for per-user applications")
  ]
  coclass GoogleUpdate3UserClass {
    [default] interface IDispatch;
  }

  [
    uuid(4EB61BAC-A3B6-4760-9581-655041EF4D69),
    helpstring("GoogleUpdate3 Service Class for machine applications")
  ]
  coclass GoogleUpdate3ServiceClass {
    [default] interface IDispatch;
  }

  [
    uuid(22181302-A8A6-4f84-A541-E5CBFC70CC43),
    helpstring("GoogleUpdate3Web for user applications")
  ]
  coclass GoogleUpdate3WebUserClass {
    [default] interface IDispatch;
  }

  [
    uuid(8A1D4361-2C08-4700-A351-3EAA9CBFF5E4),
    helpstring("Pass-through broker for the GoogleUpdate3WebServiceClass")
  ]
  coclass GoogleUpdate3WebMachineClass {
    [default] interface IDispatch;
  }

  [
    uuid(534F5323-3569-4f42-919D-1E1CF93E5BF6),
    helpstring("GoogleUpdate3Web")
  ]
  coclass GoogleUpdate3WebServiceClass {
    [default] interface IDispatch;
  }

  [
    uuid(598FE0E5-E02D-465d-9A9D-37974A28FD42),
    helpstring("Fallback mechanism if GoogleUpdate3WebServiceClass fails")
  ]
  coclass GoogleUpdate3WebMachineFallbackClass {
    [default] interface IDispatch;
  }

  [
    uuid(E8CF3E55-F919-49d9-ABC0-948E6CB34B9F),
    helpstring("CurrentStateUserClass")
  ]
  coclass CurrentStateUserClass {
    [default] interface ICurrentState;
  }

  [
    uuid(9D6AA569-9F30-41ad-885A-346685C74928),
    helpstring("CurrentStateMachineClass")
  ]
  coclass CurrentStateMachineClass {
    [default] interface ICurrentState;
  }

  [
    uuid(7DE94008-8AFD-4c70-9728-C6FBFFF6A73E),
    helpstring("CoCreateAsyncClass")
  ]
  coclass CoCreateAsyncClass {
    [default] interface IUnknown;
  }

  [
    uuid(e67be843-bbbe-4484-95fb-05271ae86750),
    helpstring("CredentialDialogUserClass")
  ]
  coclass CredentialDialogUserClass {
    [default] interface IUnknown;
  }

  [
    uuid(25461599-633d-42b1-84fb-7cd68d026e53),
    helpstring("CredentialDialogMachineClass")
  ]
  coclass CredentialDialogMachineClass {
    [default] interface IUnknown;
  }

  [
    uuid(521FDB42-7130-4806-822A-FC5163FAD983),
    helpstring("PolicyStatusClass Class")
  ]
  coclass PolicyStatusClass {
    [default] interface IUnknown;
  }


  // BEGIN Legacy google_update_idl coclasses.

  [
    uuid(ABC01078-F197-4b0b-ADBC-CFE684B39C82),
    helpstring("ProcessLauncherClass Class")
  ]
  coclass ProcessLauncherClass {
    [default] interface IUnknown;
  }

  [
    uuid(51F9E8EF-59D7-475b-A106-C7EA6F30C119),
    helpstring("OneClickUserProcessLauncherClass Class")
  ]
  coclass OneClickUserProcessLauncherClass {
    [default] interface IOneClickProcessLauncher;
  }

  [
    uuid(AAD4AE2E-D834-46d4-8B09-490FAC9C722B),
    helpstring("OneClickMachineProcessLauncherClass Class")
  ]
  coclass OneClickMachineProcessLauncherClass {
    [default] interface IOneClickProcessLauncher;
  }

  [
    uuid(2F0E2680-9FF5-43c0-B76E-114A56E93598),
    helpstring("OnDemand updates for per-user applications.")
  ]
  coclass OnDemandUserAppsClass {
    [default] interface IUnknown;
  }

  [
    uuid(6F8BD55B-E83D-4a47-85BE-81FFA8057A69),
    helpstring("OnDemand pass-through broker for machine applications.")
  ]
  coclass OnDemandMachineAppsClass {
    [default] interface IUnknown;
  }

  [
    uuid(9465B4B4-5216-4042-9A2C-754D3BCDC410),
    helpstring("OnDemand updates for per-machine applications.")
  ]
  coclass OnDemandMachineAppsServiceClass {
    [default] interface IUnknown;
  }

  [
    uuid(B3D28DBD-0DFA-40e4-8071-520767BADC7E),
    helpstring("Fallback for if OnDemandMachineAppsServiceClass fails.")
  ]
  coclass OnDemandMachineAppsFallbackClass {
    [default] interface IUnknown;
  }

  [
    uuid(E225E692-4B47-4777-9BED-4FD7FE257F0E),
    helpstring("GoogleUpdateCore Class")
  ]
  coclass GoogleUpdateCoreClass
  {
    [default] interface IUnknown;
  }

  [
    uuid(9B2340A0-4068-43d6-B404-32E27217859D),
    helpstring("GoogleUpdateCore Machine Class")
  ]
  coclass GoogleUpdateCoreMachineClass
  {
    [default] interface IUnknown;
  }

  // END Legacy google_update_idl coclasses.
};
