[PATCH] Add ISupportErrorInfo interface to IXMLDOMDocument

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Fri Dec 19 02:48:58 CST 2008


---
 dlls/msxml3/domdoc.c       |   50 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/tests/domdoc.c |   10 ++++++++
 2 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index f71b134..a24f16f 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -57,6 +57,7 @@ typedef struct _domdoc
     const struct IPersistStreamVtbl   *lpvtblIPersistStream;
     const struct IObjectWithSiteVtbl  *lpvtblIObjectWithSite;
     const struct IObjectSafetyVtbl    *lpvtblIObjectSafety;
+    const struct ISupportErrorInfoVtbl *lpvtblISupportErrorInfo;
     LONG ref;
     VARIANT_BOOL async;
     VARIANT_BOOL validating;
@@ -248,6 +249,10 @@ static inline domdoc *impl_from_IObjectSafety(IObjectSafety *iface)
     return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpvtblIObjectSafety));
 }
 
+static inline domdoc *impl_from_ISupportErrorInfo(ISupportErrorInfo *iface)
+{
+    return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpvtblISupportErrorInfo));
+}
 
 /************************************************************************
  * xmldoc implementation of IPersistStream.
@@ -375,6 +380,46 @@ static const IPersistStreamVtbl xmldoc_IPersistStream_VTable =
     xmldoc_IPersistStream_GetSizeMax,
 };
 
+/* ISupportErrorInfo interface */
+static HRESULT WINAPI support_error_QueryInterface(
+    ISupportErrorInfo *iface,
+    REFIID riid, void** ppvObj )
+{
+    domdoc *This = impl_from_ISupportErrorInfo(iface);
+    return IXMLDocument_QueryInterface((IXMLDocument *)This, riid, ppvObj);
+}
+
+static ULONG WINAPI support_error_AddRef(
+    ISupportErrorInfo *iface )
+{
+    domdoc *This = impl_from_ISupportErrorInfo(iface);
+    return IXMLDocument_AddRef((IXMLDocument *)This);
+}
+
+static ULONG WINAPI support_error_Release(
+    ISupportErrorInfo *iface )
+{
+    domdoc *This = impl_from_ISupportErrorInfo(iface);
+    return IXMLDocument_Release((IXMLDocument *)This);
+}
+
+static HRESULT WINAPI support_error_InterfaceSupportsErrorInfo(
+    ISupportErrorInfo *iface,
+    REFIID riid )
+{
+    FIXME("(%p)->(%s)\n", iface, debugstr_guid(riid));
+    return S_FALSE;
+}
+
+static const struct ISupportErrorInfoVtbl support_error_vtbl =
+{
+    support_error_QueryInterface,
+    support_error_AddRef,
+    support_error_Release,
+    support_error_InterfaceSupportsErrorInfo
+};
+
+/* IXMLDOMDocument2 interface */
 static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID riid, void** ppvObject )
 {
     domdoc *This = impl_from_IXMLDOMDocument2( iface );
@@ -402,6 +447,10 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
     {
         *ppvObject = (IObjectWithSite*)&(This->lpvtblIObjectWithSite);
     }
+    else if( IsEqualGUID( riid, &IID_ISupportErrorInfo ))
+    {
+        *ppvObject = &This->lpvtblISupportErrorInfo;
+    }
     else if(dispex_query_interface(&This->dispex, riid, ppvObject))
     {
         return *ppvObject ? S_OK : E_NOINTERFACE;
@@ -2138,6 +2187,7 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **docu
     doc->lpvtblIPersistStream = &xmldoc_IPersistStream_VTable;
     doc->lpvtblIObjectWithSite = &domdocObjectSite;
     doc->lpvtblIObjectSafety = &domdocObjectSafetyVtbl;
+    doc->lpvtblISupportErrorInfo = &support_error_vtbl;
     doc->ref = 1;
     doc->async = 0;
     doc->validating = 0;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 73ba932..0c8c147 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -400,6 +400,7 @@ static void test_domdoc( void )
     IXMLDOMAttribute *node_attr = NULL;
     IXMLDOMNode *nodeChild = NULL;
     IXMLDOMProcessingInstruction *nodePI = NULL;
+    ISupportErrorInfo *support_error = NULL;
     VARIANT_BOOL b;
     VARIANT var;
     BSTR str;
@@ -862,6 +863,15 @@ static void test_domdoc( void )
         IXMLDOMProcessingInstruction_Release(nodePI);
     }
 
+    r = IXMLDOMDocument_QueryInterface( doc, &IID_ISupportErrorInfo, (LPVOID*)&support_error );
+    ok( r == S_OK, "ret %08x\n", r );
+    if(r == S_OK)
+    {
+        r = ISupportErrorInfo_InterfaceSupportsErrorInfo( support_error, &IID_IXMLDOMDocument );
+        todo_wine ok( r == S_OK, "ret %08x\n", r );
+        ISupportErrorInfo_Release( support_error );
+    }
+
     r = IXMLDOMDocument_Release( doc );
     ok( r == 0, "document ref count incorrect\n");
 
-- 
1.5.4.3


--------------000608090001040604070001--



More information about the wine-patches mailing list