[PATCH] Added IObjectWithSite support

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Sat Apr 26 07:55:05 CDT 2008


---
 dlls/msxml3/domdoc.c |   91 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index a05247a..ed37de7 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -34,6 +34,7 @@
 #include "urlmon.h"
 #include "winreg.h"
 #include "shlwapi.h"
+#include "ocidl.h"
 
 #include "wine/debug.h"
 
@@ -169,6 +170,7 @@ typedef struct _domdoc
 {
     const struct IXMLDOMDocument2Vtbl *lpVtbl;
     const struct IPersistStreamVtbl   *lpvtblIPersistStream;
+    const struct IObjectWithSiteVtbl  *lpvtblIObjectWithSite;
     LONG ref;
     VARIANT_BOOL async;
     VARIANT_BOOL validating;
@@ -182,6 +184,9 @@ typedef struct _domdoc
 
      /* IPersistStream */
      IStream *stream;
+     
+     /* IObjectWithSite*/
+     IUnknown *site;
 } domdoc;
 
 LONG xmldoc_add_ref(xmlDocPtr doc)
@@ -219,6 +224,11 @@ static inline domdoc *impl_from_IPersistStream(IPersistStream *iface)
     return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpvtblIPersistStream));
 }
 
+static inline domdoc *impl_from_IObjectWithSite(IObjectWithSite *iface)
+{
+    return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpvtblIObjectWithSite));
+}
+
 /************************************************************************
  * xmldoc implementation of IPersistStream.
  */
@@ -368,6 +378,10 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
     {
         *ppvObject = (IPersistStream*)&(This->lpvtblIPersistStream);
     }
+    else if (IsEqualGUID(&IID_IObjectWithSite, riid))
+    {
+        *ppvObject = (IObjectWithSite*)&(This->lpvtblIObjectWithSite);
+    }
     else if(IsEqualGUID(&IID_IRunnableObject, riid))
     {
         TRACE("IID_IRunnableObject not supported returning NULL\n");
@@ -405,6 +419,8 @@ static ULONG WINAPI domdoc_Release(
     ref = InterlockedDecrement( &This->ref );
     if ( ref == 0 )
     {
+        if (This->site)
+            IUnknown_Release( This->site );
         IUnknown_Release( This->node_unk );
         if(This->schema) IXMLDOMSchemaCollection_Release( This->schema );
         if (This->stream) IStream_Release(This->stream);
@@ -1930,6 +1946,79 @@ static const struct IXMLDOMDocument2Vtbl domdoc_vtbl =
     domdoc_getProperty
 };
 
+/* xmldoc implementation of IObjectWithSite */
+static HRESULT WINAPI
+xmldoc_ObjectWithSite_QueryInterface( IObjectWithSite* iface, REFIID riid, void** ppvObject )
+{
+    domdoc *This = impl_from_IObjectWithSite(iface);
+    return IXMLDocument_QueryInterface( (IXMLDocument *)This, riid, ppvObject );
+}
+
+static ULONG WINAPI
+xmldoc_ObjectWithSite_AddRef( IObjectWithSite* iface )
+{
+    domdoc *This = impl_from_IObjectWithSite(iface);
+    return IXMLDocument_AddRef((IXMLDocument *)This);
+}
+
+static ULONG WINAPI
+xmldoc_ObjectWithSite_Release( IObjectWithSite* iface )
+{
+    domdoc *This = impl_from_IObjectWithSite(iface);
+    return IXMLDocument_Release((IXMLDocument *)This);
+}
+
+static HRESULT WINAPI
+xmldoc_GetSite( IObjectWithSite *iface, REFIID iid, void ** ppvSite )
+{
+    domdoc *This = impl_from_IObjectWithSite(iface);
+
+    TRACE("%p %s %p\n", This, debugstr_guid( iid ), ppvSite );
+
+    if ( !This->site )
+        return E_FAIL;
+    
+    return IUnknown_QueryInterface( This->site, iid, ppvSite );
+}
+
+static HRESULT WINAPI
+xmldoc_SetSite( IObjectWithSite *iface, IUnknown *punk )
+{
+    domdoc *This = impl_from_IObjectWithSite(iface);
+
+    TRACE("%p %p\n", iface, punk);
+    
+    if(!punk)
+    {
+        if(This->site)
+        {
+            IUnknown_Release( This->site );
+            This->site = NULL;
+        }
+        
+        return S_OK;
+    }    
+          
+    if ( punk )
+        IUnknown_AddRef( punk );
+        
+    if(This->site)
+        IUnknown_Release( This->site );  
+
+    This->site = punk;
+
+    return S_OK;
+}
+
+static const IObjectWithSiteVtbl domdocObjectSite =
+{
+    xmldoc_ObjectWithSite_QueryInterface,
+    xmldoc_ObjectWithSite_AddRef,
+    xmldoc_ObjectWithSite_Release,
+    xmldoc_SetSite,
+    xmldoc_GetSite,
+};
+
 HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
 {
     domdoc *doc;
@@ -1944,6 +2033,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
 
     doc->lpVtbl = &domdoc_vtbl;
     doc->lpvtblIPersistStream = &xmldoc_IPersistStream_VTable;
+    doc->lpvtblIObjectWithSite = &domdocObjectSite;
     doc->ref = 1;
     doc->async = 0;
     doc->validating = 0;
@@ -1953,6 +2043,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
     doc->error = S_OK;
     doc->schema = NULL;
     doc->stream = NULL;
+    doc->site = NULL;
 
     xmldoc = xmlNewDoc(NULL);
     if(!xmldoc)
-- 
1.5.4.1


--------------030209000500070000060003--




More information about the wine-patches mailing list