/*
 * Copyright 2008 Hans Leidekker for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

cpp_quote("DEFINE_GUID(CLSID_AutomaticUpdates, 0xbfe18e9c,0x6d87,0x4450,0xb3,0x7c,0xe0,0x2f,0x0b,0x37,0x38,0x03);")
cpp_quote("DEFINE_GUID(CLSID_UpdateSession, 0x4cb43d7f,0x7eee,0x4906,0x86,0x98,0x60,0xda,0x1c,0x38,0xf2,0xfe);")

import "oaidl.idl";

interface IAutomaticUpdates;
interface IAutomaticUpdatesSettings;
interface IDownloadJob;
interface IDownloadResult;
interface IInstallationJob;
interface IInstallationResult;
interface ISearchJob;
interface ISearchResult;
interface IUpdateCollection;
interface IUpdateDownloader;
interface IUpdateHistoryEntryCollection;
interface IUpdateInstaller;
interface IUpdateSearcher;
interface IUpdateSession;
interface IWebProxy;

typedef [public] enum tagDownloadPriority
{
    dpLow    = 1,
    dpNormal = 2,
    dpHigh   = 3,
} DownloadPriority;

typedef [public] enum tagServerSelection
{
    ssDefault       = 0,
    ssManagedServer = 1,
    ssWindowsUpdate = 2,
    ssOthers        = 3,
} ServerSelection;

[
    object,
    uuid(673425bf-c082-4c7c-bdfd-569464b8e0ce),
    oleautomation,
    dual,
    nonextensible,
    pointer_default(unique),
    hidden
]
interface IAutomaticUpdates : IDispatch
{
    HRESULT DetectNow();
    HRESULT Pause();
    HRESULT Resume();
    HRESULT ShowSettingsDialog();

    [propget]
    HRESULT Settings(
        [out, retval] IAutomaticUpdatesSettings **retval);

    [propget]
    HRESULT ServiceEnabled(
        [out, retval] VARIANT_BOOL *retval);

    HRESULT EnableService();
}

[
    object,
    uuid(816858a4-260d-4260-933a-2585f1abc76b),
    oleautomation,
    dual,
    nonextensible,
    pointer_default(unique),
]
interface IUpdateSession : IDispatch
{
    [propget]
    HRESULT ClientApplicationID(
        [out, retval] BSTR *retval);

    [propput]
    HRESULT ClientApplicationID(
        [in] BSTR value);

    [propget]
    HRESULT ReadOnly(
        [out, retval] VARIANT_BOOL *retval);

    [propget]
    HRESULT WebProxy(
        [out, retval] IWebProxy **retval);

    [propput]
    HRESULT WebProxy(
        [in, unique] IWebProxy *value);

    HRESULT CreateUpdateSearcher(
        [out, retval] IUpdateSearcher **retval);

    HRESULT CreateUpdateDownloader(
        [out, retval] IUpdateDownloader **retval);

    HRESULT CreateUpdateInstaller(
        [out, retval] IUpdateInstaller **retval);
}

[
    object,
    uuid(8f45abf1-f9ae-4b95-a933-f0f66e5056ea),
    oleautomation,
    dual,
    nonextensible,
    pointer_default(unique),
]
interface IUpdateSearcher : IDispatch
{
    [propget]
    HRESULT CanAutomaticallyUpgradeService(
        [out, retval] VARIANT_BOOL *retval);

    [propput]
    HRESULT CanAutomaticallyUpgradeService(
        [in] VARIANT_BOOL value);

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

    [propput]
    HRESULT ClientApplicationID(
        [in] BSTR value);

    [propget]
    HRESULT IncludePotentiallySupersededUpdates(
        [out, retval] VARIANT_BOOL *retval);

    [propput]
    HRESULT IncludePotentiallySupersededUpdates(
        [in] VARIANT_BOOL value);

    [propget]
    HRESULT ServerSelection(
        [out, retval] ServerSelection *retval);

    [propput]
    HRESULT ServerSelection(
        [in] ServerSelection value);

    HRESULT BeginSearch(
        [in] BSTR criteria,
        [in] IUnknown *onCompleted,
        [in] VARIANT state,
        [out, retval] ISearchJob **retval);

    HRESULT EndSearch(
        [in] ISearchJob *searchJob,
        [out, retval] ISearchResult **retval);

    HRESULT EscapeString(
        [in] BSTR unescaped,
        [out, retval] BSTR *retval);

    HRESULT QueryHistory(
        [in] LONG startIndex,
        [in] LONG count,
        [out, retval] IUpdateHistoryEntryCollection **retval);

    HRESULT Search(
        [in] BSTR criteria,
        [out, retval] ISearchResult **retval);

    [propget]
    HRESULT Online(
        [out, retval] VARIANT_BOOL *retval);

    [propput]
    HRESULT Online(
        [in] VARIANT_BOOL value);

    HRESULT GetTotalHistoryCount(
        [out, retval] LONG *retval);

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

    [propput]
    HRESULT ServiceID(
        [in] BSTR value);
}

[
    object,
    uuid(68f1c6f9-7ecc-4666-a464-247fe12496c3),
    oleautomation,
    dual,
    nonextensible,
    pointer_default(unique),
    hidden
]
interface IUpdateDownloader : IDispatch
{
    [propget]
    HRESULT ClientApplicationID(
        [out, retval] BSTR *retval);

    [propput]
    HRESULT ClientApplicationID(
        [in] BSTR value);

    [propget]
    HRESULT IsForced(
        [out, retval] VARIANT_BOOL *retval);

    [propput]
    HRESULT IsForced(
        [in] VARIANT_BOOL value);

    [propget]
    HRESULT Priority(
        [out, retval] DownloadPriority *retval);

    [propput]
    HRESULT Priority(
        [in] DownloadPriority value);

    [propget]
    HRESULT Updates(
        [out, retval] IUpdateCollection **retval);

    [propput]
    HRESULT Updates(
        [in] IUpdateCollection *value);

    HRESULT BeginDownload(
        [in] IUnknown *onProgressChanged,
        [in] IUnknown *onCompleted,
        [in] VARIANT state,
        [out, retval] IDownloadJob **retval);

    HRESULT Download(
        [out, retval] IDownloadResult **retval);

    HRESULT EndDownload(
        [in] IDownloadJob *value,
        [out, retval] IDownloadResult **retval);
}

[
    object,
    uuid(7b929c68-ccdc-4226-96b1-8724600b54c2),
    oleautomation,
    dual,
    nonextensible,
    pointer_default(unique),
]
interface IUpdateInstaller : IDispatch
{
    [propget]
    HRESULT ClientApplicationID(
        [out, retval] BSTR *retval);

    [propput]
    HRESULT ClientApplicationID(
        [in] BSTR value);

    [propget]
    HRESULT IsForced(
        [out, retval] VARIANT_BOOL *retval);

    [propput]
    HRESULT IsForced(
        [in] VARIANT_BOOL value);

    [propget, restricted]
    HRESULT ParentHwnd(
        [out, retval] HWND *retval);

    [propput, restricted]
    HRESULT ParentHwnd(
        [in, unique] HWND value);

    [propput]
    HRESULT ParentWindow(
        [in, unique] IUnknown *value);

    [propget]
    HRESULT ParentWindow(
        [out, retval] IUnknown **retval);

    [propget]
    HRESULT Updates(
        [out, retval] IUpdateCollection **retval);

    [propput]
    HRESULT Updates(
        [in] IUpdateCollection *value);

    HRESULT BeginInstall(
        [in] IUnknown *onProgressChanged,
        [in] IUnknown *onCompleted,
        [in] VARIANT state,
        [out, retval] IInstallationJob **retval);

    HRESULT BeginUninstall(
        [in] IUnknown *onProgressChanged,
        [in] IUnknown *onCompleted,
        [in] VARIANT state,
        [out, retval] IInstallationJob **retval);

    HRESULT EndInstall(
        [in] IInstallationJob *value,
        [out, retval] IInstallationResult **retval);

    HRESULT EndUninstall(
        [in] IInstallationJob *value,
        [out, retval] IInstallationResult **retval);

    HRESULT Install(
        [out, retval] IInstallationResult **retval);

    HRESULT RunWizard(
        [in, defaultvalue("")] BSTR dialogTitle,
        [out, retval] IInstallationResult **retval);

    [propget]
    HRESULT IsBusy(
        [out, retval] VARIANT_BOOL *retval);

    HRESULT Uninstall(
        [out, retval] IInstallationResult **retval);

    [propget]
    HRESULT AllowSourcePrompts(
        [out, retval] VARIANT_BOOL *retval);

    [propput]
    HRESULT AllowSourcePrompts(
        [in] VARIANT_BOOL value);

    [propget]
    HRESULT RebootRequiredBeforeInstallation(
        [out, retval] VARIANT_BOOL *retval);
}