Re: msxml3: Implement IXMLDOMDocument IDispatch interface
Hi, Was there anything wrong with this patch? Dont commit this patch if nothing is wrong. I will submit a series of patches, that will include these changes. Best Regards Alistair Leslie-Hughes "Alistair Leslie-Hughes" <leslie_alistair(a)hotmail.com> wrote in message news:fnchqv$a5r$1(a)ger.gmane.org...
Hi,
Fixes bug http://bugs.winehq.org/show_bug.cgi?id=11257
Changelog: msxml3: Implement IXMLDOMDocument IDispatch interface
Best Regards Alistair Leslie-Hughes
--------------------------------------------------------------------------------
From 7cc5228684ed6d9aaace829cc1b8ebb43e5f4325 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> Date: Fri, 25 Jan 2008 22:34:36 +1100 Subject: [PATCH] Implement IXMLDOMDocument IDispatch interface To: wine-patches <wine-patches(a)winehq.org>
--- dlls/msxml3/domdoc.c | 53 +++++++++++++++++++++++++++++++++------ dlls/msxml3/main.c | 58 +++++++++++++++++++++++++++++++++++++++++++ dlls/msxml3/msxml_private.h | 8 ++++++ 3 files changed, 111 insertions(+), 8 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 06388c8..9d6b94b 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -416,16 +416,29 @@ static ULONG WINAPI domdoc_Release(
static HRESULT WINAPI domdoc_GetTypeInfoCount( IXMLDOMDocument2 *iface, UINT* pctinfo ) { - FIXME("\n"); - return E_NOTIMPL; + domdoc *This = impl_from_IXMLDOMDocument2( iface ); + + TRACE("(%p)->(%p)\n", This, pctinfo); + + *pctinfo = 1; + + return S_OK; }
static HRESULT WINAPI domdoc_GetTypeInfo( IXMLDOMDocument2 *iface, UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo ) { - FIXME("\n"); - return E_NOTIMPL; + domdoc *This = impl_from_IXMLDOMDocument2( iface ); + HRESULT hr; + + TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); + + hr = get_typeinfo(IXMLDOMDocument2_tid, ppTInfo); + if(SUCCEEDED(hr)) + ITypeInfo_AddRef(*ppTInfo); + + return hr; }
static HRESULT WINAPI domdoc_GetIDsOfNames( @@ -436,8 +449,21 @@ static HRESULT WINAPI domdoc_GetIDsOfNames( LCID lcid, DISPID* rgDispId) { - FIXME("\n"); - return E_NOTIMPL; + domdoc *This = impl_from_IXMLDOMDocument2( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, + lcid, rgDispId); + + if(!rgszNames || cNames == 0 || !rgDispId) + return E_INVALIDARG; + + hr = get_typeinfo(IXMLDOMDocument2_tid, &typeinfo); + if(SUCCEEDED(hr)) + hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); + + return hr; }
@@ -452,8 +478,19 @@ static HRESULT WINAPI domdoc_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - FIXME("\n"); - return E_NOTIMPL; + domdoc *This = impl_from_IXMLDOMDocument2( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + + hr = get_typeinfo(IXMLDOMDocument2_tid, &typeinfo); + if(SUCCEEDED(hr)) + hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); + + return hr; }
diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c index 62bf2b5..41afbe6 100644 --- a/dlls/msxml3/main.c +++ b/dlls/msxml3/main.c @@ -21,6 +21,8 @@
#include "config.h"
+#define COBJMACROS + #include <stdarg.h> #include "windef.h" #include "winbase.h" @@ -34,6 +36,61 @@
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
+ +static ITypeLib *typelib; +static ITypeInfo *typeinfos[LAST_tid]; + +static REFIID tid_ids[] = { + &IID_IXMLDOMDocument2 +}; + +HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo) +{ + HRESULT hres; + + if(!typelib) { + ITypeLib *tl; + + hres = LoadRegTypeLib(&LIBID_MSXML2, 3, 0, LOCALE_SYSTEM_DEFAULT, &tl); + if(FAILED(hres)) { + ERR("LoadRegTypeLib failed: %08x\n", hres); + return hres; + } + + if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) + ITypeLib_Release(tl); + } + + if(!typeinfos[tid]) { + ITypeInfo *typeinfo; + + hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo); + if(FAILED(hres)) { + ERR("GetTypeInfoOfGuid failed: %08x\n", hres); + return hres; + } + + if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL)) + ITypeInfo_Release(typeinfo); + } + + *typeinfo = typeinfos[tid]; + return S_OK; +} + +static void process_detach(void) +{ + if(typelib) { + unsigned i; + + for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) + if(typeinfos[i]) + ITypeInfo_Release(typeinfos[i]); + + ITypeLib_Release(typelib); + } +} + HRESULT WINAPI DllCanUnloadNow(void) { FIXME("\n"); @@ -53,6 +110,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) case DLL_PROCESS_DETACH: #ifdef HAVE_LIBXML2 xmlCleanupParser(); + process_detach(); #endif break; } diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 8d79d2e..c7d97a1 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -91,4 +91,12 @@ extern HRESULT DOMDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj ); extern HRESULT SchemaCache_create( IUnknown *pUnkOuter, LPVOID *ppObj ); extern HRESULT XMLDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj );
+/* typelibs */ +enum tid_t { + IXMLDOMDocument2_tid, + LAST_tid +}; + +extern HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo); + #endif /* __MSXML_PRIVATE__ */ -- 1.5.3.7
--------------------------------------------------------------------------------
participants (1)
-
Alistair Leslie-Hughes