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

Alexandre Julliard julliard at winehq.org
Mon Oct 25 10:58:23 CDT 2010


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Oct 23 17:22:35 2010 +0400

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

---

 dlls/msxml3/domdoc.c       |  161 ++++++++++++++++++++++++++++++++++++++++++--
 dlls/msxml3/tests/domdoc.c |   12 +++
 2 files changed, 168 insertions(+), 5 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index be56ecd..fc939a5 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -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);
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index b7db1bf..8821b25 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -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);




More information about the wine-cvs mailing list