/*
 * Copyright 2010 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 "objidl.idl";
import "oleidl.idl";

interface IAssemblyCache;
interface IAssemblyCacheItem;

typedef struct _FUSION_INSTALL_REFERENCE_
{
    DWORD   cbSize;
    DWORD   dwFlags;
    GUID    guidScheme;
    LPCWSTR szIdentifier;
    LPCWSTR szNonCannonicalData;
} FUSION_INSTALL_REFERENCE, *LPFUSION_INSTALL_REFERENCE;

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

typedef const struct _FUSION_INSTALL_REFERENCE_ *LPCFUSION_INSTALL_REFERENCE;

[
    object,
    uuid(e707dcde-d1cd-11d2-bab9-00c04f8eceae),
    pointer_default(unique),
    local
]
interface IAssemblyCache : IUnknown
{
    HRESULT UninstallAssembly(
        [in] DWORD flags,
        [in] LPCWSTR name,
        [in] LPCFUSION_INSTALL_REFERENCE ref,
        [out, optional] ULONG *disp);

    HRESULT QueryAssemblyInfo(
        [in] DWORD flags,
        [in] LPCWSTR name,
        [in, out] ASSEMBLY_INFO *info);

    HRESULT CreateAssemblyCacheItem(
        [in] DWORD flags,
        [in] PVOID reserved,
        [out] IAssemblyCacheItem **item,
        [in, optional] LPCWSTR name);

    HRESULT Reserved(
        [out] IUnknown **reserved);

    HRESULT InstallAssembly(
        [in] DWORD flags,
        [in] LPCWSTR path,
        [in] LPCFUSION_INSTALL_REFERENCE ref);
}

[
    object,
    uuid(9e3aaeb4-d1cd-11d2-bab9-00c04f8eceae),
    pointer_default(unique),
    local
]
interface IAssemblyCacheItem : IUnknown
{
    HRESULT CreateStream(
        [in] DWORD flags,
        [in] LPCWSTR name,
        [in] DWORD format,
        [in] DWORD format_flags,
        [out] IStream **stream,
        [in, optional] ULARGE_INTEGER *max_size);

    HRESULT Commit(
        [in] DWORD flags,
        [out, optional] ULONG *disp);

    HRESULT AbortItem();
}

cpp_quote("HRESULT WINAPI CreateAssemblyCache(IAssemblyCache**,DWORD);")
