Robert Shearman : msxml3: Fix domelem_get_tagName to return a string with the namespace prefixed, if it is present.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 12 10:02:21 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 79b2742120fede9fb320cc4fd53765bbf0855802
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=79b2742120fede9fb320cc4fd53765bbf0855802

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Jun 12 01:34:28 2006 +0100

msxml3: Fix domelem_get_tagName to return a string with the namespace prefixed, if it is present.

---

 dlls/msxml3/element.c      |   19 +++++++++++++++++-
 dlls/msxml3/tests/domdoc.c |   46 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 1 deletions(-)

diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index f70b409..89b35d4 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -26,6 +26,7 @@ #include <stdarg.h>
 #include "windef.h"
 #include "winbase.h"
 #include "winuser.h"
+#include "winnls.h"
 #include "ole2.h"
 #include "msxml2.h"
 
@@ -440,6 +441,9 @@ static HRESULT WINAPI domelem_get_tagNam
 {
     domelem *This = impl_from_IXMLDOMElement( iface );
     xmlNodePtr element;
+    DWORD len;
+    DWORD offset = 0;
+    LPWSTR str;
 
     TRACE("%p\n", This );
 
@@ -450,7 +454,20 @@ static HRESULT WINAPI domelem_get_tagNam
     if ( !element )
         return E_FAIL;
 
-    *p = bstr_from_xmlChar( element->name );
+    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 = (LPWSTR) HeapAlloc( GetProcessHeap(), 0, 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 );
+    HeapFree( GetProcessHeap(), 0, str );
 
     return S_OK;
 }
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 2f7c229..68f1d1b 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -61,6 +61,20 @@ static const WCHAR szComplete4[] = {
         '<','e','m','p','t','y','>','<','/','e','m','p','t','y','>','\n',
     '<','/','l','c','>','\n',0
 };
+static const WCHAR szComplete5[] = {
+    '<','S',':','s','e','a','r','c','h',' ','x','m','l','n','s',':','D','=','"','D','A','V',':','"',' ',
+    'x','m','l','n','s',':','C','=','"','u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','o','f','f','i','c','e',':','c','l','i','p','g','a','l','l','e','r','y','"',
+    ' ','x','m','l','n','s',':','S','=','"','u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','o','f','f','i','c','e',':','c','l','i','p','g','a','l','l','e','r','y',':','s','e','a','r','c','h','"','>',
+        '<','S',':','s','c','o','p','e','>',
+            '<','S',':','d','e','e','p','>','/','<','/','S',':','d','e','e','p','>',
+        '<','/','S',':','s','c','o','p','e','>',
+        '<','S',':','c','o','n','t','e','n','t','f','r','e','e','t','e','x','t','>',
+            '<','C',':','t','e','x','t','o','r','p','r','o','p','e','r','t','y','/','>',
+            'c','o','m','p','u','t','e','r',
+        '<','/','S',':','c','o','n','t','e','n','t','f','r','e','e','t','e','x','t','>',
+    '<','/','S',':','s','e','a','r','c','h','>',0
+};
+
 static const WCHAR szNonExistentFile[] = {
     'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
 };
@@ -539,6 +553,38 @@ todo_wine
         IXMLDOMNodeList_Release( list );
     if (element)
         IXMLDOMElement_Release( element );
+
+    b = FALSE;
+    str = SysAllocString( szComplete5 );
+    r = IXMLDOMDocument_loadXML( doc, str, &b );
+    ok( r == S_OK, "loadXML failed\n");
+    ok( b == VARIANT_TRUE, "failed to load XML string\n");
+    SysFreeString( str );
+
+    b = 1;
+    r = IXMLDOMNode_hasChildNodes( doc, &b );
+    ok( r == S_OK, "hasChildNoes bad return\n");
+    ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
+
+    r = IXMLDOMDocument_get_documentElement( doc, &element );
+    ok( r == S_OK, "should be a document element\n");
+    ok( element != NULL, "should be an element\n");
+
+    if (element)
+    {
+        static const WCHAR szSSearch[] = {'S',':','s','e','a','r','c','h',0};
+        BSTR tag = NULL;
+
+        /* check if the tag is correct */
+        r = IXMLDOMElement_get_tagName( element, &tag );
+        ok( r == S_OK, "couldn't get tag name\n");
+        ok( tag != NULL, "tag was null\n");
+        ok( !lstrcmpW( tag, szSSearch ), "incorrect tag name\n");
+        SysFreeString( tag );
+    }
+
+    if (element)
+        IXMLDOMElement_Release( element );
     if (doc)
         IXMLDOMDocument_Release( doc );
 }




More information about the wine-cvs mailing list