// Copyright 2006 Google Inc. All Rights Reserved.
//
// Author: Vivek Rao - vivekrao@google.com
//
// The proxy clsid #defined as PROXY_CLSID_IS in mk_common needs to be changed
// anytime any interface below changes, or if a new interface is added.

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

[
  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://go/queryinfoflags
  //                                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);
};

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,
} CompletionCodes;

[
  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] CompletionCodes code,
                     [in, string] const WCHAR* reserved);
  HRESULT SetEventSink([in] IProgressWndEvents* ui_sink);
};

// TODO(ganesh): Component story.
// TODO(ganesh): Should CheckForUpdate be synchronous? We can avoid the
// observer. However, it may block the UI.
// TODO(ganesh): On-Demand Installs.
[
  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);
};

[
  uuid(7E6CD20B-8688-4960-96D9-B979471577B8),
  version(1.0),
  helpstring("Google Update Type Library")
]
library GoogleUpdateLib {
  importlib("stdole2.tlb");
  [
    uuid(ABC01078-F197-4b0b-ADBC-CFE684B39C82),
    helpstring("ProcessLauncherClass Class")
  ]
  coclass ProcessLauncherClass {
    [default] interface IProcessLauncher;
  }

  // This coclass declaration exists only for the purpose of forcing
  // ::RegisterTypeLib() to register the interfaces within. This is
  // required so that we can marshal/unmarshal the interfaces using the TypeLib
  // marshaler.
  [
    uuid(9564861C-3469-4c9a-956A-74D5690790E6),
    helpstring("InterfaceRegistrar Class")
  ]
  coclass InterfaceRegistrar {
    [default] interface IBrowserHttpRequest2;
    interface IJobObserver;
    interface IProgressWndEvents;
  }

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

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

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

};