/*
 * Copyright 2008 James Hawkins
 *
 * 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 "objidl.idl";

interface IAssemblyCache;
interface IAssemblyCacheItem;
interface IAssemblyEnum;
interface IAssemblyName;

typedef enum
{
    ASM_CACHE_ZAP       = 0x1,
    ASM_CACHE_GAC       = 0x2,
    ASM_CACHE_DOWNLOAD  = 0x4,
    ASM_CACHE_ROOT      = 0x8,
    ASM_CACHE_ROOT_EX   = 0x80
} ASM_CACHE_FLAGS;

typedef enum
{
    peNone      = 0x00000000,
    peMSIL      = 0x00000001,
    peI386      = 0x00000002,
    peIA64      = 0x00000003,
    peAMD64     = 0x00000004,
    peARM       = 0x00000005,
    peInvalid   = 0xffffffff
} PEKIND;

typedef enum _tagAssemblyComparisonResult
{
    ACR_Unknown,
    ACR_EquivalentFullMatch,
    ACR_EquivalentWeakNamed,
    ACR_EquivalentFXUnified,
    ACR_EquivalentUnified,
    ACR_NonEquivalentVersion,
    ACR_NonEquivalent,
    ACR_EquivalentPartialMatch,
    ACR_EquivalentPartialWeakNamed,
    ACR_EquivalentPartialUnified,
    ACR_EquivalentPartialFXUnified,
    ACR_NonEquivalentPartialVersion
} AssemblyComparisonResult;

[
    local,
    object,
    uuid(e707dcde-d1cd-11d2-bab9-00c04f8eceae),
    pointer_default(unique)
]
interface IAssemblyCache : IUnknown
{
    typedef struct _FUSION_INSTALL_REFERENCE_
    {
        DWORD cbSize;
        DWORD dwFlags;
        GUID guidScheme;
        LPCWSTR szIdentifier;
        LPCWSTR szNonCannonicalData;
    } FUSION_INSTALL_REFERENCE, *LPFUSION_INSTALL_REFERENCE;

    typedef const FUSION_INSTALL_REFERENCE  *LPCFUSION_INSTALL_REFERENCE;

    typedef struct _ASSEMBLY_INFO
    {
        ULONG cbAssemblyInfo;
        DWORD dwAssemblyFlags;
        ULARGE_INTEGER uliAssemblySizeInKB;
        LPWSTR pszCurrentAssemblyPathBuf;
        ULONG cchBuf;
    } ASSEMBLY_INFO;

    cpp_quote("#define IASSEMBLYCACHE_INSTALL_FLAG_REFRESH       0x00000001")
    cpp_quote("#define IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH 0x00000002")

    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED 1")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_STILL_IN_USE 2")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED 3")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_DELETE_PENDING 4")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_HAS_INSTALL_REFERENCES 5")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_REFERENCE_NOT_FOUND 6")

    cpp_quote("#define QUERYASMINFO_FLAG_VALIDATE   0x00000001")
    cpp_quote("#define QUERYASMINFO_FLAG_GETSIZE    0x00000002")

    cpp_quote("#define ASSEMBLYINFO_FLAG_INSTALLED       0x00000001")
    cpp_quote("#define ASSEMBLYINFO_FLAG_PAYLOADRESIDENT 0x00000002")

    HRESULT UninstallAssembly(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszAssemblyName,
        [in] LPCFUSION_INSTALL_REFERENCE pRefData,
        [out, optional] ULONG *pulDisposition);

    HRESULT QueryAssemblyInfo(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszAssemblyName,
        [in, out] ASSEMBLY_INFO *pAsmInfo);

    HRESULT CreateAssemblyCacheItem(
        [in] DWORD dwFlags,
        [in] PVOID pvReserved,
        [out] IAssemblyCacheItem **ppAsmItem,
        [in, optional] LPCWSTR pszAssemblyName);

    HRESULT CreateAssemblyScavenger([out] IUnknown **ppUnkReserved);

    HRESULT InstallAssembly(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszManifestFilePath,
        [in] LPCFUSION_INSTALL_REFERENCE pRefData);
}

[
    local,
    object,
    uuid(9e3aaeb4-d1cd-11d2-bab9-00c04f8eceae),
    pointer_default(unique)
]
interface IAssemblyCacheItem : IUnknown
{
    cpp_quote("#define STREAM_FORMAT_COMPLIB_MODULE    0")
    cpp_quote("#define STREAM_FORMAT_COMPLIB_MANIFEST  1")
    cpp_quote("#define STREAM_FORMAT_WIN32_MODULE      2")
    cpp_quote("#define STREAM_FORMAT_WIN32_MANIFEST    4")

    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_FLAG_REFRESH       0x00000001")
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_FLAG_FORCE_REFRESH 0x00000002")

    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_INSTALLED 1")
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_REFRESHED 2")
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_ALREADY_INSTALLED 3")

    HRESULT CreateStream(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszStreamName,
        [in] DWORD dwFormat,
        [in] DWORD dwFormatFlags,
        [out] IStream **ppIStream,
        [in, optional] ULARGE_INTEGER *puliMaxSize);

    HRESULT Commit(
        [in] DWORD dwFlags,
        [out, optional] ULONG *pulDisposition);

    HRESULT AbortItem();
}

[
    local,
    object,
    uuid(CD193BC0-B4BC-11d2-9833-00C04FC31D2E),
    pointer_default(unique)
]
interface IAssemblyName: IUnknown
{
    typedef [unique] IAssemblyName *LPASSEMBLYNAME;

    typedef enum
    {
        CANOF_PARSE_DISPLAY_NAME = 0x1,
        CANOF_SET_DEFAULT_VALUES = 0x2,
        CANOF_VERIFY_FRIEND_ASSEMBLYNAME = 0x4,
        CANOF_PARSE_FRIEND_DISPLAY_NAME = CANOF_PARSE_DISPLAY_NAME |
                                          CANOF_VERIFY_FRIEND_ASSEMBLYNAME
    } CREATE_ASM_NAME_OBJ_FLAGS;

    typedef enum
    {
        ASM_NAME_PUBLIC_KEY = 0,
        ASM_NAME_PUBLIC_KEY_TOKEN,
        ASM_NAME_HASH_VALUE,
        ASM_NAME_NAME,
        ASM_NAME_MAJOR_VERSION,
        ASM_NAME_MINOR_VERSION,
        ASM_NAME_BUILD_NUMBER,
        ASM_NAME_REVISION_NUMBER,
        ASM_NAME_CULTURE,
        ASM_NAME_PROCESSOR_ID_ARRAY,
        ASM_NAME_OSINFO_ARRAY,
        ASM_NAME_HASH_ALGID,
        ASM_NAME_ALIAS,
        ASM_NAME_CODEBASE_URL,
        ASM_NAME_CODEBASE_LASTMOD,
        ASM_NAME_NULL_PUBLIC_KEY,
        ASM_NAME_NULL_PUBLIC_KEY_TOKEN,
        ASM_NAME_CUSTOM,
        ASM_NAME_NULL_CUSTOM,
        ASM_NAME_MVID,
        ASM_NAME_FILE_MAJOR_VERSION,
        ASM_NAME_FILE_MINOR_VERSION,
        ASM_NAME_FILE_BUILD_NUMBER,
        ASM_NAME_FILE_REVISION_NUMBER,
        ASM_NAME_RETARGET,
        ASM_NAME_SIGNATURE_BLOB,
        ASM_NAME_CONFIG_MASK,
        ASM_NAME_ARCHITECTURE,
        ASM_NAME_MAX_PARAMS
    } ASM_NAME;

    typedef enum
    {
        ASM_DISPLAYF_VERSION = 0x1,
        ASM_DISPLAYF_CULTURE = 0x2,
        ASM_DISPLAYF_PUBLIC_KEY_TOKEN = 0x4,
        ASM_DISPLAYF_PUBLIC_KEY = 0x8,
        ASM_DISPLAYF_CUSTOM = 0x10,
        ASM_DISPLAYF_PROCESSORARCHITECTURE = 0x20,
        ASM_DISPLAYF_LANGUAGEID = 0x40,
        ASM_DISPLAYF_RETARGET = 0x80,
        ASM_DISPLAYF_CONFIG_MASK = 0x100,
        ASM_DISPLAYF_MVID = 0x200,

        ASM_DISPLAYF_FULL = ASM_DISPLAYF_VERSION |
                            ASM_DISPLAYF_CULTURE |
                            ASM_DISPLAYF_PUBLIC_KEY_TOKEN |
                            ASM_DISPLAYF_RETARGET |
                            ASM_DISPLAYF_PROCESSORARCHITECTURE,
    } ASM_DISPLAY_FLAGS;

    typedef enum
    {
        ASM_CMPF_NAME               = 0x1,
        ASM_CMPF_MAJOR_VERSION      = 0x2,
        ASM_CMPF_MINOR_VERSION      = 0x4,
        ASM_CMPF_BUILD_NUMBER       = 0x8,
        ASM_CMPF_REVISION_NUMBER    = 0x10,
        ASM_CMPF_VERSION = ASM_CMPF_MAJOR_VERSION |
                           ASM_CMPF_MINOR_VERSION |
                           ASM_CMPF_BUILD_NUMBER |
                           ASM_CMPF_REVISION_NUMBER,
        ASM_CMPF_PUBLIC_KEY_TOKEN   = 0x20,
        ASM_CMPF_CULTURE            = 0x40,
        ASM_CMPF_CUSTOM             = 0x80,
        ASM_CMPF_DEFAULT            = 0x100,
        ASM_CMPF_RETARGET           = 0x200,
        ASM_CMPF_ARCHITECTURE       = 0x400,
        ASM_CMPF_CONFIG_MASK        = 0x800,
        ASM_CMPF_MVID               = 0x1000,
        ASM_CMPF_SIGNATURE          = 0x2000,
        ASM_CMPF_IL_ALL = ASM_CMPF_NAME |
                          ASM_CMPF_VERSION |
                          ASM_CMPF_PUBLIC_KEY_TOKEN |
                          ASM_CMPF_CULTURE,
        ASM_CMPF_IL_NO_VERSION = ASM_CMPF_NAME |
                                 ASM_CMPF_PUBLIC_KEY_TOKEN |
                                 ASM_CMPF_CULTURE
    } ASM_CMP_FLAGS;

    HRESULT SetProperty(
        [in] DWORD PropertyId,
        [in] LPVOID pvProperty,
        [in] DWORD cbProperty);

    HRESULT GetProperty(
        [in] DWORD PropertyId,
        [out] LPVOID pvProperty,
        [in, out] LPDWORD pcbProperty);

    HRESULT Finalize();

    HRESULT GetDisplayName(
        [out] LPOLESTR szDisplayName,
        [in, out] LPDWORD pccDisplayName,
        [in] DWORD dwDisplayFlags);

    HRESULT Reserved(
        [in] REFIID refIID,
        [in] IUnknown *pUnkReserved1,
        [in] IUnknown *pUnkReserved2,
        [in] LPCOLESTR szReserved,
        [in] LONGLONG llReserved,
        [in] LPVOID pvReserved,
        [in] DWORD cbReserved,
        [out] LPVOID *ppReserved);

    HRESULT GetName(
        [in, out] LPDWORD lpcwBuffer,
        [out] WCHAR *pwzName);

    HRESULT GetVersion(
        [out] LPDWORD pdwVersionHi,
        [out] LPDWORD pdwVersionLow);

    HRESULT IsEqual(
        [in] IAssemblyName *pName,
        [in] DWORD dwCmpFlags);

    HRESULT Clone([out] IAssemblyName **pName);
}

[
    local,
    object,
    uuid(21b8916c-f28e-11d2-a473-00c04f8ef448),
    pointer_default(unique)
]
interface IAssemblyEnum : IUnknown
{
    HRESULT GetNextAssembly(
        [in] LPVOID pvReserved,
        [out] IAssemblyName **ppName,
        [in] DWORD dwFlags);

    HRESULT Reset(void);

    HRESULT Clone([out] IAssemblyEnum **ppEnum);
}

[
    local,
    object,
    uuid(582dac66-e678-449f-aba6-6faaec8a9394),
    pointer_default(unique)
]
interface IInstallReferenceItem : IUnknown
{

}

[
    local,
    object,
    uuid(56b1a988-7c0c-4aa2-8639-c3eb5a90226f),
    pointer_default(unique)
]
interface IInstallReferenceEnum : IUnknown
{

}

cpp_quote("HRESULT WINAPI ClearDownloadCache(void);")
cpp_quote("HRESULT WINAPI CompareAssemblyIdentity(LPCWSTR,WINBOOL,LPCWSTR,WINBOOL,WINBOOL*,AssemblyComparisonResult*);")
cpp_quote("HRESULT WINAPI CreateAssemblyCache(IAssemblyCache**,DWORD);")
cpp_quote("HRESULT WINAPI CreateAssemblyEnum(IAssemblyEnum**,IUnknown*,IAssemblyName*,DWORD,LPVOID);")
cpp_quote("HRESULT WINAPI CreateAssemblyNameObject(LPASSEMBLYNAME*,LPCWSTR,DWORD,LPVOID);")
cpp_quote("HRESULT WINAPI CreateInstallReferenceEnum(IInstallReferenceEnum**,IAssemblyName*,DWORD,LPVOID);")
cpp_quote("HRESULT WINAPI GetAssemblyIdentityFromFile(LPCWSTR,REFIID,IUnknown**);")
cpp_quote("HRESULT WINAPI GetCachePath(ASM_CACHE_FLAGS,LPWSTR,PDWORD);")
