/*
 * 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
 */

import "oaidl.idl";

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

[
    helpstring("WUAPI 2.0 Type Library"),
    uuid(b596cc9f-56e5-419e-a622-e01bb457431e),
    version(2.0)
]
library WUApiLib {

importlib("stdole2.tlb");

interface ICategoryCollection;
interface IStringCollection;
interface IUpdateCollection;
interface IUpdateDownloader;
interface IUpdateInstaller;
interface IUpdateSearcher;

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

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

typedef [public] enum tagAutomaticUpdatesNotificationLevel
{
    aunlNotConfigured,
    aunlDisabled,
    aunlNotifyBeforeDownload,
    aunlNotifyBeforeInstallation,
    aunlScheduledInstallation,
} AutomaticUpdatesNotificationLevel;

typedef [public] enum tagAutomaticUpdatesScheduledInstallationDay
{
    ausidEveryDay,
    ausidEverySunday,
    ausidEveryMonday,
    ausidEveryTuesday,
    ausidEveryWednesday,
    ausidEveryThursday,
    ausidEveryFriday,
    ausidEverySaturday,
} AutomaticUpdatesScheduledInstallationDay;

typedef [public] enum tagDownloadPhase
{
    dphInitializing,
    dphDownloading,
    dphVerifying,
} DownloadPhase;

typedef [public] enum tagOperationResultCode
{
    orcNotStarted,
    orcInProgress,
    orcSucceeded,
    orcSucceededWithErrors,
    orcFailed,
    orcAborted,
} OperationResultCode;

typedef [public] enum tagUpdateExceptionContext
{
    uecGeneral = 1,
    uecWindowsDriver,
    uecWindowsInstaller
} UpdateExceptionContext;

typedef [public] enum tagInstallationImpact
{
    iiNormal,
    iiMinor,
    iiRequiresExclusiveHandling
} InstallationImpact;

typedef [public] enum tagInstallationRebootBehavior
{
    irbNeverReboots,
    irbAlwaysRequiresReboot,
    irbCanRequestReboot
} InstallationRebootBehavior;

typedef [public] enum tagUpdateType
{
    utSoftware = 1,
    utDriver
} UpdateType;

typedef [public] enum tagUpdateOperation
{
    uoInstallation = 1,
    uoUninstallation
} UpdateOperation;

typedef [public] enum tagDeploymentAction
{
    daNone,
    daInstallation,
    daUninstallation,
    daDetection
} DeploymentAction;

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(2ee48f22-af3c-405f-8970-f71be12ee9a2),
    pointer_default(unique)
]
interface IAutomaticUpdatesSettings : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT NotificationLevel( [out, retval] AutomaticUpdatesNotificationLevel *retval );

    [propput, id(0x60020001)]
    HRESULT NotificationLevel( [in] AutomaticUpdatesNotificationLevel value );

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

    [propget, id(0x60020003)]
    HRESULT Required( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020004)]
    HRESULT ScheduledInstallationDay( [out, retval] AutomaticUpdatesScheduledInstallationDay *retval );

    [propput, id(0x60020004)]
    HRESULT ScheduledInstallationDay( [in] AutomaticUpdatesScheduledInstallationDay value );

    [propget, id(0x60020005)]
    HRESULT ScheduledInstallationTime( [out, retval] LONG *retval );

    [propput, id(0x60020005)]
    HRESULT ScheduledInstallationTime( [in] LONG value );

    [id(0x60020006)]
    HRESULT Refresh();

    [id(0x60020007)]
    HRESULT Save();
}

[
    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,
    oleautomation,
    dual,
    nonextensible,
    uuid(174c81fe-aecd-4dae-b8a0-2c6318dd86a8),
    pointer_default(unique),
]
interface IWebProxy : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT Address( [out, retval] BSTR *retval );

    [propput, id(0x60020001)]
    HRESULT Address( [in] BSTR value );

    [propget, id(0x60020002)]
    HRESULT BypassList( [out, retval] IStringCollection **retval );

    [propput, id(0x60020002)]
    HRESULT BypassList( [in] IStringCollection *value );

    [propget, id(0x60020003)]
    HRESULT BypassProxyOnLocal( [out, retval] VARIANT_BOOL *retval );

    [propput, id(0x60020003)]
    HRESULT BypassProxyOnLocal( [in] VARIANT_BOOL value );

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

    [propget, id(0x60020005)]
    HRESULT UserName( [out, retval] BSTR *retval );

    [propput, id(0x60020005)]
    HRESULT UserName( [in] BSTR value );

    [id(0x60020006)]
    HRESULT SetPassword( [in] BSTR value );

    [id(0x60020007)]
    HRESULT PromptForCredentials( [in, unique] IUnknown *parentWindow,
                                  [in] BSTR title );

    [restricted, id(0x60020008)]
    HRESULT PromptForCredentialsFromHwnd( [in, unique] HWND parentWindow,
                                          [in] BSTR title );

    [propget, id(0x60020009)]
    HRESULT AutoDetect( [out, retval] VARIANT_BOOL *retval );

    [propput, id(0x60020009)]
    HRESULT AutoDetect( [in] VARIANT_BOOL value );
}

[
    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,
    oleautomation,
    dual,
    nonextensible,
    uuid(7c907864-346c-4aeb-8f3f-57da289f969f),
    pointer_default(unique),
]
interface IImageInformation : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT AltText( [out, retval] BSTR *retval );

    [propget, id(0x60020002)]
    HRESULT Height( [out, retval] LONG *retval );

    [propget, id(0x60020003)]
    HRESULT Source( [out, retval] BSTR *retval );

    [propget, id(0x60020004)]
    HRESULT Width( [out, retval] LONG *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(81ddc1b8-9d35-47a6-b471-5b80f519223b),
    pointer_default(unique),
]
interface ICategory : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Name( [out, retval] BSTR *retval );

    [propget, id(0x60020001)]
    HRESULT CategoryID( [out, retval] BSTR *retval );

    [propget, id(0x60020002)]
    HRESULT Children( [out, retval] ICategoryCollection **retval );

    [propget, id(0x60020003)]
    HRESULT Description( [out, retval] BSTR *retval );

    [propget, id(0x60020004)]
    HRESULT Image( [out, retval] IImageInformation **retval );

    [propget, id(0x60020005)]
    HRESULT Order( [out, retval] LONG *retval );

    [propget, id(0x60020006)]
    HRESULT Parent( [out, retval] ICategory **retval );

    [propget, id(0x60020007)]
    HRESULT Type( [out, retval] BSTR *retval );

    [propget, id(0x60020008)]
    HRESULT Updates( [out, retval] IUpdateCollection **retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(3a56bfb8-576c-43f7-9335-fe4838fd7e37),
    pointer_default(unique),
]
interface ICategoryCollection : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                [out, retval] ICategory **retval );

    [propget, id(DISPID_NEWENUM)]
    HRESULT _NewEnum( [out, retval] IUnknown **retval );

    [propget, id(0x60020001)]
    HRESULT Count( [out, retval] LONG *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(eff90582-2ddc-480f-a06d-60f3fbc362c3),
    pointer_default(unique),
    hidden
]
interface IStringCollection : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                  [out, retval] BSTR *retval );

    [propput, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                [in] BSTR value );

    [propget, id(DISPID_NEWENUM)]
    HRESULT _NewEnum( [out, retval] IUnknown **retval );

    [propget, id(0x60020001)]
    HRESULT Count( [out, retval] LONG *retval );

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

    [id(0x60020003)]
    HRESULT Add( [in] BSTR value,
                 [out, retval] LONG *retval );

    [id(0x60020004)]
    HRESULT Clear();

    [id(0x60020005)]
    HRESULT Copy( [out, retval] IStringCollection **retval );

    [id(0x60020006)]
    HRESULT Insert( [in] LONG index,
                    [in] BSTR value );

    [id(0x60020007)]
    HRESULT RemoveAt( [in] LONG index );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(a376dd5e-09d4-427f-af7c-fed5b6e1c1d6),
    pointer_default(unique),
]
interface IUpdateException : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Message( [out, retval] BSTR *retval );

    [propget, id(0x60020001)]
    HRESULT HResult( [out, retval] LONG *retval );

    [propget, id(0x60020002)]
    HRESULT Context( [out, retval] UpdateExceptionContext *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(503626a3-8e14-4729-9355-0fe664bd2321),
    pointer_default(unique),
]
interface IUpdateExceptionCollection : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                  [out, retval] IUpdateException **retval );

    [propget, id(DISPID_NEWENUM)]
    HRESULT _NewEnum( [out, retval] IUnknown **retval );

    [propget, id(0x60020001)]
    HRESULT Count( [out, retval] LONG *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(46297823-9940-4c09-aed9-cd3ea6d05968),
    pointer_default(unique)
]
interface IUpdateIdentity : IDispatch
{
    [propget, id(0x60020002)]
    HRESULT RevisionNumber( [out, retval] LONG *retval );

    [propget, id(0x60020003)]
    HRESULT UpdateID( [out, retval] BSTR *retval );
}

[
    ,
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(d9a59339-e245-4dbd-9686-4d5763e39624),
    pointer_default(unique),
]
interface IInstallationBehavior : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT CanRequestUserInput( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020002)]
    HRESULT Impact( [out, retval] InstallationImpact *retval );

    [propget, id(0x60020003)]
    HRESULT RebootBehavior( [out, retval] InstallationRebootBehavior *retval );

    [propget, id(0x60020004)]
    HRESULT RequiresNetworkConnectivity( [out, retval] VARIANT_BOOL *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(54a2cb2d-9a0c-48b6-8a50-9abb69ee2d02),
    pointer_default(unique),
]
interface IUpdateDownloadContent : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT DownloadUrl( [out, retval] BSTR *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(bc5513c8-b3b8-4bf7-a4d4-361c0d8c88ba),
    pointer_default(unique),
]
interface IUpdateDownloadContentCollection : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                  [out, retval] IUpdateDownloadContent **retval );

    [propget, id(DISPID_NEWENUM)]
    HRESULT _NewEnum( [out, retval] IUnknown **retval );

    [propget, id(0x60020001)]
    HRESULT Count( [out, retval] LONG *retval );
}

[

    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(6a92b07a-d821-4682-b423-5c805022cc4d),
    pointer_default(unique),
]
interface IUpdate : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Title( [out, retval] BSTR *retval );

    [propget, id(0x60020001)]
    HRESULT AutoSelectOnWebSites( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020002)]
    HRESULT BundledUpdates( [out, retval] IUpdateCollection **retval );

    [propget, id(0x60020003)]
    HRESULT CanRequireSource( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020004)]
    HRESULT Categories( [out, retval] ICategoryCollection **retval );

    [propget, id(0x60020005)]
    HRESULT Deadline( [out, retval] VARIANT *retval );

    [propget, id(0x60020006)]
    HRESULT DeltaCompressedContentAvailable( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020007)]
    HRESULT DeltaCompressedContentPreferred( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020008)]
    HRESULT Description( [out, retval] BSTR *retval );

    [propget, id(0x60020009)]
    HRESULT EulaAccepted( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x6002000a)]
    HRESULT EulaText( [out, retval] BSTR *retval );

    [propget, id(0x6002000b)]
    HRESULT HandlerID( [out, retval] BSTR *retval );

    [propget, id(0x6002000c)]
    HRESULT Identity( [out, retval] IUpdateIdentity **retval );

    [propget, id(0x6002000d)]
    HRESULT Image( [out, retval] IImageInformation **retval );

    [propget, id(0x6002000e)]
    HRESULT InstallationBehavior( [out, retval] IInstallationBehavior **retval );

    [propget, id(0x6002000f)]
    HRESULT IsBeta( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020010)]
    HRESULT IsDownloaded( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020011)]
    HRESULT IsHidden( [out, retval] VARIANT_BOOL *retval );

    [propput, id(0x60020011)]
    HRESULT IsHidden( [in] VARIANT_BOOL value );

    [propget, id(0x60020012)]
    HRESULT IsInstalled( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020013)]
    HRESULT IsMandatory( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020014)]
    HRESULT IsUninstallable( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020015)]
    HRESULT Languages( [out, retval] IStringCollection **retval );

    [propget, id(0x60020016)]
    HRESULT LastDeploymentChangeTime( [out, retval] DATE *retval );

    [propget, id(0x60020017)]
    HRESULT MaxDownloadSize( [out, retval] DECIMAL *retval );

    [propget, id(0x60020018)]
    HRESULT MinDownloadSize( [out, retval] DECIMAL *retval );

    [propget, id(0x60020019)]
    HRESULT MoreInfoUrls( [out, retval] IStringCollection **retval );

    [propget, id(0x6002001a)]
    HRESULT MsrcSeverity( [out, retval] BSTR *retval );

    [propget, id(0x6002001b)]
    HRESULT RecommendedCpuSpeed( [out, retval] LONG *retval );

    [propget, id(0x6002001c)]
    HRESULT RecommendedHardDiskSpace( [out, retval] LONG *retval );

    [propget, id(0x6002001d)]
    HRESULT RecommendedMemory( [out, retval] LONG *retval );

    [propget, id(0x6002001e)]
    HRESULT ReleaseNotes( [out, retval] BSTR *retval );

    [propget, id(0x6002001f)]
    HRESULT SecurityBulletinIDs( [out, retval] IStringCollection **retval );

    [propget, id(0x60020021)]
    HRESULT SupersededUpdateIDs( [out, retval] IStringCollection **retval );

    [propget, id(0x60020022)]
    HRESULT SupportUrl( [out, retval] BSTR *retval );

    [propget, id(0x60020023)]
    HRESULT Type( [out, retval] UpdateType *retval );

    [propget, id(0x60020024)]
    HRESULT UninstallationNotes( [out, retval] BSTR *retval );

    [propget, id(0x60020025)]
    HRESULT UninstallationBehavior( [out, retval] IInstallationBehavior **retval );

    [propget, id(0x60020026)]
    HRESULT UninstallationSteps( [out, retval] IStringCollection **retval );

    [propget, id(0x60020028)]
    HRESULT KBArticleIDs( [out, retval] IStringCollection **retval );

    [id(0x60020027)]
    HRESULT AcceptEula();

    [propget, id(0x60020029)]
    HRESULT DeploymentAction( [out, retval] DeploymentAction *retval );

    [id(0x6002002a)]
    HRESULT CopyFromCache( [in, ref] BSTR path,
                           [in] VARIANT_BOOL toExtractCabFiles );

    [propget, id(0x6002002b)]
    HRESULT DownloadPriority( [out, retval] DownloadPriority *retval );

    [propget, id(0x6002002c)]
    HRESULT DownloadContents( [out, retval] IUpdateDownloadContentCollection **retval );
}

[

    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(07f7438c-7709-4ca5-b518-91279288134e),
    pointer_default(unique),
    hidden
]
interface IUpdateCollection : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                  [out, retval] IUpdate **retval );

    [propput, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                  [in] IUpdate *value );

    [propget, id(DISPID_NEWENUM)]
    HRESULT _NewEnum( [out, retval] IUnknown **retval );

    [propget, id(0x60020001)]
    HRESULT Count( [out, retval] LONG *retval );

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

    [id(0x60020003)]
    HRESULT Add( [in] IUpdate *value,
                 [out, retval] LONG *retval );

    [id(0x60020004)]
    HRESULT Clear();

    [id(0x60020005)]
    HRESULT Copy( [out, retval] IUpdateCollection **retval );

    [id(0x60020006)]
    HRESULT Insert( [in] LONG index,
                [in] IUpdate *value );

    [id(0x60020007)]
    HRESULT RemoveAt( [in] LONG index );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(7366ea16-7a1a-4ea2-b042-973d3e9cd99b),
    pointer_default(unique),
]
interface ISearchJob : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT AsyncState( [out, retval] VARIANT *retval );

    [propget, id(0x60020002)]
    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );

    [id(0x60020003)]
    HRESULT CleanUp();

    [id(0x60020004)]
    HRESULT RequestAbort();
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(d40cff62-e08c-4498-941a-01e25f0fd33c),
    pointer_default(unique),
]
interface ISearchResult : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT ResultCode( [out, retval] OperationResultCode *retval );

    [propget, id(0x60020002)]
    HRESULT RootCategories( [out, retval] ICategoryCollection **retval );

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

    [propget, id(0x60020004)]
    HRESULT Warnings( [out, retval] IUpdateExceptionCollection **retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(be56a644-af0e-4e0e-a311-c1d8e695cbff),
    pointer_default(unique),
]
interface IUpdateHistoryEntry : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT Operation( [out, retval] UpdateOperation *retval );

    [propget, id(0x60020002)]
    HRESULT ResultCode( [out, retval] OperationResultCode *retval );

    [propget, id(0x60020003)]
    HRESULT HResult( [out, retval] LONG *retval );

    [propget, id(0x60020004)]
    HRESULT Date( [out, retval] DATE *retval );

    [propget, id(0x60020005)]
    HRESULT UpdateIdentity( [out, retval] IUpdateIdentity **retval );

    [propget, id(0x60020006)]
    HRESULT Title( [out, retval] BSTR *retval );

    [propget, id(0x60020007)]
    HRESULT Description( [out, retval] BSTR *retval );

    [propget, id(0x60020008)]
    HRESULT UnmappedResultCode( [out, retval] LONG *retval );

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

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

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

    [propget, id(0x6002000c)]
    HRESULT UninstallationSteps( [out, retval] IStringCollection **retval );

    [propget, id(0x6002000d)]
    HRESULT UninstallationNotes( [out, retval] BSTR *retval );

    [propget, id(0x6002000e)]
    HRESULT SupportUrl( [out, retval] BSTR *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(a7f04f3c-a290-435b-aadf-a116c3357a5c),
    pointer_default(unique),
]
interface IUpdateHistoryEntryCollection : IDispatch
{
    [propget, id(DISPID_VALUE)]
    HRESULT Item( [in] LONG index,
                  [out, retval] IUpdateHistoryEntry **retval );

    [propget, id(DISPID_NEWENUM)]
    HRESULT _NewEnum( [out, retval] IUnknown **retval );

    [propget, id(0x60020001)]
    HRESULT Count( [out, retval] LONG *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,
    oleautomation,
    dual,
    nonextensible,
    uuid(bf99af76-b575-42ad-8aa4-33cbb5477af1),
    pointer_default(unique),
]
interface IUpdateDownloadResult : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT HResult( [out, retval] LONG *retval );

    [propget, id(0x60020002)]
    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(d31a5bac-f719-4178-9dbb-5e2cb47fd18a),
    pointer_default(unique),
]
interface IDownloadProgress : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT CurrentUpdateBytesDownloaded( [out, retval] DECIMAL *retval );

    [propget, id(0x60020002)]
    HRESULT CurrentUpdateBytesToDownload( [out, retval] DECIMAL *retval );

    [propget, id(0x60020003)]
    HRESULT CurrentUpdateIndex( [out, retval] LONG *retval );

    [propget, id(0x60020004)]
    HRESULT PercentComplete( [out, retval] LONG *retval );

    [propget, id(0x60020005)]
    HRESULT TotalBytesDownloaded( [out, retval] DECIMAL *retval );

    [propget, id(0x60020006)]
    HRESULT TotalBytesToDownload( [out, retval] DECIMAL *retval );

    [id(0x60020007)]
    HRESULT GetUpdateResult( [in] LONG updateIndex,
                             [out, retval] IUpdateDownloadResult **retval );


    [propget, id(0x60020008)]
    HRESULT CurrentUpdateDownloadPhase( [out, retval] DownloadPhase *retval );

    [propget, id(0x60020009)]
    HRESULT CurrentUpdatePercentComplete( [out, retval] LONG *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(c574de85-7358-43f6-aae8-8697e62d8ba7),
    pointer_default(unique),
]
interface IDownloadJob : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT AsyncState( [out, retval] VARIANT *retval );

    [propget, id(0x60020002)]
    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );

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

    [id(0x60020004)]
    HRESULT CleanUp();

    [id(0x60020005)]
    HRESULT GetProgress( [out, retval] IDownloadProgress **retval );

    [id(0x60020006)]
    HRESULT RequestAbort();
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(daa4fdd0-4727-4dbe-a1e7-745dca317144),
    pointer_default(unique),
]
interface IDownloadResult : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT HResult( [out, retval] LONG *retval );

    [propget, id(0x60020002)]
    HRESULT ResultCode( [out, retval] OperationResultCode *retval );

    [id(0x60020003)]
    HRESULT GetUpdateResult( [in] LONG updateIndex,
                             [out, retval] IUpdateDownloadResult **retval );
}

[
    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,
    oleautomation,
    dual,
    nonextensible,
    uuid(d940f0f8-3cbb-4fd0-993f-471e7f2328ad),
    pointer_default(unique),
]
interface IUpdateInstallationResult : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT HResult( [out, retval] LONG *retval );

    [propget, id(0x60020002)]
    HRESULT RebootRequired( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020003)]
    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(345c8244-43a3-4e32-a368-65f073b76f36),
    pointer_default(unique),
]
interface IInstallationProgress : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT CurrentUpdateIndex( [out, retval] LONG *retval );

    [propget, id(0x60020002)]
    HRESULT CurrentUpdatePercentComplete( [out, retval] LONG *retval );

    [propget, id(0x60020003)]
    HRESULT PercentComplete( [out, retval] LONG *retval );

    [id(0x60020004)]
    HRESULT GetUpdateResult( [in] LONG updateIndex,
                             [out, retval] IUpdateInstallationResult **retval );
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(5c209f0b-bad5-432a-9556-4699bed2638a),
    pointer_default(unique),
]
interface IInstallationJob : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT AsyncState( [out, retval] VARIANT *retval );

    [propget, id(0x60020002)]
    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );

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

    [id(0x60020004)]
    HRESULT CleanUp();

    [id(0x60020005)]
    HRESULT GetProgress( [out, retval] IInstallationProgress **retval );

    [id(0x60020006)]
    HRESULT RequestAbort();
}

[
    object,
    oleautomation,
    dual,
    nonextensible,
    uuid(a43c56d6-7451-48d4-af96-b6cd2d0d9b7a),
    pointer_default(unique),
]
interface IInstallationResult : IDispatch
{
    [propget, id(0x60020001)]
    HRESULT HResult( [out, retval] LONG *retval );

    [propget, id(0x60020002)]
    HRESULT RebootRequired( [out, retval] VARIANT_BOOL *retval );

    [propget, id(0x60020003)]
    HRESULT ResultCode( [out, retval] OperationResultCode *retval );

    [id(0x60020004)]
    HRESULT GetUpdateResult( [in] LONG updateIndex,
                             [out, retval] IUpdateInstallationResult **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);
}

[
    helpstring("AutomaticUpdates Class"),
    threading(both),
    progid("Microsoft.Update.AutoUpdate.1"),
    vi_progid("Microsoft.Update.AutoUpdate"),
    uuid(bfe18e9c-6d87-4450-b37c-e02f0b373803)
]
coclass AutomaticUpdates { interface IAutomaticUpdates; }

[
    helpstring("UpdateSession Class"),
    threading(both),
    progid("Microsoft.Update.Session.1"),
    vi_progid("Microsoft.Update.Session"),
    uuid(4cb43d7f-7eee-4906-8698-60da1c38f2fe)
]
coclass UpdateSession { interface IUpdateSession; }

} /* WUApiLib */
