[PATCH] Implement put_dataType
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Tue Feb 19 23:03:41 CST 2008
---
dlls/msxml3/node.c | 97 ++++++++++++-
dlls/msxml3/tests/domdoc.c | 355 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 450 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index 9d43c09..699e5dc 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -39,6 +39,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
#ifdef HAVE_LIBXML2
+static const WCHAR szBinBase64[] = {'b','i','n','.','b','a','s','e','6','4',0};
+static const WCHAR szString[] = {'s','t','r','i','n','g',0};
+static const WCHAR szNumber[] = {'n','u','m','b','e','r',0};
+static const WCHAR szInt[] = {'I','n','t',0};
+static const WCHAR szFixed[] = {'F','i','x','e','d','.','1','4','.','4',0};
+static const WCHAR szBoolean[] = {'B','o','o','l','e','a','n',0};
+static const WCHAR szDateTime[] = {'d','a','t','e','T','i','m','e',0};
+static const WCHAR szDateTimeTZ[] = {'d','a','t','e','T','i','m','e','.','t','z',0};
+static const WCHAR szDate[] = {'D','a','t','e',0};
+static const WCHAR szTime[] = {'T','i','m','e',0};
+static const WCHAR szTimeTZ[] = {'T','i','m','e','.','t','z',0};
+static const WCHAR szI1[] = {'i','1',0};
+static const WCHAR szByte[] = {'B','y','t','e',0};
+static const WCHAR szI2[] = {'i','2',0};
+static const WCHAR szI4[] = {'i','4',0};
+static const WCHAR szIU1[] = {'u','i','1',0};
+static const WCHAR szIU2[] = {'u','i','2',0};
+static const WCHAR szIU4[] = {'u','i','4',0};
+static const WCHAR szR4[] = {'r','4',0};
+static const WCHAR szR8[] = {'r','8',0};
+static const WCHAR szFloat[] = {'f','l','o','a','t',0};
+static const WCHAR szUUID[] = {'u','u','i','d',0};
+static const WCHAR szBinHex[] = {'b','i','n','.','h','e','x',0};
+
static inline xmlnode *impl_from_InternalUnknown( IUnknown *iface )
{
return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpInternalUnkVtbl));
@@ -859,8 +883,77 @@ static HRESULT WINAPI xmlnode_put_dataType(
IXMLDOMNode *iface,
BSTR dataTypeName)
{
- FIXME("\n");
- return E_NOTIMPL;
+ xmlnode *This = impl_from_IXMLDOMNode( iface );
+ HRESULT hr = E_FAIL;
+
+ TRACE("iface %p\n", iface);
+
+ if(dataTypeName == NULL)
+ return E_INVALIDARG;
+
+ /* An example of this is. The Text in the node needs to be a 0 or 1 for a boolean type.
+ This applies to changing types (string->bool) or setting a new one
+ */
+ FIXME("Need to Validate the data before allowing a type to be set.\n");
+
+ /* Check all supported types. */
+ if(lstrcmpiW(dataTypeName,szString) == 0 ||
+ lstrcmpiW(dataTypeName,szNumber) == 0 ||
+ lstrcmpiW(dataTypeName,szUUID) == 0 ||
+ lstrcmpiW(dataTypeName,szInt) == 0 ||
+ lstrcmpiW(dataTypeName,szI4) == 0 ||
+ lstrcmpiW(dataTypeName,szFixed) == 0 ||
+ lstrcmpiW(dataTypeName,szBoolean) == 0 ||
+ lstrcmpiW(dataTypeName,szDateTime) == 0 ||
+ lstrcmpiW(dataTypeName,szDateTimeTZ) == 0 ||
+ lstrcmpiW(dataTypeName,szDate) == 0 ||
+ lstrcmpiW(dataTypeName,szTime) == 0 ||
+ lstrcmpiW(dataTypeName,szTimeTZ) == 0 ||
+ lstrcmpiW(dataTypeName,szI1) == 0 ||
+ lstrcmpiW(dataTypeName,szByte) == 0 ||
+ lstrcmpiW(dataTypeName,szI2) == 0 ||
+ lstrcmpiW(dataTypeName,szIU1) == 0 ||
+ lstrcmpiW(dataTypeName,szIU2) == 0 ||
+ lstrcmpiW(dataTypeName,szIU4) == 0 ||
+ lstrcmpiW(dataTypeName,szR4) == 0 ||
+ lstrcmpiW(dataTypeName,szR8) == 0 ||
+ lstrcmpiW(dataTypeName,szFloat) == 0 ||
+ lstrcmpiW(dataTypeName,szBinHex) == 0 ||
+ lstrcmpiW(dataTypeName,szBinBase64) == 0)
+ {
+ xmlNsPtr pNS = NULL;
+ xmlAttrPtr pAttr = NULL;
+ xmlChar* str = xmlChar_from_wchar((WCHAR*)dataTypeName);
+
+ pAttr = xmlHasNsProp(This->node, (xmlChar*)"dt",
+ (xmlChar*)"urn:schemas-microsoft-com:datatypes");
+ if (pAttr)
+ {
+ pAttr = xmlSetNsProp(This->node, pAttr->ns, (xmlChar*)"dt", str);
+
+ hr = S_OK;
+ }
+ else
+ {
+ pNS = xmlNewNs(This->node, (xmlChar*)"urn:schemas-microsoft-com:datatypes", (xmlChar*)"dt");
+ if(pNS)
+ {
+ pAttr = xmlNewNsProp(This->node, pNS, (xmlChar*)"dt", str);
+ if(pAttr)
+ {
+ xmlAddChild(This->node, (xmlNodePtr)pAttr);
+
+ hr = S_OK;
+ }
+ else
+ ERR("Failed to create Attribute\n");
+ }
+ else
+ ERR("Failed to Create Namepsace\n");
+ }
+ }
+
+ return hr;
}
static HRESULT WINAPI xmlnode_get_xml(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index ef1b3d9..7acbe82 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -2347,6 +2347,360 @@ static void test_xmlTypes(void)
free_bstrs();
}
+void test_nodeTypeTests( void )
+{
+ IXMLDOMDocument *doc = NULL;
+ IXMLDOMElement *pRoot;
+ IXMLDOMElement *pElement;
+ HRESULT hr;
+
+ hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
+ if( hr != S_OK )
+ return;
+
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)pRoot, NULL);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ hr = IXMLDOMElement_put_dataType(pRoot, NULL);
+ ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+ /* Invalid Value */
+ hr = IXMLDOMElement_put_dataType(pRoot, _bstr_("abcdefg") );
+ ok(hr == E_FAIL, "ret %08x\n", hr );
+
+ /* NOTE:
+ * The name passed into put_dataType is case-insensitive. So many of the names
+ * have been changed to reflect this.
+ */
+ /* Boolean */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Boolean"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("Boolean") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* String */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_String"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("String") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Number */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Number"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("number") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Int */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Int"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("InT") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Fixed */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Fixed"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("fixed.14.4") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* DateTime */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_DateTime"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("DateTime") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* DateTime TZ */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_DateTime_tz"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("DateTime.tz") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Date */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Date"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("Date") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Time */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Time"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("Time") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Time.tz */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Time_TZ"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("Time.tz") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* I1 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_I1"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("I1") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Byte */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_byte"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("byte") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* I2 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_I2"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("I2") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* I4 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_I4"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("I4") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* UI1 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_UI1"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("UI1") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* UI2 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_UI2"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("UI2") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* UI4 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_UI4"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("UI4") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* r4 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_r4"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("r4") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* r8 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_r8"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("r8") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* float */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_float"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("float") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* uuid */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_uuid"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("UuId") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* bin.hex */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_bin_hex"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("bin.hex") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* bin.base64 */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_bin_base64"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("bin.base64") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ /* Check changing types */
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing_Change"), &pElement);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if(hr == S_OK)
+ {
+ IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("DateTime.tz") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ hr = IXMLDOMElement_put_dataType(pElement, _bstr_("string") );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ IXMLDOMElement_Release(pElement);
+ }
+
+ IXMLDOMElement_Release(pRoot);
+ }
+ }
+
+ IXMLDOMDocument_Release(doc);
+
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
HRESULT r;
@@ -2367,6 +2721,7 @@ START_TEST(domdoc)
test_XPath();
test_cloneNode();
test_xmlTypes();
+ test_nodeTypeTests();
CoUninitialize();
}
--
1.5.4.1
--------------020301010006060506070206--
More information about the wine-patches
mailing list