Nikolay Sivov : msxml3: Implemented get_doctype() with basic tests.

Alexandre Julliard julliard at winehq.org
Mon Mar 7 12:22:46 CST 2011


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Mar  7 00:53:54 2011 +0300

msxml3: Implemented get_doctype() with basic tests.

---

 dlls/msxml3/domdoc.c       |   24 +++++++++++++++++++++---
 dlls/msxml3/tests/domdoc.c |   39 +++++++++++++++++++++++++++++++++++----
 2 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index c9d1c48..beec0b4 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1517,11 +1517,29 @@ static HRESULT WINAPI domdoc_transformNodeToObject(
 
 static HRESULT WINAPI domdoc_get_doctype(
     IXMLDOMDocument3 *iface,
-    IXMLDOMDocumentType** documentType )
+    IXMLDOMDocumentType** doctype )
 {
     domdoc *This = impl_from_IXMLDOMDocument3(iface);
-    FIXME("(%p)\n", This);
-    return E_NOTIMPL;
+    IXMLDOMNode *node;
+    xmlDtdPtr dtd;
+    HRESULT hr;
+
+    TRACE("(%p)->(%p)\n", This, doctype);
+
+    if (!doctype) return E_INVALIDARG;
+
+    *doctype = NULL;
+
+    dtd = xmlGetIntSubset(get_doc(This));
+    if (!dtd) return S_FALSE;
+
+    node = create_node((xmlNodePtr)dtd);
+    if (!node) return S_FALSE;
+
+    hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMDocumentType, (void**)doctype);
+    IXMLDOMNode_Release(node);
+
+    return hr;
 }
 
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 210c709..be9a430 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -6009,9 +6009,9 @@ static const nodetypedvalue_t get_nodetypedvalue[] = {
 static void test_nodeTypedValue(void)
 {
     const nodetypedvalue_t *entry = get_nodetypedvalue;
+    IXMLDOMDocumentType *doctype, *doctype2;
     IXMLDOMProcessingInstruction *pi;
     IXMLDOMDocumentFragment *frag;
-    IXMLDOMDocumentType *doctype;
     IXMLDOMDocument *doc, *doc2;
     IXMLDOMCDATASection *cdata;
     IXMLDOMComment *comment;
@@ -6142,17 +6142,28 @@ static void test_nodeTypedValue(void)
     ok(hr == S_OK, "ret %08x\n", hr );
     ok(b == VARIANT_TRUE, "got %d\n", b);
 
+    EXPECT_REF(doc2, 1);
+
     hr = IXMLDOMDocument_get_doctype(doc2, &doctype);
-    todo_wine ok(hr == S_OK, "ret %08x\n", hr );
-    if (hr == S_OK)
+    ok(hr == S_OK, "ret %08x\n", hr );
+
+    EXPECT_REF(doc2, 1);
+    todo_wine EXPECT_REF(doctype, 2);
+
     {
         V_VT(&value) = VT_EMPTY;
         hr = IXMLDOMDocumentType_get_nodeTypedValue(doctype, &value);
         ok(hr == S_FALSE, "ret %08x\n", hr );
         ok(V_VT(&value) == VT_NULL, "got %d\n", V_VT(&value));
-        IXMLDOMDocumentType_Release(doctype);
     }
 
+    hr = IXMLDOMDocument_get_doctype(doc2, &doctype2);
+    ok(hr == S_OK, "ret %08x\n", hr );
+    ok(doctype != doctype2, "got %p, was %p\n", doctype2, doctype);
+
+    IXMLDOMDocumentType_Release(doctype2);
+    IXMLDOMDocumentType_Release(doctype);
+
     IXMLDOMDocument_Release(doc2);
 
     while (entry->name)
@@ -8383,6 +8394,25 @@ static void test_appendChild(void)
     IXMLDOMDocument_Release(doc2);
 }
 
+static void test_get_doctype(void)
+{
+    IXMLDOMDocumentType *doctype;
+    IXMLDOMDocument *doc;
+    HRESULT hr;
+
+    doc = create_document(&IID_IXMLDOMDocument);
+
+    hr = IXMLDOMDocument_get_doctype(doc, NULL);
+    ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+    doctype = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_get_doctype(doc, &doctype);
+    ok(hr == S_FALSE, "got 0x%08x\n", hr);
+    ok(doctype == NULL, "got %p\n", doctype);
+
+    IXMLDOMDocument_Release(doc);
+}
+
 START_TEST(domdoc)
 {
     IXMLDOMDocument *doc;
@@ -8449,6 +8479,7 @@ START_TEST(domdoc)
     test_get_xml();
     test_insertBefore();
     test_appendChild();
+    test_get_doctype();
     test_xsltemplate();
 
     CoUninitialize();




More information about the wine-cvs mailing list