Nikolay Sivov : msxml3: Fix xml declaration output when it' s specified in loaded document (in case of stream).
Alexandre Julliard
julliard at winehq.org
Mon Jul 9 14:56:38 CDT 2012
Module: wine
Branch: master
Commit: 46d08bb6cefa6372ef3f597a130d14ee62c662dc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=46d08bb6cefa6372ef3f597a130d14ee62c662dc
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun Jul 8 22:49:43 2012 +0400
msxml3: Fix xml declaration output when it's specified in loaded document (in case of stream).
---
dlls/msxml3/domdoc.c | 13 +++++++---
dlls/msxml3/main.c | 1 -
dlls/msxml3/tests/domdoc.c | 55 ++++++++++++++++++++++++++++++++++++++++----
3 files changed, 59 insertions(+), 10 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 0c0df36..5ac03e1 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -371,13 +371,17 @@ void xmldoc_link_xmldecl(xmlDocPtr doc, xmlNodePtr node)
/* unlinks a first "<?xml" child if it was created */
xmlNodePtr xmldoc_unlink_xmldecl(xmlDocPtr doc)
{
- xmlNodePtr node;
+ static const xmlChar xmlA[] = "xml";
+ xmlNodePtr node, first_child;
assert(doc != NULL);
- if (doc->standalone != -1)
+ /* xml declaration node could be created automatically after parsing or added
+ to a tree later */
+ first_child = doc->children;
+ if (first_child && first_child->type == XML_PI_NODE && xmlStrEqual(first_child->name, xmlA))
{
- node = doc->children;
+ node = first_child;
xmlUnlinkNode( node );
}
else
@@ -2383,8 +2387,9 @@ static HRESULT WINAPI domdoc_save(
ret = IUnknown_QueryInterface(pUnk, &IID_IStream, (void**)&stream);
if(ret == S_OK)
{
+ int options = get_doc(This)->standalone == -1 ? XML_SAVE_NO_DECL : 0;
ctx = xmlSaveToIO(domdoc_stream_save_writecallback,
- domdoc_stream_save_closecallback, stream, NULL, XML_SAVE_NO_DECL);
+ domdoc_stream_save_closecallback, stream, NULL, options);
if(!ctx)
{
diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c
index 1553e77..6ecfdbc 100644
--- a/dlls/msxml3/main.c
+++ b/dlls/msxml3/main.c
@@ -209,7 +209,6 @@ static void init_libxslt(void)
#endif
}
-
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
{
MSXML_hInstance = hInstDLL;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index d51b863..46b628f 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -1504,9 +1504,16 @@ static const WCHAR szComplete6[] = {
'<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
};
-static const CHAR szNonUnicodeXML[] =
-"<?xml version='1.0' encoding='Windows-1252'?>\n"
-"<open></open>\n";
+#define DECL_WIN_1252 \
+"<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
+
+static const char win1252xml[] =
+DECL_WIN_1252
+"<open></open>";
+
+static const char win1252decl[] =
+DECL_WIN_1252
+;
static const char szExampleXML[] =
"<?xml version='1.0' encoding='utf-8'?>\n"
@@ -2327,7 +2334,7 @@ if (0)
/* try a BSTR containing a Windows-1252 document */
b = VARIANT_TRUE;
- str = SysAllocStringByteLen( szNonUnicodeXML, sizeof(szNonUnicodeXML) - 1 );
+ str = SysAllocStringByteLen( win1252xml, strlen(win1252xml) );
r = IXMLDOMDocument_loadXML( doc, str, &b );
ok( r == S_FALSE, "loadXML succeeded\n");
ok( b == VARIANT_FALSE, "succeeded in loading XML string\n");
@@ -7238,10 +7245,14 @@ static void test_save(void)
IXMLDOMElement *root;
BSTR sOrig, sNew, filename;
char buffer[100];
+ IStream *stream;
+ HGLOBAL global;
+ VARIANT_BOOL b;
DWORD read = 0;
VARIANT dest;
HANDLE hfile;
HRESULT hr;
+ char *ptr;
doc = create_document(&IID_IXMLDOMDocument);
if (!doc) return;
@@ -7327,6 +7338,40 @@ static void test_save(void)
hr = IXMLDOMDocument_save(doc, dest);
EXPECT_HR(hr, S_OK);
+ /* loaded data contains xml declaration */
+ hr = IXMLDOMDocument_loadXML(doc, _bstr_(win1252xml), &b);
+ EXPECT_HR(hr, S_OK);
+
+ CreateStreamOnHGlobal(NULL, TRUE, &stream);
+ V_VT(&dest) = VT_UNKNOWN;
+ V_UNKNOWN(&dest) = (IUnknown*)stream;
+ hr = IXMLDOMDocument_save(doc, dest);
+ EXPECT_HR(hr, S_OK);
+
+ hr = GetHGlobalFromStream(stream, &global);
+ EXPECT_HR(hr, S_OK);
+ ptr = GlobalLock(global);
+ ok(!memcmp(ptr, win1252decl, strlen(win1252decl)), "got wrong xml declaration\n");
+ GlobalUnlock(global);
+ IStream_Release(stream);
+
+ /* loaded data without xml declaration */
+ hr = IXMLDOMDocument_loadXML(doc, _bstr_("<a/>"), &b);
+ EXPECT_HR(hr, S_OK);
+
+ CreateStreamOnHGlobal(NULL, TRUE, &stream);
+ V_VT(&dest) = VT_UNKNOWN;
+ V_UNKNOWN(&dest) = (IUnknown*)stream;
+ hr = IXMLDOMDocument_save(doc, dest);
+ EXPECT_HR(hr, S_OK);
+
+ hr = GetHGlobalFromStream(stream, &global);
+ EXPECT_HR(hr, S_OK);
+ ptr = GlobalLock(global);
+ ok(ptr[0] == '<' && ptr[1] != '?', "got wrong start tag %c%c\n", ptr[0], ptr[1]);
+ GlobalUnlock(global);
+ IStream_Release(stream);
+
IXMLDOMDocument_Release(doc);
free_bstrs();
}
@@ -10697,7 +10742,7 @@ static void test_load(void)
ok(hfile != INVALID_HANDLE_VALUE, "failed to create test file\n");
if(hfile == INVALID_HANDLE_VALUE) return;
- ret = WriteFile(hfile, szNonUnicodeXML, sizeof(szNonUnicodeXML)-1, &written, NULL);
+ ret = WriteFile(hfile, win1252xml, strlen(win1252xml), &written, NULL);
ok(ret, "WriteFile failed\n");
CloseHandle(hfile);
More information about the wine-cvs
mailing list