/*
 * Copyright (C) 2007 Francois Gouget
 *
 * 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 "propidl.idl";

cpp_quote("#include <ole2.h>")
/* FIXME: #include "specstrings.h" */
cpp_quote("#include <corerror.h>")
cpp_quote("#include <corhdr.h>")

cpp_quote("DEFINE_GUID(CLSID_CorMetaDataDispenser, 0xe5cb7a31,0x7512,0x11d2,0x89,0xce,0x00,0x80,0xc7,0x92,0xe5,0xd8);")
cpp_quote("DEFINE_GUID(CLSID_CorMetaDataDispenserRuntime, 0x1ec2de53,0x75cc,0x11d2,0x97,0x75,0x00,0xa0,0xc9,0xb4,0xd5,0x0c);")

[
    object,
    local,
    uuid(809c652e-7396-11d2-9771-00a0c9b4d50c)
]
interface IMetaDataDispenser : IUnknown
{
    HRESULT DefineScope(
        [in] REFCLSID rclsid,
        [in] DWORD dwCreateFlags,
        [in] REFIID riid,
        [out] IUnknown **ppIUnk);

    HRESULT OpenScope(
        [in] LPCWSTR szScope,
        [in] DWORD dwOpenFlags,
        [in] REFIID riid,
        [out] IUnknown **ppIUnk);

    HRESULT OpenScopeOnMemory(
        [in] const void *pData,
        [in] ULONG cbData,
        [in] DWORD dwOpenFlags,
        [in] REFIID riid,
        [out] IUnknown **ppIUnk);
}

[
    object,
    local,
    uuid(31bcfce2-dafb-11d2-9f81-00c04f79a0a3)
]
interface IMetaDataDispenserEx : IMetaDataDispenser
{
    HRESULT SetOption(
        [in] REFGUID optionid,
        [in] const VARIANT *value);

    HRESULT GetOption(
        [in] REFGUID optionid,
        [out] VARIANT *pvalue);

    HRESULT OpenScopeOnITypeInfo(
        [in] ITypeInfo *pITI,
        [in] DWORD dwOpenFlags,
        [in] REFIID riid,
        [out] IUnknown **ppIUnk);

    HRESULT GetCORSystemDirectory(
        [out, size_is(cchBuffer)] LPWSTR szBuffer,
        [in] DWORD cchBuffer,
        [out] DWORD *pchBuffer);

    HRESULT FindAssembly(
        [in] LPCWSTR szAppBase,
        [in] LPCWSTR szPrivateBin,
        [in] LPCWSTR szGlobalBin,
        [in] LPCWSTR szAssemblyName,
        [out, size_is(cchName)] LPWSTR szName,
        [in] ULONG cchName,
        [out] ULONG *pcName);

    HRESULT FindAssemblyModule(
        [in] LPCWSTR szAppBase,
        [in] LPCWSTR szPrivateBin,
        [in] LPCWSTR szGlobalBin,
        [in] LPCWSTR szAssemblyName,
        [in] LPCWSTR szModuleName,
        [out, size_is(cchName)] LPWSTR szName,
        [in] ULONG cchName,
        [out] ULONG *pcName);
}

cpp_quote("BOOL        WINAPI _CorDllMain(HINSTANCE,DWORD,LPVOID);")
cpp_quote("__int32     WINAPI _CorExeMain(void);")
cpp_quote("__int32     WINAPI _CorExeMain2(PBYTE,DWORD,LPWSTR,LPWSTR,LPWSTR);")
cpp_quote("VOID        WINAPI _CorImageUnloading(PVOID);")
cpp_quote("HRESULT     WINAPI _CorValidateImage(PVOID*,LPCWSTR);")
cpp_quote("HRESULT     WINAPI CoInitializeCor(DWORD);")
cpp_quote("void        WINAPI CoUninitializeCor(void);")
