Vincent Povirk : mscoree: Implement ICLRRuntimeInfo_GetInterface.

Alexandre Julliard julliard at winehq.org
Tue Oct 5 12:03:06 CDT 2010


Module: wine
Branch: master
Commit: d54b800793046e9f15718bebf9d4bd13c9614191
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d54b800793046e9f15718bebf9d4bd13c9614191

Author: Vincent Povirk <vincent at 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),




More information about the wine-cvs mailing list