Module: wine Branch: master Commit: d54b800793046e9f15718bebf9d4bd13c9614191 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d54b800793046e9f15718bebf9...
Author: Vincent Povirk vincent@codeweavers.com Date: Sun Sep 26 15:54:13 2010 -0500
mscoree: Implement ICLRRuntimeInfo_GetInterface.
---
dlls/mscoree/corruntimehost.c | 78 ++++++++++++++++++++++++++++++++------- dlls/mscoree/metahost.c | 73 +++++++++++++++++++++++++++++++------ dlls/mscoree/mscoree_main.c | 1 + dlls/mscoree/mscoree_private.h | 29 +++++++++++++++ include/mscoree.idl | 2 + 5 files changed, 157 insertions(+), 26 deletions(-)
diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c index 9de9bf5..794f1c8 100644 --- a/dlls/mscoree/corruntimehost.c +++ b/dlls/mscoree/corruntimehost.c @@ -29,20 +29,24 @@
#include "cor.h" #include "mscoree.h" +#include "mscoree_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL( mscoree );
-typedef struct _corruntimehost +struct RuntimeHost { const struct ICorRuntimeHostVtbl *lpVtbl; + const CLRRuntimeInfo *version; + const loaded_mono *mono; LONG ref; -} corruntimehost; + BOOL legacy; /* if True, this was created by create_corruntimehost, and Release frees it */ +};
-static inline corruntimehost *impl_from_ICorRuntimeHost( ICorRuntimeHost *iface ) +static inline RuntimeHost *impl_from_ICorRuntimeHost( ICorRuntimeHost *iface ) { - return (corruntimehost *)((char*)iface - FIELD_OFFSET(corruntimehost, lpVtbl)); + return (RuntimeHost *)((char*)iface - FIELD_OFFSET(RuntimeHost, lpVtbl)); }
/*** IUnknown methods ***/ @@ -50,7 +54,7 @@ static HRESULT WINAPI corruntimehost_QueryInterface(ICorRuntimeHost* iface, REFIID riid, void **ppvObject) { - corruntimehost *This = impl_from_ICorRuntimeHost( iface ); + RuntimeHost *This = impl_from_ICorRuntimeHost( iface ); TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
if ( IsEqualGUID( riid, &IID_ICorRuntimeHost ) || @@ -71,19 +75,19 @@ static HRESULT WINAPI corruntimehost_QueryInterface(ICorRuntimeHost* iface,
static ULONG WINAPI corruntimehost_AddRef(ICorRuntimeHost* iface) { - corruntimehost *This = impl_from_ICorRuntimeHost( iface ); + RuntimeHost *This = impl_from_ICorRuntimeHost( iface ); return InterlockedIncrement( &This->ref ); }
static ULONG WINAPI corruntimehost_Release(ICorRuntimeHost* iface) { - corruntimehost *This = impl_from_ICorRuntimeHost( iface ); + RuntimeHost *This = impl_from_ICorRuntimeHost( iface ); ULONG ref;
ref = InterlockedDecrement( &This->ref ); - if ( ref == 0 ) + if ( ref == 0 && This->legacy ) { - HeapFree( GetProcessHeap(), 0, This ); + RuntimeHost_Destroy(This); }
return ref; @@ -271,18 +275,64 @@ static const struct ICorRuntimeHostVtbl corruntimehost_vtbl = corruntimehost_CurrentDomain };
-IUnknown* create_corruntimehost(void) +HRESULT RuntimeHost_Construct(const CLRRuntimeInfo *runtime_version, + const loaded_mono *loaded_mono, RuntimeHost** result) { - corruntimehost *This; + RuntimeHost *This;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); if ( !This ) - return NULL; + return E_OUTOFMEMORY;
This->lpVtbl = &corruntimehost_vtbl; This->ref = 1; + This->version = runtime_version; + This->mono = loaded_mono; + This->legacy = FALSE; + + return S_OK; +} + +HRESULT RuntimeHost_GetInterface(RuntimeHost *This, REFCLSID clsid, REFIID riid, void **ppv) +{ + IUnknown *unk; + + if (IsEqualGUID(clsid, &CLSID_CorRuntimeHost)) + unk = (IUnknown*)&This->lpVtbl; + else + unk = NULL; + + if (unk) + return IUnknown_QueryInterface(unk, riid, ppv); + else + FIXME("not implemented for class %s\n", debugstr_guid(clsid)); + + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT RuntimeHost_Destroy(RuntimeHost *This) +{ + HeapFree( GetProcessHeap(), 0, This ); + return S_OK; +} + +IUnknown* create_corruntimehost(void) +{ + RuntimeHost *This; + IUnknown *result; + + if (FAILED(RuntimeHost_Construct(NULL, NULL, &This))) + return NULL; + + This->legacy = TRUE; + + if (FAILED(RuntimeHost_GetInterface(This, &CLSID_CorRuntimeHost, &IID_IUnknown, (void**)&result))) + { + RuntimeHost_Destroy(This); + return NULL; + }
- FIXME("return iface %p\n", This); + FIXME("return iface %p\n", result);
- return (IUnknown*) &This->lpVtbl; + return result; } diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c index 159258b..f32afed 100644 --- a/dlls/mscoree/metahost.c +++ b/dlls/mscoree/metahost.c @@ -43,16 +43,6 @@ static const WCHAR net_11_subdir[] = {'1','.','0',0}; static const WCHAR net_20_subdir[] = {'2','.','0',0}; static const WCHAR net_40_subdir[] = {'4','.','0',0};
-struct CLRRuntimeInfo -{ - const struct ICLRRuntimeInfoVtbl *ICLRRuntimeInfo_vtbl; - LPCWSTR mono_libdir; - DWORD major; - DWORD minor; - DWORD build; - int mono_abi_version; -}; - const struct ICLRRuntimeInfoVtbl CLRRuntimeInfoVtbl;
#define NUM_RUNTIMES 3 @@ -75,6 +65,53 @@ static CRITICAL_SECTION_DEBUG runtime_list_cs_debug = }; static CRITICAL_SECTION runtime_list_cs = { &runtime_list_cs_debug, -1, 0, 0, 0, 0 };
+static HRESULT load_mono(CLRRuntimeInfo *This, loaded_mono **result) +{ + /* FIXME: stub */ + *result = NULL; + + return S_OK; +} + +static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost **result) +{ + HRESULT hr = S_OK; + loaded_mono *ploaded_mono; + + if (This->loaded_runtime) + { + *result = This->loaded_runtime; + return hr; + } + + EnterCriticalSection(&runtime_list_cs); + + if (!This->loaded_runtime) + goto end; + + hr = load_mono(This, &ploaded_mono); + + if (SUCCEEDED(hr)) + hr = RuntimeHost_Construct(This, ploaded_mono, &This->loaded_runtime); + +end: + LeaveCriticalSection(&runtime_list_cs); + + if (SUCCEEDED(hr)) + *result = This->loaded_runtime; + + return hr; +} + +void unload_all_runtimes(void) +{ + int i; + + for (i=0; i<NUM_RUNTIMES; i++) + if (runtimes[i].loaded_runtime) + RuntimeHost_Destroy(runtimes[i].loaded_runtime); +} + static HRESULT WINAPI CLRRuntimeInfo_QueryInterface(ICLRRuntimeInfo* iface, REFIID riid, void **ppvObject) @@ -178,9 +215,18 @@ static HRESULT WINAPI CLRRuntimeInfo_GetProcAddress(ICLRRuntimeInfo* iface, static HRESULT WINAPI CLRRuntimeInfo_GetInterface(ICLRRuntimeInfo* iface, REFCLSID rclsid, REFIID riid, LPVOID *ppUnk) { - FIXME("%p %s %s %p\n", iface, debugstr_guid(rclsid), debugstr_guid(riid), ppUnk); + struct CLRRuntimeInfo *This = (struct CLRRuntimeInfo*)iface; + RuntimeHost *host; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p %s %s %p\n", iface, debugstr_guid(rclsid), debugstr_guid(riid), ppUnk); + + hr = CLRRuntimeInfo_GetRuntimeHost(This, &host); + + if (SUCCEEDED(hr)) + hr = RuntimeHost_GetInterface(host, rclsid, riid, ppUnk); + + return hr; }
static HRESULT WINAPI CLRRuntimeInfo_IsLoadable(ICLRRuntimeInfo* iface, @@ -404,6 +450,9 @@ static void find_runtimes(void) { runtimes[i].mono_abi_version = abi_version;
+ strcpyW(runtimes[i].mono_path, mono_path); + strcpyW(runtimes[i].mscorlib_path, lib_path); + any_runtimes_found = TRUE; } } diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c index 5203a41..fe7c35b 100644 --- a/dlls/mscoree/mscoree_main.c +++ b/dlls/mscoree/mscoree_main.c @@ -343,6 +343,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DisableThreadLibraryCalls(hinstDLL); break; case DLL_PROCESS_DETACH: + unload_all_runtimes(); break; } return TRUE; diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h index 5c80848..8604c81 100644 --- a/dlls/mscoree/mscoree_private.h +++ b/dlls/mscoree/mscoree_private.h @@ -30,6 +30,21 @@ HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file); HRESULT assembly_release(ASSEMBLY *assembly); HRESULT assembly_get_runtime_version(ASSEMBLY *assembly, LPSTR *version);
+typedef struct RuntimeHost RuntimeHost; + +typedef struct CLRRuntimeInfo +{ + const struct ICLRRuntimeInfoVtbl *ICLRRuntimeInfo_vtbl; + LPCWSTR mono_libdir; + DWORD major; + DWORD minor; + DWORD build; + int mono_abi_version; + WCHAR mono_path[MAX_PATH]; + WCHAR mscorlib_path[MAX_PATH]; + struct RuntimeHost *loaded_runtime; +} CLRRuntimeInfo; + /* Mono 2.6 embedding */ typedef struct _MonoDomain MonoDomain; typedef struct _MonoAssembly MonoAssembly; @@ -44,4 +59,18 @@ extern MonoDomain* (*mono_jit_init)(const char *file); extern int (*mono_jit_set_trace_options)(const char* options); extern void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir);
+typedef struct loaded_mono +{ +} loaded_mono; + +/* loaded runtime interfaces */ +extern void unload_all_runtimes(void); + +extern HRESULT RuntimeHost_Construct(const CLRRuntimeInfo *runtime_version, + const loaded_mono *loaded_mono, RuntimeHost** result); + +extern HRESULT RuntimeHost_GetInterface(RuntimeHost *This, REFCLSID clsid, REFIID riid, void **ppv); + +extern HRESULT RuntimeHost_Destroy(RuntimeHost *This); + #endif /* __MSCOREE_PRIVATE__ */ diff --git a/include/mscoree.idl b/include/mscoree.idl index 56861cd..07231af 100644 --- a/include/mscoree.idl +++ b/include/mscoree.idl @@ -131,6 +131,8 @@ interface IHostControl : IUnknown [in] IUnknown* appDomainManager); }
+cpp_quote("DEFINE_GUID(CLSID_CorRuntimeHost, 0xcb2f6723,0xab3a,0x11d2,0x9c,0x40,0x00,0xc0,0x4f,0xa3,0x0a,0x3e);") + [ uuid(CB2F6722-AB3A-11d2-9C40-00C04FA30A3E), version(1.0),