/*
 * 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")

typedef enum
{
    METAHOST_POLICY_HIGHCOMPAT              = 0,
    METAHOST_POLICY_APPLY_UPGRADE_POLICY    = 0x08,
    METAHOST_POLICY_EMULATE_EXE_LAUNCH      = 0x10,
    METAHOST_POLICY_SHOW_ERROR_DIALOG       = 0x20,
    METAHOST_POLICY_USE_PROCESS_IMAGE_PATH  = 0x40,
    METAHOST_POLICY_ENSURE_SKU_SUPPORTED    = 0x80
} METAHOST_POLICY_FLAGS;

typedef enum
{
    CLR_DEBUGGING_MANAGED_EVENT_PENDING     = 1
} CLR_DEBUGGING_PROCESS_FLAGS;

typedef struct _CLR_DEBUGGING_VERSION
{
    WORD wStructVersion;
    WORD wMajor;
    WORD wMinor;
    WORD wBuild;
    WORD wRevision;
} CLR_DEBUGGING_VERSION;

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

[
    object,
    local,
    uuid(e2190695-77b2-492e-8e14-c4b3a7fdd593)
]
interface ICLRMetaHostPolicy : IUnknown
{
    HRESULT GetRequestedRuntime([in] METAHOST_POLICY_FLAGS dwPolicyFlags,
        [in] LPCWSTR pwzBinary, [in] IStream *pCfgStream,
        [in, out] LPWSTR pwzVersion, [in, out] DWORD *pcchVersion,
        [out] LPWSTR pwzImageVersion, [out, in] DWORD *pcchImageVersion,
        [out] DWORD *pdwConfigFlags, [in] REFIID riid, [retval, out] LPVOID *ppRuntime);
}

[
    uuid(2ebcd49a-1b47-4a61-b13a-4a03701e594b)
]
coclass CLRMetaHostPolicy
{
    [default] interface ICLRMetaHostPolicy;
}

[
    object,
    local,
    uuid(3151c08d-4d09-4f9b-8838-2880bf18fe51)
]
interface ICLRDebuggingLibraryProvider : IUnknown
{
    HRESULT ProvideLibrary([in] const WCHAR *pwszFileName,
            [in] DWORD dwTimestamp, [in] DWORD dwSizeOfImage,
            [out] HMODULE *phModule);
}

[
    object,
    local,
    uuid(d28f3c5a-9634-4206-a509-477552eefb10)
]
interface ICLRDebugging : IUnknown
{
    HRESULT OpenVirtualProcess([in] ULONG64 moduleBaseAddress,
            [in] IUnknown *pDataTarget, [in] ICLRDebuggingLibraryProvider *pLibraryProvider,
            [in] CLR_DEBUGGING_VERSION *pMaxDebuggerSupportedVersion,
            [in] REFIID riidProcess, [out] IUnknown **ppProcess,
            [out, in] CLR_DEBUGGING_VERSION *pVersion,
            [out] CLR_DEBUGGING_PROCESS_FLAGS *pdwFlags);

    HRESULT CanUnloadNow(HMODULE hModule);
}

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