/*
 * Copyright 2015 Jacek Caban for CodeWeavers
 * Copyright 2016 Michael Müller
 *
 * 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;

cpp_quote("#define MAX_ID_LENGTH            48")
cpp_quote("#define MAX_DISPLAYNAME_LENGTH   128")

cpp_quote("#define URLF_DEFAULT                 0x0")
cpp_quote("#define URLF_EXTRACT                 0x1")
cpp_quote("#define URLF_RELATIVEURL             0x2")
cpp_quote("#define URLF_DELETE_AFTER_EXTRACT    0x4")

cpp_quote("#define ENGINESTATUS_NOTREADY    0x0")
cpp_quote("#define ENGINESTATUS_LOADING     0x1")
cpp_quote("#define ENGINESTATUS_INSTALLING  0x2")
cpp_quote("#define ENGINESTATUS_READY       0x3")

cpp_quote("#define SETACTION_NONE       0x0")
cpp_quote("#define SETACTION_INSTALL    0x1")

cpp_quote("#define INSTALLOPTIONS_NOCACHE               0x01")
cpp_quote("#define INSTALLOPTIONS_DOWNLOAD              0x02")
cpp_quote("#define INSTALLOPTIONS_INSTALL               0x04")
cpp_quote("#define INSTALLOPTIONS_DONTALLOWXPLATFORM    0x08")
cpp_quote("#define INSTALLOPTIONS_FORCEDEPENDENCIES     0x10")

cpp_quote("#define EXECUTEJOB_SILENT                0x01")
cpp_quote("#define EXECUTEJOB_DELETE_JOB            0x02")
cpp_quote("#define EXECUTEJOB_VERIFYFILES           0x08")
cpp_quote("#define EXECUTEJOB_IGNORETRUST           0x10")
cpp_quote("#define EXECUTEJOB_IGNOREDOWNLOADERROR   0x20")
cpp_quote("#define EXECUTEJOB_DONTALLOWCANCEL       0x40")

cpp_quote("#define ENGINEPROBLEM_DOWNLOADFAIL   0x1")

cpp_quote("#define PLATFORM_WIN95       0x01")
cpp_quote("#define PLATFORM_WIN98       0x02")
cpp_quote("#define PLATFORM_NT4         0x04")
cpp_quote("#define PLATFORM_NT5         0x08")
cpp_quote("#define PLATFORM_NT4ALPHA    0x10")
cpp_quote("#define PLATFORM_NT5ALPHA    0x20")
cpp_quote("#define PLATFORM_MILLEN      0x40")
cpp_quote("#define PLATFORM_ALL         (PLATFORM_WIN95 | PLATFORM_WIN98 | PLATFORM_NT4 | PLATFORM_NT5 | PLATFORM_NT4ALPHA | PLATFORM_NT5ALPHA | PLATFORM_MILLEN)")

enum InstallStatus
{
    INSTALLSTATUS_INITIALIZING,
    INSTALLSTATUS_DEPENDENCY,
    INSTALLSTATUS_DOWNLOADING,
    INSTALLSTATUS_COPYING,
    INSTALLSTATUS_RETRYING,
    INSTALLSTATUS_CHECKINGTRUST,
    INSTALLSTATUS_EXTRACTING,
    INSTALLSTATUS_RUNNING,
    INSTALLSTATUS_FINISHED,
    INSTALLSTATUS_DOWNLOADFINISHED,
};

enum ComponentAction
{
    ActionNone,
    ActionInstall,
    ActionUninstall,
};

[
    object,
    local,
    pointer_default(unique)
]
interface ICifComponent
{
    HRESULT GetID(char *id, DWORD size);
    HRESULT GetGUID(char *guid, DWORD size);
    HRESULT GetDescription(char *desc, DWORD size);
    HRESULT GetDetails(char *details, DWORD size);
    HRESULT GetUrl(UINT index, char *url, DWORD size, DWORD *flags);
    HRESULT GetFileExtractList(UINT index, char *extract, DWORD size);
    HRESULT GetUrlCheckRange(UINT index, DWORD *min, DWORD *max);
    HRESULT GetCommand(UINT index, char *cmd, DWORD cmd_size, char *switches, DWORD switch_size, DWORD *type);
    HRESULT GetVersion(DWORD *version, DWORD *build);
    HRESULT GetLocale(char *pszLocale, DWORD size);
    HRESULT GetUninstallKey(char *key, DWORD size);
    HRESULT GetInstalledSize(DWORD *win, DWORD *app);
    DWORD GetDownloadSize();
    DWORD GetExtractSize();
    HRESULT GetSuccessKey(char *key, DWORD size);
    HRESULT GetProgressKeys(char *progress, DWORD progress_size, char *cancel, DWORD cancel_size);
    HRESULT IsActiveSetupAware();
    HRESULT IsRebootRequired();
    HRESULT RequiresAdminRights();
    DWORD GetPriority();
    HRESULT GetDependency(UINT index, char *id, DWORD buf, char *type, DWORD *ver, DWORD *build);
    DWORD GetPlatform();
    HRESULT GetMode(UINT index, char *mode, DWORD size);
    HRESULT GetGroup(char *id, DWORD size);
    HRESULT IsUIVisible();
    HRESULT GetPatchID(char *id, DWORD size);
    HRESULT GetDetVersion(char *dll, DWORD dll_size, char *entry, DWORD entry_size);
    HRESULT GetTreatAsOneComponents(UINT index, char *id, DWORD buf);
    HRESULT GetCustomData(char *key, char *data, DWORD size);
    DWORD IsComponentInstalled();
    HRESULT IsComponentDownloaded();
    DWORD IsThisVersionInstalled(DWORD version, DWORD build, DWORD *ret_version, DWORD *ret_build);
    DWORD GetInstallQueueState();
    HRESULT SetInstallQueueState(DWORD state);
    DWORD GetActualDownloadSize();
    DWORD GetCurrentPriority();
    HRESULT SetCurrentPriority(DWORD priority);
};

[
    object,
    local,
    pointer_default(unique)
]
interface ICifRWComponent : ICifComponent
{
    HRESULT SetGUID(const char *guid);
    HRESULT SetDescription(const char *desc);
    HRESULT SetUrl(UINT index, const char *url, DWORD url_flags);
    HRESULT SetCommand(UINT index, const char *cmd, const char *switches, DWORD type);
    HRESULT SetVersion(const char *version);
    HRESULT SetUninstallKey(const char *key);
    HRESULT SetInstalledSize(DWORD win, DWORD app);
    HRESULT SetDownloadSize(DWORD size);
    HRESULT SetExtractSize(DWORD size);
    HRESULT DeleteDependency(const char *id, char type);
    HRESULT AddDependency(const char *id, char type);
    HRESULT SetUIVisible(BOOL visible);
    HRESULT SetGroup(const char *id);
    HRESULT SetPlatform(DWORD platform);
    HRESULT SetPriority(DWORD priority);
    HRESULT SetReboot(BOOL reboot);
    HRESULT DeleteFromModes(const char *mode);
    HRESULT AddToMode(const char *mode);
    HRESULT SetModes(const char *mode);
    HRESULT CopyComponent(const char *ciffile);
    HRESULT AddToTreatAsOne(const char *compid);
    HRESULT SetDetails(const char *desc);
};

[
    object,
    local,
    pointer_default(unique)
]
interface IEnumCifComponents : IUnknown
{
    HRESULT Next(ICifComponent **);
    HRESULT Reset();
};

[
    object,
    local,
    pointer_default(unique)
]
interface ICifGroup
{
    HRESULT GetID(char *id, DWORD size);
    HRESULT GetDescription(char *desc, DWORD size);
    DWORD GetPriority();

    HRESULT EnumComponents(IEnumCifComponents **, DWORD filter, void *pv);
    DWORD GetCurrentPriority();
};

[
    object,
    local,
    pointer_default(unique)
]
interface ICifRWGroup : ICifGroup
{
   HRESULT SetDescription(const char *desc);
   HRESULT SetPriority(DWORD priority);
   HRESULT SetDetails(const char *details);
};

[
    object,
    local,
    pointer_default(unique)
]
interface IEnumCifGroups : IUnknown
{
    HRESULT Next(ICifGroup **);
    HRESULT Reset();
};

[
    object,
    local,
    pointer_default(unique)
]
interface ICifMode
{
    HRESULT GetID(char *id, DWORD size);
    HRESULT GetDescription(char *desc, DWORD size);
    HRESULT GetDetails(char *details, DWORD size);

    HRESULT EnumComponents(IEnumCifComponents **, DWORD filter, void *pv);
};

[
    object,
    local,
    pointer_default(unique)
]
interface ICifRWMode : ICifMode
{
    HRESULT SetDescription(const char *desc);
    HRESULT SetDetails(const char *details);
};

[
    object,
    local,
    pointer_default(unique)
]
interface IEnumCifModes : IUnknown
{
    HRESULT Next(ICifMode **);
    HRESULT Reset();
};

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;

typedef struct
{
    DWORD cbSize;
    DWORD dwDownloadKBRemaining;
    DWORD dwInstallKBRemaining;
    DWORD dwDownloadSecsRemaining;
    DWORD dwInstallSecsRemaining;
} INSTALLPROGRESS;

[
    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);
}

[
    object,
    local,
    pointer_default(unique)
]
interface ICifRWFile : ICifFile
{
    HRESULT SetDescription(const char *desc);
    HRESULT CreateComponent(const char *id, ICifRWComponent **p);
    HRESULT CreateGroup(const char *id, ICifRWGroup **p);
    HRESULT CreateMode(const char *id, ICifRWMode **p);
    HRESULT DeleteComponent(const char *id);
    HRESULT DeleteGroup(const char *id);
    HRESULT DeleteMode(const char *id);
    HRESULT Flush();
}

[
    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, DWORD *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);
}

[
    uuid(6e449687-c509-11cf-aafa-00aa00b6015c),
    local
]
interface IInstallEngineTiming : IUnknown
{
    HRESULT GetRates(DWORD *download, DWORD *install);
    HRESULT GetInstallProgress(INSTALLPROGRESS *progress);
}

[
    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 { }

cpp_quote("HRESULT WINAPI GetICifFileFromFile(ICifFile **, const char *);")
cpp_quote("HRESULT WINAPI GetICifRWFileFromFile(ICifRWFile **, const char *);")