/*
 * Copyright 2015 Jacek Caban 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
 */

#ifndef __WIDL__
#define threading(model)
#endif

cpp_quote("#if 0")
import "unknwn.idl";
cpp_quote("#endif")

interface IStream;

/* FIXME: Add full declarations. */
interface ICifComponent;
interface IEnumCifComponents;
interface ICifGroup;
interface IEnumCifGroups;
interface ICifMode;
interface IEnumCifModes;

typedef struct {
    DWORD cbSize;
    DWORD dwInstallSize;
    DWORD dwWinDriveSize;
    DWORD dwDownloadSize;
    DWORD dwDependancySize;
    DWORD dwInstallDriveReq;
    DWORD dwWinDriveReq;
    DWORD dwDownloadDriveReq;
    char chWinDrive;
    char chInstallDrive;
    char chDownloadDrive;
    DWORD dwTotalDownloadSize;
} COMPONENT_SIZES;

[
    uuid(6e449688-c509-11cf-aafa-00aa00b6015c),
    local
]
interface ICifFile : IUnknown
{
    HRESULT EnumComponents(IEnumCifComponents **enum_components, DWORD filter, void *pv);
    HRESULT FindComponent(const char *id, ICifComponent **p);
    HRESULT EnumGroups(IEnumCifGroups **enum_groups, DWORD filter, void *pv);
    HRESULT FindGroup(const char *id, ICifGroup **p);
    HRESULT EnumModes(IEnumCifModes **cuf_modes, DWORD filter, void *pv);
    HRESULT FindMode(const char *id, ICifMode **p);
    HRESULT GetDescription(char *desc, DWORD size);
    HRESULT GetDetDlls(char **dlls, DWORD size);
}

[
    uuid(6e449685-c509-11cf-aafa-00aa00b6015c),
    local
]
interface IInstallEngineCallback : IUnknown
{
   HRESULT OnEngineStatusChange(DWORD status, DWORD substatus);
   HRESULT OnStartInstall(DWORD dl_size, DWORD install_size);
   HRESULT OnStartComponent(const char *id, DWORD dl_size, DWORD install_size, const char *string);
   HRESULT OnComponentProgress(const char *id, DWORD phrase, const char *string,
           const char *msg_string, ULONG progress, ULONG max);
   HRESULT OnStopComponent(const char *id, HRESULT error, DWORD phrase, const char *string, DWORD status);
   HRESULT OnStopInstall(HRESULT error, const char *error_string, DWORD status);
   HRESULT OnEngineProblem(DWORD problem, LPDWORD action);
}

[
    uuid(6e449684-c509-11cf-aafa-00aa00b6015c),
    local
]
interface IInstallEngine : IUnknown
{
   HRESULT GetEngineStatus(DWORD *status);
   HRESULT SetCifFile(const char *cab_name, const char *cif_name);
   HRESULT DownloadComponents(DWORD flags);
   HRESULT InstallComponents(DWORD flags);
   HRESULT EnumInstallIDs(UINT index, char **id);
   HRESULT EnumDownloadIDs(UINT index, char **id);
   HRESULT IsComponentInstalled(const char *id, DWORD *status);
   HRESULT RegisterInstallEngineCallback(IInstallEngineCallback *callback);
   HRESULT UnregisterInstallEngineCallback();
   HRESULT SetAction(const char *id, DWORD action, DWORD priority);
   HRESULT GetSizes(const char *id, COMPONENT_SIZES *sizes);
   HRESULT LaunchExtraCommand(const char *inf_name, const char *section);
   HRESULT GetDisplayName(const char *id, const char *name);
   HRESULT SetBaseUrl(const char *base_name);
   HRESULT SetDownloadDir(const char *download_dir);
   HRESULT SetInstallDrive(char drive);
   HRESULT SetInstallOptions(DWORD flags);
   HRESULT SetHWND(HWND hwnd);
   HRESULT SetIStream(IStream *stream);
   HRESULT Abort(DWORD flags);
   HRESULT Suspend();
   HRESULT Resume();
}

[
    uuid(6e449689-c509-11cf-aafa-00aa00b6015c),
    local
]
interface IInstallEngine2 : IInstallEngine
{
    HRESULT SetLocalCif(const char *cif);
    HRESULT GetICifFile(ICifFile **cif_file);
}

[
    helpstring("Microsoft Active Setup Engine"),
    threading(apartment),
    uuid(6e449686-c509-11cf-aafa-00aa00b6015c)
]
coclass InstallEngine { }

[
    helpstring("Download Site Manager"),
    threading(apartment),
    uuid(bfc880f1-7484-11d0-8309-00aa00b6015c)
]
coclass DownloadSiteMgr { }