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@hotmail.com wrote in message news:fnchqv$a5r$1@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@hotmail.com Date: Fri, 25 Jan 2008 22:34:36 +1100 Subject: [PATCH] Implement IXMLDOMDocument IDispatch interface To: wine-patches wine-patches@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
--------------------------------------------------------------------------------