[PATCH 3/4] Implement a trivial case of ::put_nodeTypedValue()
Nikolay Sivov
nsivov at codeweavers.com
Sat Oct 16 10:49:27 CDT 2010
---
dlls/msxml3/attribute.c | 4 ++--
dlls/msxml3/cdata.c | 4 ++--
dlls/msxml3/comment.c | 4 ++--
dlls/msxml3/docfrag.c | 4 ++--
dlls/msxml3/domdoc.c | 4 ++--
dlls/msxml3/element.c | 4 ++--
dlls/msxml3/entityref.c | 4 ++--
dlls/msxml3/msxml_private.h | 1 +
dlls/msxml3/node.c | 34 ++++++++++++++++++++++++++++++++--
dlls/msxml3/pi.c | 4 ++--
dlls/msxml3/tests/domdoc.c | 43 +++++++++++++++++++++++++++++++++++++++++++
dlls/msxml3/text.c | 4 ++--
12 files changed, 94 insertions(+), 20 deletions(-)
diff --git a/dlls/msxml3/attribute.c b/dlls/msxml3/attribute.c
index da3f78d..ec761e5 100644
--- a/dlls/msxml3/attribute.c
+++ b/dlls/msxml3/attribute.c
@@ -414,10 +414,10 @@ static HRESULT WINAPI domattr_get_nodeTypedValue(
static HRESULT WINAPI domattr_put_nodeTypedValue(
IXMLDOMAttribute *iface,
- VARIANT var1)
+ VARIANT value)
{
domattr *This = impl_from_IXMLDOMAttribute( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI domattr_get_dataType(
diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c
index 193fc8a..fdb3b45 100644
--- a/dlls/msxml3/cdata.c
+++ b/dlls/msxml3/cdata.c
@@ -425,10 +425,10 @@ static HRESULT WINAPI domcdata_get_nodeTypedValue(
static HRESULT WINAPI domcdata_put_nodeTypedValue(
IXMLDOMCDATASection *iface,
- VARIANT var1)
+ VARIANT value)
{
domcdata *This = impl_from_IXMLDOMCDATASection( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI domcdata_get_dataType(
diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c
index 2d669bc..e98eb66 100644
--- a/dlls/msxml3/comment.c
+++ b/dlls/msxml3/comment.c
@@ -418,10 +418,10 @@ static HRESULT WINAPI domcomment_get_nodeTypedValue(
static HRESULT WINAPI domcomment_put_nodeTypedValue(
IXMLDOMComment *iface,
- VARIANT var1)
+ VARIANT value)
{
domcomment *This = impl_from_IXMLDOMComment( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI domcomment_get_dataType(
diff --git a/dlls/msxml3/docfrag.c b/dlls/msxml3/docfrag.c
index e91486e..c8ccb02 100644
--- a/dlls/msxml3/docfrag.c
+++ b/dlls/msxml3/docfrag.c
@@ -422,10 +422,10 @@ static HRESULT WINAPI domfrag_get_nodeTypedValue(
static HRESULT WINAPI domfrag_put_nodeTypedValue(
IXMLDOMDocumentFragment *iface,
- VARIANT var1)
+ VARIANT value)
{
domfrag *This = impl_from_IXMLDOMDocumentFragment( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI domfrag_get_dataType(
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 0329fac..77cd8a4 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1140,10 +1140,10 @@ static HRESULT WINAPI domdoc_get_nodeTypedValue(
static HRESULT WINAPI domdoc_put_nodeTypedValue(
IXMLDOMDocument3 *iface,
- VARIANT typedValue )
+ VARIANT value )
{
domdoc *This = impl_from_IXMLDOMDocument3( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), typedValue );
+ return node_put_typedvalue( &This->node, value );
}
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index ed4e273..c4fd389 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -430,10 +430,10 @@ static HRESULT WINAPI domelem_get_nodeTypedValue(
static HRESULT WINAPI domelem_put_nodeTypedValue(
IXMLDOMElement *iface,
- VARIANT var1)
+ VARIANT value)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI domelem_get_dataType(
diff --git a/dlls/msxml3/entityref.c b/dlls/msxml3/entityref.c
index 0b23363..2ad37ea 100644
--- a/dlls/msxml3/entityref.c
+++ b/dlls/msxml3/entityref.c
@@ -416,10 +416,10 @@ static HRESULT WINAPI entityref_get_nodeTypedValue(
static HRESULT WINAPI entityref_put_nodeTypedValue(
IXMLDOMEntityReference *iface,
- VARIANT var1)
+ VARIANT value)
{
entityref *This = impl_from_IXMLDOMEntityReference( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI entityref_get_dataType(
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 10e8376..8e331fd 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -172,6 +172,7 @@ extern HRESULT node_insert_before(xmlnode*,IXMLDOMNode*,const VARIANT*,IXMLDOMNo
extern HRESULT node_replace_child(xmlnode*,IXMLDOMNode*,IXMLDOMNode*,IXMLDOMNode**);
extern HRESULT node_get_datatype(xmlnode*,VARIANT*);
extern HRESULT node_put_text(xmlnode*,BSTR);
+extern HRESULT node_put_typedvalue(xmlnode*,VARIANT);
extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document);
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 375b9ef..76f84e6 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -1008,11 +1008,41 @@ static HRESULT WINAPI xmlnode_put_nodeTypedValue(
IXMLDOMNode *iface,
VARIANT typedValue)
{
- xmlnode *This = impl_from_IXMLDOMNode( iface );
- FIXME("%p\n", This);
+ ERR("Should not be called\n");
return E_NOTIMPL;
}
+HRESULT node_put_typedvalue(xmlnode *This, VARIANT value)
+{
+ VARIANT type;
+ HRESULT hr;
+
+ TRACE("(%p)", This);
+
+ /* for untyped nodes coerce to BSTR and set */
+ if (node_get_datatype(This, &type) == S_FALSE)
+ {
+ if (V_VT(&value) != VT_BSTR)
+ {
+ hr = VariantChangeType(&value, &value, 0, VT_BSTR);
+ if (hr == S_OK)
+ {
+ hr = node_put_text(This, V_BSTR(&value));
+ VariantClear(&value);
+ }
+ }
+ else
+ hr = node_put_text(This, V_BSTR(&value));
+ }
+ else
+ {
+ FIXME("not implemented for typed nodes\n");
+ return E_NOTIMPL;
+ }
+
+ return hr;
+}
+
HRESULT node_get_datatype(xmlnode *This, VARIANT *typename)
{
TRACE("(%p)->(%p)\n", This, typename);
diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c
index 671370b..fc0c0e6 100644
--- a/dlls/msxml3/pi.c
+++ b/dlls/msxml3/pi.c
@@ -432,10 +432,10 @@ static HRESULT WINAPI dom_pi_get_nodeTypedValue(
static HRESULT WINAPI dom_pi_put_nodeTypedValue(
IXMLDOMProcessingInstruction *iface,
- VARIANT var1)
+ VARIANT value)
{
dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI dom_pi_get_dataType(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index fd56c61..a4db4d9 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -7088,6 +7088,48 @@ static void test_selectSingleNode(void)
free_bstrs();
}
+static void test_put_nodeTypedValue(void)
+{
+ IXMLDOMDocument *doc;
+ IXMLDOMElement *elem;
+ VARIANT type;
+ HRESULT hr;
+
+ doc = create_document(&IID_IXMLDOMDocument);
+ if (!doc) return;
+
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Element"), &elem);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ V_VT(&type) = VT_EMPTY;
+ hr = IXMLDOMElement_get_dataType(elem, &type);
+ ok(hr == S_FALSE, "got 0x%08x\n", hr);
+ ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
+
+ /* set typed value for untyped node */
+ V_VT(&type) = VT_I1;
+ V_I1(&type) = 1;
+ hr = IXMLDOMElement_put_nodeTypedValue(elem, type);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ V_VT(&type) = VT_EMPTY;
+ hr = IXMLDOMElement_get_dataType(elem, &type);
+ ok(hr == S_FALSE, "got 0x%08x\n", hr);
+ ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
+
+ /* no type info stored */
+ V_VT(&type) = VT_EMPTY;
+ hr = IXMLDOMElement_get_nodeTypedValue(elem, &type);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(V_VT(&type) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&type));
+ ok(memcmp(V_BSTR(&type), _bstr_("1"), 2*sizeof(WCHAR)) == 0,
+ "got %s, expected \"1\"\n", wine_dbgstr_w(V_BSTR(&type)));
+ VariantClear(&type);
+
+ IXMLDOMDocument_Release(doc);
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
@@ -7148,6 +7190,7 @@ START_TEST(domdoc)
test_get_prefix();
test_default_properties();
test_selectSingleNode();
+ test_put_nodeTypedValue();
CoUninitialize();
}
diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c
index 5929172..78c2696 100644
--- a/dlls/msxml3/text.c
+++ b/dlls/msxml3/text.c
@@ -431,10 +431,10 @@ static HRESULT WINAPI domtext_get_nodeTypedValue(
static HRESULT WINAPI domtext_put_nodeTypedValue(
IXMLDOMText *iface,
- VARIANT var1)
+ VARIANT value)
{
domtext *This = impl_from_IXMLDOMText( iface );
- return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 );
+ return node_put_typedvalue( &This->node, value );
}
static HRESULT WINAPI domtext_get_dataType(
--
1.5.6.5
--------------040803070800080101070809--
More information about the wine-patches
mailing list