msxml3: Add stub IConnectionPoint, return points for supported IIDs.

This commit is contained in:
Nikolay Sivov 2010-10-23 17:22:35 +04:00 committed by Alexandre Julliard
parent 0f2c996092
commit 2a080e85e4
2 changed files with 168 additions and 5 deletions

View File

@ -31,6 +31,7 @@
#include "winuser.h"
#include "winnls.h"
#include "ole2.h"
#include "olectl.h"
#include "msxml6.h"
#include "wininet.h"
#include "winreg.h"
@ -79,7 +80,20 @@ typedef struct _domdoc_properties {
BOOL XPath;
} domdoc_properties;
typedef struct _domdoc
typedef struct ConnectionPoint ConnectionPoint;
typedef struct domdoc domdoc;
struct ConnectionPoint
{
const IConnectionPointVtbl *lpVtblConnectionPoint;
const IID *iid;
ConnectionPoint *next;
IConnectionPointContainer *container;
domdoc *doc;
};
struct domdoc
{
xmlnode node;
const struct IXMLDOMDocument3Vtbl *lpVtbl;
@ -106,7 +120,18 @@ typedef struct _domdoc
/* IObjectSafety */
DWORD safeopt;
} domdoc;
/* connection list */
ConnectionPoint *cp_list;
ConnectionPoint cp_domdocevents;
ConnectionPoint cp_propnotif;
ConnectionPoint cp_dispatch;
};
static inline ConnectionPoint *impl_from_IConnectionPoint(IConnectionPoint *iface)
{
return (ConnectionPoint *)((char*)iface - FIELD_OFFSET(ConnectionPoint, lpVtblConnectionPoint));
}
/*
In native windows, the whole lifetime management of XMLDOMNodes is
@ -2797,11 +2822,30 @@ static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionP
}
static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface,
REFIID riid, IConnectionPoint **ppCP)
REFIID riid, IConnectionPoint **cp)
{
domdoc *This = impl_from_IConnectionPointContainer(iface);
FIXME("(%p)->(%s %p): stub\n", This, debugstr_guid(riid), ppCP);
return E_NOTIMPL;
ConnectionPoint *iter;
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), cp);
*cp = NULL;
for(iter = This->cp_list; iter; iter = iter->next)
{
if (IsEqualGUID(iter->iid, riid))
*cp = (IConnectionPoint*)&iter->lpVtblConnectionPoint;
}
if (*cp)
{
IConnectionPoint_AddRef(*cp);
return S_OK;
}
FIXME("unsupported riid %s\n", debugstr_guid(riid));
return CONNECT_E_NOCONNECTION;
}
static const struct IConnectionPointContainerVtbl ConnectionPointContainerVtbl =
@ -2813,6 +2857,107 @@ static const struct IConnectionPointContainerVtbl ConnectionPointContainerVtbl =
ConnectionPointContainer_FindConnectionPoint
};
/* IConnectionPoint */
static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface,
REFIID riid, void **ppv)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv );
*ppv = NULL;
if (IsEqualGUID(&IID_IUnknown, riid) ||
IsEqualGUID(&IID_IConnectionPoint, riid))
{
*ppv = iface;
}
if (*ppv)
{
IConnectionPoint_AddRef(iface);
return S_OK;
}
WARN("Unsupported interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
return IConnectionPointContainer_AddRef(This->container);
}
static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
return IConnectionPointContainer_Release(This->container);
}
static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *pIID)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
FIXME("(%p)->(%p): stub\n", This, pIID);
return E_NOTIMPL;
}
static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface,
IConnectionPointContainer **ppCPC)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
FIXME("(%p)->(%p): stub\n", This, ppCPC);
return E_NOTIMPL;
}
static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink,
DWORD *pdwCookie)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
FIXME("(%p)->(%p %p): stub\n", This, pUnkSink, pdwCookie);
return E_NOTIMPL;
}
static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD dwCookie)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
FIXME("(%p)->(%d): stub\n", This, dwCookie);
return E_NOTIMPL;
}
static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface,
IEnumConnections **ppEnum)
{
ConnectionPoint *This = impl_from_IConnectionPoint(iface);
FIXME("(%p)->(%p): stub\n", This, ppEnum);
return E_NOTIMPL;
}
static const IConnectionPointVtbl ConnectionPointVtbl =
{
ConnectionPoint_QueryInterface,
ConnectionPoint_AddRef,
ConnectionPoint_Release,
ConnectionPoint_GetConnectionInterface,
ConnectionPoint_GetConnectionPointContainer,
ConnectionPoint_Advise,
ConnectionPoint_Unadvise,
ConnectionPoint_EnumConnections
};
void ConnectionPoint_Init(ConnectionPoint *cp, struct domdoc *doc, REFIID riid)
{
cp->lpVtblConnectionPoint = &ConnectionPointVtbl;
cp->doc = doc;
cp->iid = riid;
cp->next = NULL;
cp->next = doc->cp_list;
doc->cp_list = cp;
cp->container = (IConnectionPointContainer*)&doc->lpVtblConnectionPointContainer;
}
/* xmldoc implementation of IObjectWithSite */
static HRESULT WINAPI
xmldoc_ObjectWithSite_QueryInterface( IObjectWithSite* iface, REFIID riid, void** ppvObject )
@ -2982,6 +3127,12 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **docu
doc->site = NULL;
doc->safeopt = 0;
doc->bsc = NULL;
doc->cp_list = NULL;
/* events connection points */
ConnectionPoint_Init(&doc->cp_dispatch, doc, &IID_IDispatch);
ConnectionPoint_Init(&doc->cp_propnotif, doc, &IID_IPropertyNotifySink);
ConnectionPoint_Init(&doc->cp_domdocevents, doc, &DIID_XMLDOMDocumentEvents);
init_xmlnode(&doc->node, (xmlNodePtr)xmldoc, (IXMLDOMNode*)&doc->lpVtbl, &domdoc_dispex);

View File

@ -7100,6 +7100,7 @@ static void test_selectSingleNode(void)
static void test_events(void)
{
IConnectionPointContainer *conn;
IConnectionPoint *point;
IXMLDOMDocument *doc;
HRESULT hr;
@ -7108,6 +7109,17 @@ static void test_events(void)
hr = IXMLDOMDocument_QueryInterface(doc, &IID_IConnectionPointContainer, (void**)&conn);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IConnectionPointContainer_FindConnectionPoint(conn, &IID_IDispatch, &point);
ok(hr == S_OK, "got 0x%08x\n", hr);
IConnectionPoint_Release(point);
hr = IConnectionPointContainer_FindConnectionPoint(conn, &IID_IPropertyNotifySink, &point);
ok(hr == S_OK, "got 0x%08x\n", hr);
IConnectionPoint_Release(point);
hr = IConnectionPointContainer_FindConnectionPoint(conn, &DIID_XMLDOMDocumentEvents, &point);
ok(hr == S_OK, "got 0x%08x\n", hr);
IConnectionPoint_Release(point);
IConnectionPointContainer_Release(conn);
IXMLDOMDocument_Release(doc);