/*
 * Copyright (C) 2007 Francois Gouget
 * Copyright (C) 2008 Alistair Leslie-Hughes
 *
 * 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";
cpp_quote("/* FIXME: #include <gcghost.h> */")
cpp_quote("/* FIXME: #include <ivalidator.h> */")

cpp_quote("HRESULT     WINAPI CorBindToRuntimeHost(LPCWSTR,LPCWSTR,LPCWSTR,VOID*,DWORD,REFCLSID,REFIID,LPVOID*);")
cpp_quote("void        WINAPI CorExitProcess(int);")
cpp_quote("HRESULT     WINAPI GetCORSystemDirectory(LPWSTR,DWORD,DWORD*);")
cpp_quote("HRESULT     WINAPI GetCORVersion(LPWSTR,DWORD,DWORD*);")
cpp_quote("HRESULT     WINAPI GetRequestedRuntimeInfo(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,LPWSTR,DWORD,DWORD*,LPWSTR,DWORD,DWORD*);")
cpp_quote("HRESULT     WINAPI LoadLibraryShim(LPCWSTR,LPCWSTR,LPVOID,HMODULE*);")
cpp_quote("#ifdef WINE_STRICT_PROTOTYPES")
cpp_quote("typedef HRESULT (__stdcall *FLockClrVersionCallback)(void);")
cpp_quote("#else")
cpp_quote("typedef HRESULT (__stdcall *FLockClrVersionCallback)();")
cpp_quote("#endif")
cpp_quote("HRESULT     WINAPI LockClrVersion(FLockClrVersionCallback,FLockClrVersionCallback*,FLockClrVersionCallback*);")

typedef void* HDOMAINENUM;

[
    uuid(F31D1788-C397-4725-87A5-6AF3472C2791),
    version(1.0),
    object,
    local
]
interface IGCThreadControl : IUnknown
{
    HRESULT ThreadIsBlockingForSuspension();

    HRESULT SuspensionStarting();

    HRESULT SuspensionEnding(DWORD generation);
}

[
    uuid(5513D564-8374-4cb9-AED9-0083F4160A1D),
    version(1.1),
    local,
    object
]
interface IGCHostControl : IUnknown
{
    HRESULT RequestVirtualMemLimit([in] SIZE_T nMaxVirtualMemMB,
                                   [in, out] SIZE_T* nNewMaxVirtualMemMB);
}

[
    uuid(23D86786-0BB5-4774-8FB5-E3522ADD6246),
    version(1.0),
    local,
    object
]
interface IDebuggerThreadControl : IUnknown
{
    HRESULT ThreadIsBlockingForDebugger();

    HRESULT ReleaseAllRuntimeThreads();

    HRESULT StartBlockingForDebugger(DWORD dwUnused);
}

[
    uuid(5C2B07A5-1E98-11d3-872F-00C04F79ED0D),
    version(1.0),
    local,
    object
]
interface ICorConfiguration : IUnknown
{
    HRESULT SetGCThreadControl([in] IGCThreadControl* GCThreadControl);

    HRESULT SetGCHostControl([in] IGCHostControl* GCHostControl);

    HRESULT SetDebuggerThreadControl([in] IDebuggerThreadControl* debuggerThreadControl);

    HRESULT AddDebuggerSpecialThread([in] DWORD specialThreadId);
}

[
    uuid(9065597E-D1A1-4fb2-B6BA-7E1FCE230F61),
    version(1.0),
    local
]
interface ICLRControl : IUnknown
{
    HRESULT GetCLRManager([in] REFIID riid, [out] void **ppObject);

        HRESULT SetAppDomainManagerType([in] LPCWSTR appDomainManagerAssembly,
                          [in] LPCWSTR appDomainManagerType);
}

[
    uuid(02CA073C-7079-4860-880A-C2F7A449C991),
    version(1.0),
    local
]
interface IHostControl : IUnknown
{
    HRESULT GetHostManager( [in] REFIID riid, [out] void **ppObject);

    HRESULT SetAppDomainManager([in] DWORD appDomainID,
                            [in] IUnknown* appDomainManager);
}

[
    uuid(CB2F6722-AB3A-11d2-9C40-00C04FA30A3E),
    version(1.0),
    local,
    object
]
interface ICorRuntimeHost : IUnknown
{
    HRESULT CreateLogicalThreadState();
    HRESULT DeleteLogicalThreadState();
    HRESULT SwitchInLogicalThreadState([in] DWORD *fiberCookie);

    HRESULT SwitchOutLogicalThreadState([out] DWORD **fiberCookie);

    HRESULT LocksHeldByLogicalThread( [out] DWORD *pCount );

    HRESULT MapFile([in] HANDLE hFile, [out] HMODULE* mapAddress);

    HRESULT GetConfiguration([out] ICorConfiguration** pConfiguration);

    HRESULT Start();

    HRESULT Stop();

    HRESULT CreateDomain([in] LPCWSTR friendlyName,
                         [in] IUnknown* identityArray,
                         [out] IUnknown** appDomain);

    HRESULT GetDefaultDomain([out] IUnknown** pAppDomain);

    HRESULT EnumDomains([out] HDOMAINENUM *hEnum);

    HRESULT NextDomain([in] HDOMAINENUM hEnum, [out] IUnknown** appDomain);

    HRESULT CloseEnum([in] HDOMAINENUM hEnum);

    HRESULT CreateDomainEx([in] LPCWSTR friendlyName,
                           [in] IUnknown* setup,
                           [in] IUnknown* evidence,
                           [out] IUnknown** appDomain);

    HRESULT CreateDomainSetup([out] IUnknown** appDomainSetup);

    HRESULT CreateEvidence([out] IUnknown** evidence);

    HRESULT UnloadDomain([in] IUnknown* appDomain);

    HRESULT CurrentDomain([out] IUnknown** appDomain);
};
