[PATCH] Implement IXMLDOMDocument IDispatch interface
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Fri Jan 25 05:34:36 CST 2008
---
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
--------------070108040303020402030602--
More information about the wine-patches
mailing list