/*
 * Copyright 2010 Vincent Povirk 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 "unknwn.idl";
import "oaidl.idl";
import "ocidl.idl";
import "mscoree.idl";

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef LoadLibrary")
cpp_quote("#endif")

[
    object,
    local,
    uuid(bd39d1d2-ba2f-486a-89b0-b4b0cb466891)
]
interface ICLRRuntimeInfo : IUnknown
{
    HRESULT GetVersionString(
        [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer,
        [in, out] DWORD *pcchBuffer);

    HRESULT GetRuntimeDirectory(
        [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer,
        [in, out] DWORD *pcchBuffer);

    HRESULT IsLoaded(
        [in] HANDLE hndProcess,
        [out, retval] BOOL *pbLoaded);

    HRESULT LoadErrorString(
        [in] UINT iResourceID,
        [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer,
        [in, out] DWORD *pcchBuffer,
        [in] LONG iLocaleid);

    HRESULT LoadLibrary(
        [in] LPCWSTR pwzDllName,
        [out, retval] HMODULE *phndModule);

    HRESULT GetProcAddress(
        [in] LPCSTR pszProcName,
        [out, retval] LPVOID *ppProc);

    HRESULT GetInterface(
        [in] REFCLSID rclsid,
        [in] REFIID riid,
        [out, iid_is(riid), retval] LPVOID *ppUnk);

    HRESULT IsLoadable(
        [out, retval] BOOL *pbLoadable);

    HRESULT SetDefaultStartupFlags(
        [in] DWORD dwStartupFlags,
        [in] LPCWSTR pwzHostConfigFile);

    HRESULT GetDefaultStartupFlags(
        [out] DWORD *pdwStartupFlags,
        [out, size_is(*pcchHostConfigFile)] LPWSTR pwzHostConfigFile,
        [in, out] DWORD *pcchHostConfigFile);

    HRESULT BindAsLegacyV2Runtime();

    HRESULT IsStarted(
        [out] BOOL *pbStarted,
        [out] DWORD *pdwStartupFlags);
};

typedef HRESULT (__stdcall *CallbackThreadSetFnPtr)();
typedef HRESULT (__stdcall *CallbackThreadUnsetFnPtr)();

typedef void (__stdcall *RuntimeLoadedCallbackFnPtr)(
    ICLRRuntimeInfo *pRuntimeInfo,
    CallbackThreadSetFnPtr pfnCallbackThreadSet,
    CallbackThreadUnsetFnPtr pfnCallbackThreadUnset);

cpp_quote("DEFINE_GUID(CLSID_CLRDebuggingLegacy, 0xDF8395B5,0xA4BA,0x450b,0xA7,0x7C,0xA9,0xA4,0x77,0x62,0xC5,0x20);")
cpp_quote("DEFINE_GUID(CLSID_CLRMetaHost, 0x9280188d,0x0e8e,0x4867,0xb3,0x0c,0x7f,0xa8,0x38,0x84,0xe8,0xde);")

[
    object,
    local,
    uuid(d332db9e-b9b3-4125-8207-a14884f53216)
]
interface ICLRMetaHost : IUnknown
{
    HRESULT GetRuntime(
        [in] LPCWSTR pwzVersion,
        [in] REFIID iid,
        [out, iid_is(iid), retval] LPVOID *ppRuntime);

    HRESULT GetVersionFromFile(
        [in] LPCWSTR pwzFilePath,
        [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer,
        [in, out] DWORD *pcchBuffer);

    HRESULT EnumerateInstalledRuntimes(
        [out, retval] IEnumUnknown **ppEnumerator);

    HRESULT EnumerateLoadedRuntimes(
        [in] HANDLE hndProcess,
        [out, retval] IEnumUnknown **ppEnumerator);

    HRESULT RequestRuntimeLoadedNotification(
        [in] RuntimeLoadedCallbackFnPtr pCallbackFunction);

    HRESULT QueryLegacyV2RuntimeBinding(
        [in] REFIID riid,
        [out, iid_is(riid), retval] LPVOID *ppUnk);

    HRESULT ExitProcess(
        [in] INT32 iExitCode);
};

cpp_quote("HRESULT WINAPI CLRCreateInstance(REFCLSID clsid, REFIID riid, LPVOID *ppInterface);")
