msxml3: Simplify IXMLDOMElement_get_tagName(), add null check.
authorNikolay Sivov <bunglehead@gmail.com>
Fri, 19 Feb 2010 15:06:17 +0000 (18:06 +0300)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 22 Feb 2010 10:41:05 +0000 (11:41 +0100)
dlls/msxml3/element.c
dlls/msxml3/tests/domdoc.c

index 01547709b7b91eb49c85334b03be3ac3d8e5d613..b6caf73df1577e0fe185a2a4dc5f2730a4dd6ea8 100644 (file)
@@ -489,32 +489,24 @@ static HRESULT WINAPI domelem_get_tagName(
 {
     domelem *This = impl_from_IXMLDOMElement( iface );
     xmlNodePtr element;
-    DWORD len;
-    DWORD offset = 0;
-    LPWSTR str;
+    const xmlChar *prefix;
+    xmlChar *qname;
 
     TRACE("(%p)->(%p)\n", This, p );
 
+    if (!p) return E_INVALIDARG;
+
     element = get_element( This );
     if ( !element )
         return E_FAIL;
 
-    len = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) element->name, -1, NULL, 0 );
-    if (element->ns)
-        len += MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) element->ns->prefix, -1, NULL, 0 );
-    str = heap_alloc( len * sizeof (WCHAR) );
-    if ( !str )
-        return E_OUTOFMEMORY;
-    if (element->ns)
-    {
-        offset = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) element->ns->prefix, -1, str, len );
-        str[offset - 1] = ':';
-    }
-    MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) element->name, -1, str + offset, len - offset );
-    *p = SysAllocString( str );
-    heap_free( str );
+    prefix = element->ns ? element->ns->prefix : NULL;
+    qname = xmlBuildQName(element->name, prefix, NULL, 0);
 
-    return S_OK;
+    *p = bstr_from_xmlChar(qname);
+    if (qname != element->name) xmlFree(qname);
+
+    return *p ? S_OK : E_OUTOFMEMORY;
 }
 
 static HRESULT WINAPI domelem_getAttribute(
index e2de5df75b81ea3680873c06b6260cf11d5ddd99..929a35f7f17ea7052a844c35efc8abb24beecbc4 100644 (file)
@@ -639,6 +639,9 @@ static void test_domdoc( void )
         r = IXMLDOMElement_QueryInterface( element, &IID_IObjectIdentity, (LPVOID*)&ident );
         ok( r == E_NOINTERFACE, "ret %08x\n", r);
 
+        r = IXMLDOMElement_get_tagName( element, NULL );
+        ok( r == E_INVALIDARG, "ret %08x\n", r);
+
         /* check if the tag is correct */
         r = IXMLDOMElement_get_tagName( element, &tag );
         ok( r == S_OK, "couldn't get tag name\n");