Nikolay Sivov : msxml3: Add ISAXContentHandler stub for MXXMLWriter.

Alexandre Julliard julliard at winehq.org
Mon May 2 14:16:14 CDT 2011


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Apr 30 15:18:03 2011 +0400

msxml3: Add ISAXContentHandler stub for MXXMLWriter.

---

 dlls/msxml3/mxwriter.c        |  170 +++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/tests/saxreader.c |   42 ++++++++++
 2 files changed, 212 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c
index cb827b4..6cebf76 100644
--- a/dlls/msxml3/mxwriter.c
+++ b/dlls/msxml3/mxwriter.c
@@ -41,6 +41,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
 typedef struct _mxwriter
 {
     IMXWriter IMXWriter_iface;
+    ISAXContentHandler ISAXContentHandler_iface;
+
     LONG ref;
 } mxwriter;
 
@@ -49,6 +51,11 @@ static inline mxwriter *impl_from_IMXWriter(IMXWriter *iface)
     return CONTAINING_RECORD(iface, mxwriter, IMXWriter_iface);
 }
 
+static inline mxwriter *impl_from_ISAXContentHandler(ISAXContentHandler *iface)
+{
+    return CONTAINING_RECORD(iface, mxwriter, ISAXContentHandler_iface);
+}
+
 static HRESULT WINAPI mxwriter_QueryInterface(IMXWriter *iface, REFIID riid, void **obj)
 {
     mxwriter *This = impl_from_IMXWriter( iface );
@@ -61,6 +68,10 @@ static HRESULT WINAPI mxwriter_QueryInterface(IMXWriter *iface, REFIID riid, voi
     {
         *obj = &This->IMXWriter_iface;
     }
+    else if ( IsEqualGUID( riid, &IID_ISAXContentHandler ) )
+    {
+        *obj = &This->ISAXContentHandler_iface;
+    }
     else
     {
         ERR("interface %s not implemented\n", debugstr_guid(riid));
@@ -314,6 +325,164 @@ static const struct IMXWriterVtbl mxwriter_vtbl =
     mxwriter_flush
 };
 
+/*** ISAXContentHandler ***/
+static HRESULT WINAPI mxwriter_saxcontent_QueryInterface(
+    ISAXContentHandler *iface,
+    REFIID riid,
+    void **obj)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    return IMXWriter_QueryInterface(&This->IMXWriter_iface, riid, obj);
+}
+
+static ULONG WINAPI mxwriter_saxcontent_AddRef(ISAXContentHandler *iface)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    return IMXWriter_AddRef(&This->IMXWriter_iface);
+}
+
+static ULONG WINAPI mxwriter_saxcontent_Release(ISAXContentHandler *iface)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    return IMXWriter_Release(&This->IMXWriter_iface);
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_putDocumentLocator(
+    ISAXContentHandler *iface,
+    ISAXLocator *locator)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%p)\n", This, locator);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_startDocument(ISAXContentHandler *iface)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_endDocument(ISAXContentHandler *iface)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_startPrefixMapping(
+    ISAXContentHandler *iface,
+    const WCHAR *prefix,
+    int nprefix,
+    const WCHAR *uri,
+    int nuri)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s %s)\n", This, debugstr_wn(prefix, nprefix), debugstr_wn(uri, nuri));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_endPrefixMapping(
+    ISAXContentHandler *iface,
+    const WCHAR *prefix,
+    int nprefix)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s)\n", This, debugstr_wn(prefix, nprefix));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_startElement(
+    ISAXContentHandler *iface,
+    const WCHAR *namespaceUri,
+    int nnamespaceUri,
+    const WCHAR *local_name,
+    int nlocal_name,
+    const WCHAR *QName,
+    int nQName,
+    ISAXAttributes *attr)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s %s %s %p)\n", This, debugstr_wn(namespaceUri, nnamespaceUri),
+        debugstr_wn(local_name, nlocal_name), debugstr_wn(QName, nQName), attr);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_endElement(
+    ISAXContentHandler *iface,
+    const WCHAR *namespaceUri,
+    int nnamespaceUri,
+    const WCHAR * local_name,
+    int nlocal_name,
+    const WCHAR *QName,
+    int nQName)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s %s %s)\n", This, debugstr_wn(namespaceUri, nnamespaceUri),
+        debugstr_wn(local_name, nlocal_name), debugstr_wn(QName, nQName));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_characters(
+    ISAXContentHandler *iface,
+    const WCHAR *chars,
+    int nchars)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s)\n", This, debugstr_wn(chars, nchars));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_ignorableWhitespace(
+    ISAXContentHandler *iface,
+    const WCHAR *chars,
+    int nchars)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s)\n", This, debugstr_wn(chars, nchars));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_processingInstruction(
+    ISAXContentHandler *iface,
+    const WCHAR *target,
+    int ntarget,
+    const WCHAR *data,
+    int ndata)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s %s)\n", This, debugstr_wn(target, ntarget), debugstr_wn(data, ndata));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mxwriter_saxcontent_skippedEntity(
+    ISAXContentHandler *iface,
+    const WCHAR *name,
+    int nname)
+{
+    mxwriter *This = impl_from_ISAXContentHandler( iface );
+    FIXME("(%p)->(%s)\n", This, debugstr_wn(name, nname));
+    return E_NOTIMPL;
+}
+
+static const struct ISAXContentHandlerVtbl mxwriter_saxcontent_vtbl =
+{
+    mxwriter_saxcontent_QueryInterface,
+    mxwriter_saxcontent_AddRef,
+    mxwriter_saxcontent_Release,
+    mxwriter_saxcontent_putDocumentLocator,
+    mxwriter_saxcontent_startDocument,
+    mxwriter_saxcontent_endDocument,
+    mxwriter_saxcontent_startPrefixMapping,
+    mxwriter_saxcontent_endPrefixMapping,
+    mxwriter_saxcontent_startElement,
+    mxwriter_saxcontent_endElement,
+    mxwriter_saxcontent_characters,
+    mxwriter_saxcontent_ignorableWhitespace,
+    mxwriter_saxcontent_processingInstruction,
+    mxwriter_saxcontent_skippedEntity
+};
+
 HRESULT MXWriter_create(IUnknown *pUnkOuter, void **ppObj)
 {
     mxwriter *This;
@@ -327,6 +496,7 @@ HRESULT MXWriter_create(IUnknown *pUnkOuter, void **ppObj)
         return E_OUTOFMEMORY;
 
     This->IMXWriter_iface.lpVtbl = &mxwriter_vtbl;
+    This->ISAXContentHandler_iface.lpVtbl = &mxwriter_saxcontent_vtbl;
     This->ref = 1;
 
     *ppObj = &This->IMXWriter_iface;
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 6480f07..f6c35b8 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -29,6 +29,14 @@
 
 #include "wine/test.h"
 
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
+static void _expect_ref(IUnknown* obj, ULONG ref, int line)
+{
+    ULONG rc = IUnknown_AddRef(obj);
+    IUnknown_Release(obj);
+    ok_(__FILE__,line)(rc-1 == ref, "expected refcount %d, got %d\n", ref, rc-1);
+}
+
 typedef enum _CH {
     CH_ENDTEST,
     CH_PUTDOCUMENTLOCATOR,
@@ -653,6 +661,39 @@ static void test_encoding(void)
     }
 }
 
+static void test_mxwriter_contenthandler(void)
+{
+    ISAXContentHandler *handler;
+    IMXWriter *writer, *writer2;
+    HRESULT hr;
+
+    hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER,
+            &IID_IMXWriter, (void**)&writer);
+    if (hr != S_OK)
+    {
+        win_skip("MXXMLWriter not supported\n");
+        return;
+    }
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    EXPECT_REF(writer, 1);
+
+    hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void**)&handler);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    EXPECT_REF(writer, 2);
+    EXPECT_REF(handler, 2);
+
+    hr = ISAXContentHandler_QueryInterface(handler, &IID_IMXWriter, (void**)&writer2);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(writer2 == writer, "got %p, expected %p\n", writer2, writer);
+    EXPECT_REF(writer, 3);
+    EXPECT_REF(writer2, 3);
+    IMXWriter_Release(writer2);
+
+    ISAXContentHandler_Release(handler);
+    IMXWriter_Release(writer);
+}
+
 START_TEST(saxreader)
 {
     ISAXXMLReader *reader;
@@ -674,6 +715,7 @@ START_TEST(saxreader)
 
     test_saxreader();
     test_encoding();
+    test_mxwriter_contenthandler();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list