// 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(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(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);
};

// 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();
};

[
  object,
  dual,
  uuid(68D6C2BD-712E-4c96-93E8-49CB8A9AAEED),
  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*);
  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(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(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 IAppCommand;
  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;
  }

  // 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.
};
