From e989d48f43a43a2ff6ffdb911ed24d196eef932d Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Mon, 14 Jan 2008 12:44:56 +1100 Subject: [PATCH] msxml3: Implement get_dataType. --- dlls/msxml3/node.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- dlls/msxml3/tests/domdoc.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 2a93ab8d816..c0d90768f91 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -736,8 +736,48 @@ static HRESULT WINAPI xmlnode_get_dataType( IXMLDOMNode *iface, VARIANT* dataTypeName) { - FIXME("\n"); - return E_NOTIMPL; + xmlnode *This = impl_from_IXMLDOMNode( iface ); + xmlChar *pVal; + + TRACE("iface %p\n", iface); + + if(!dataTypeName) + return E_INVALIDARG; + + /* CDATA Section, Comment, Document, Document Fragment, + Entity, Notation, PI, and Text Node are non-typed. */ + V_BSTR(dataTypeName) = NULL; + V_VT(dataTypeName) = VT_NULL; + + switch ( This->node->type ) + { + case XML_ATTRIBUTE_NODE: + FIXME("NODE_ATTRIBUTE_NODE should return a valid value.\n"); + break; + case XML_ELEMENT_NODE: + pVal = xmlGetNsProp(This->node, (xmlChar*)"dt", + (xmlChar*)"urn:schemas-microsoft-com:datatypes"); + if (pVal) + { + V_VT(dataTypeName) = VT_BSTR; + V_BSTR(dataTypeName) = bstr_from_xmlChar( pVal ); + xmlFree(pVal); + } + break; + case XML_ENTITY_REF_NODE: + FIXME("XML_ENTITY_REF_NODE should return a valid value.\n"); + break; + default: + TRACE("Type %d returning NULL\n", This->node->type); + } + + /* non-typed nodes return S_FALSE */ + if(V_VT(dataTypeName) == VT_NULL) + { + return S_FALSE; + } + + return S_OK; } static HRESULT WINAPI xmlnode_put_dataType( diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 19a3dc1acfd..5535bed1eb5 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -531,6 +531,13 @@ static void test_domdoc( void ) r = IXMLDOMText_get_attributes( nodetext, &pAttribs); ok(r == S_FALSE, "ret %08x\n", r ); ok( pAttribs == NULL, "pAttribs not NULL\n"); + + /* test get_dataType */ + r = IXMLDOMText_get_dataType(nodetext, &var); + ok(r == S_FALSE, "ret %08x\n", r ); + ok( V_VT(&var) == VT_NULL, "incorrect dataType type\n"); + VariantClear(&var); + IXMLDOMText_Release( nodetext ); } SysFreeString( str ); @@ -582,6 +589,12 @@ static void test_domdoc( void ) r = IXMLDOMProcessingInstruction_get_lastChild(nodePI, &nodeChild); ok(r == S_FALSE, "ret %08x\n", r ); ok(nodeChild == NULL, "nodeChild not NULL\n"); + + r = IXMLDOMProcessingInstruction_get_dataType(nodePI, &var); + ok(r == S_FALSE, "ret %08x\n", r ); + ok( V_VT(&var) == VT_NULL, "incorrect dataType type\n"); + VariantClear(&var); + IXMLDOMProcessingInstruction_Release(nodePI); } @@ -1828,6 +1841,7 @@ static void test_xmlTypes(void) IXMLDOMNamedNodeMap *pAttribs; BSTR str; IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1; /* Used for testing Siblings */ + VARIANT v; hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); if( hr != S_OK ) @@ -1858,6 +1872,12 @@ static void test_xmlTypes(void) ok(hr == S_FALSE, "ret %08x\n", hr ); ok( pAttribs == NULL, "pAttribs not NULL\n"); + /* test get_dataType */ + hr = IXMLDOMDocument_get_dataType(doc, &v); + ok(hr == S_FALSE, "ret %08x\n", hr ); + ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n"); + VariantClear(&v); + hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot); ok(hr == S_OK, "ret %08x\n", hr ); if(hr == S_OK) @@ -1893,6 +1913,11 @@ static void test_xmlTypes(void) ok( !lstrcmpW( str, szCommentXML ), "incorrect comment xml\n"); SysFreeString(str); + hr = IXMLDOMComment_get_dataType(pComment, &v); + ok(hr == S_FALSE, "ret %08x\n", hr ); + ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n"); + VariantClear(&v); + IXMLDOMComment_Release(pComment); } @@ -1914,6 +1939,11 @@ static void test_xmlTypes(void) ok( !lstrcmpW( str, szElementXML ), "incorrect element xml\n"); SysFreeString(str); + hr = IXMLDOMElement_get_dataType(pElement, &v); + ok(hr == S_FALSE, "ret %08x\n", hr ); + ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n"); + VariantClear(&v); + /* Attribute */ hr = IXMLDOMDocument_createAttribute(doc, szAttribute, &pAttrubute); ok(hr == S_OK, "ret %08x\n", hr ); @@ -1971,6 +2001,11 @@ static void test_xmlTypes(void) ok( !lstrcmpW( str, szAttributeXML ), "incorrect attribute xml\n"); SysFreeString(str); + hr = IXMLDOMAttribute_get_dataType(pAttrubute, &v); + ok(hr == S_FALSE, "ret %08x\n", hr ); + ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n"); + VariantClear(&v); + IXMLDOMAttribute_Release(pAttrubute); /* Check Element again with the Add Attribute*/ -- 2.11.4.GIT