Author: akhaldi Date: Mon Sep 23 11:38:27 2013 New Revision: 60339
URL: http://svn.reactos.org/svn/reactos?rev=60339&view=rev Log: [MSXML3] * Sync with Wine 1.7.1. CORE-7469
Modified: trunk/reactos/dll/win32/msxml3/CMakeLists.txt trunk/reactos/dll/win32/msxml3/attribute.c trunk/reactos/dll/win32/msxml3/cdata.c trunk/reactos/dll/win32/msxml3/comment.c trunk/reactos/dll/win32/msxml3/docfrag.c trunk/reactos/dll/win32/msxml3/domdoc.c trunk/reactos/dll/win32/msxml3/element.c trunk/reactos/dll/win32/msxml3/entityref.c trunk/reactos/dll/win32/msxml3/httprequest.c trunk/reactos/dll/win32/msxml3/main.c trunk/reactos/dll/win32/msxml3/msxml_private.h trunk/reactos/dll/win32/msxml3/mxwriter.c trunk/reactos/dll/win32/msxml3/node.c trunk/reactos/dll/win32/msxml3/pi.c trunk/reactos/dll/win32/msxml3/saxreader.c trunk/reactos/dll/win32/msxml3/text.c trunk/reactos/dll/win32/msxml3/version.rc trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/dll/win32/msxml3/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/CMakeLists... ============================================================================== --- trunk/reactos/dll/win32/msxml3/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/CMakeLists.txt [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -1,6 +1,3 @@ - -remove_definitions(-D_WIN32_WINNT=0x502) -add_definitions(-D_WIN32_WINNT=0x601)
add_definitions( -D__WINESRC__ @@ -13,9 +10,7 @@ endif()
include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) - spec2def(msxml3.dll msxml3.spec ADD_IMPORTLIB) - add_typelib(msxml3_v1.idl)
list(APPEND SOURCE @@ -56,24 +51,17 @@ ${CMAKE_CURRENT_BINARY_DIR}/msxml3_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/msxml3.def)
+list(APPEND msxml3_rc_deps + ${CMAKE_CURRENT_SOURCE_DIR}/msxml3.manifest + ${CMAKE_CURRENT_SOURCE_DIR}/msxml3_v1.rgs + ${CMAKE_CURRENT_SOURCE_DIR}/xmlparser.rgs + ${CMAKE_CURRENT_BINARY_DIR}/msxml3_v1.tlb) + +set_source_files_properties(version.rc PROPERTIES OBJECT_DEPENDS "${msxml3_rc_deps}") add_library(msxml3 SHARED ${SOURCE} version.rc) - -if(NOT MSVC) - # FIXME: http://www.cmake.org/Bug/view.php?id=12998 - #allow_warnings(msxml3) - set_source_files_properties(${SOURCE} PROPERTIES COMPILE_FLAGS "-Wno-error") -endif() - add_idl_headers(xmlparser_idlheader xmlparser.idl) -add_dependencies(msxml3 xmlparser_idlheader) - set_module_type(msxml3 win32dll) -set_source_files_properties(version.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/msxml3_v1.tlb) -target_link_libraries(msxml3 libxml2 uuid wine wineldr) - -add_importlibs(msxml3 urlmon wininet ws2_32 comctl32 shell32 shlwapi cabinet oleaut32 ole32 version user32 gdi32 advapi32 msvcrt kernel32 ntdll) - -# msxml3_v1.tlb needs stdole2.tlb -add_dependencies(msxml3 stdole2) - +target_link_libraries(msxml3 libxml2 uuid wine) +add_importlibs(msxml3 urlmon ws2_32 shlwapi oleaut32 ole32 user32 msvcrt kernel32 ntdll) +add_dependencies(msxml3 xmlparser_idlheader stdole2) # msxml3_v1.tlb needs stdole2.tlb add_cd_file(TARGET msxml3 DESTINATION reactos/system32 FOR all)
Modified: trunk/reactos/dll/win32/msxml3/attribute.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/attribute.... ============================================================================== --- trunk/reactos/dll/win32/msxml3/attribute.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/attribute.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -46,6 +46,8 @@
#ifdef HAVE_LIBXML2
+static const xmlChar xmlns[] = "xmlns"; + typedef struct _domattr { xmlnode node; @@ -56,7 +58,7 @@ static const tid_t domattr_se_tids[] = { IXMLDOMNode_tid, IXMLDOMAttribute_tid, - 0 + NULL_tid };
static inline domattr *impl_from_IXMLDOMAttribute( IXMLDOMAttribute *iface ) @@ -545,8 +547,29 @@ BSTR* p) { domattr *This = impl_from_IXMLDOMAttribute( iface ); + xmlNsPtr ns = This->node.node->ns; + TRACE("(%p)->(%p)\n", This, p); - return node_get_namespaceURI(&This->node, p); + + if (!p) + return E_INVALIDARG; + + *p = NULL; + + if (ns) + { + /* special case for default namespace definition */ + if (xmlStrEqual(This->node.node->name, xmlns)) + *p = bstr_from_xmlChar(xmlns); + else if (xmlStrEqual(ns->prefix, xmlns)) + *p = SysAllocStringLen(NULL, 0); + else if (ns->href) + *p = bstr_from_xmlChar(ns->href); + } + + TRACE("uri: %s\n", debugstr_w(*p)); + + return *p ? S_OK : S_FALSE; }
static HRESULT WINAPI domattr_get_prefix( @@ -554,8 +577,26 @@ BSTR* prefix) { domattr *This = impl_from_IXMLDOMAttribute( iface ); + xmlNsPtr ns = This->node.node->ns; + TRACE("(%p)->(%p)\n", This, prefix); - return node_get_prefix( &This->node, prefix ); + + if (!prefix) return E_INVALIDARG; + + *prefix = NULL; + + if (ns) + { + /* special case for default namespace definition */ + if (xmlStrEqual(This->node.node->name, xmlns)) + *prefix = bstr_from_xmlChar(xmlns); + else if (ns->prefix) + *prefix = bstr_from_xmlChar(ns->prefix); + } + + TRACE("prefix: %s\n", debugstr_w(*prefix)); + + return *prefix ? S_OK : S_FALSE; }
static HRESULT WINAPI domattr_get_baseName(
Modified: trunk/reactos/dll/win32/msxml3/cdata.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/cdata.c?re... ============================================================================== --- trunk/reactos/dll/win32/msxml3/cdata.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/cdata.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -55,7 +55,7 @@ static const tid_t domcdata_se_tids[] = { IXMLDOMNode_tid, IXMLDOMCDATASection_tid, - 0 + NULL_tid };
static inline domcdata *impl_from_IXMLDOMCDATASection( IXMLDOMCDATASection *iface ) @@ -336,7 +336,7 @@ { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); TRACE("(%p)->(%p)\n", This, ret); - return node_has_childnodes(&This->node, ret); + return return_var_false(ret); }
static HRESULT WINAPI domcdata_get_ownerDocument(
Modified: trunk/reactos/dll/win32/msxml3/comment.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/comment.c?... ============================================================================== --- trunk/reactos/dll/win32/msxml3/comment.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/comment.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -55,7 +55,7 @@ static const tid_t domcomment_se_tids[] = { IXMLDOMNode_tid, IXMLDOMComment_tid, - 0 + NULL_tid };
static inline domcomment *impl_from_IXMLDOMComment( IXMLDOMComment *iface ) @@ -335,7 +335,7 @@ { domcomment *This = impl_from_IXMLDOMComment( iface ); TRACE("(%p)->(%p)\n", This, ret); - return node_has_childnodes(&This->node, ret); + return return_var_false(ret); }
static HRESULT WINAPI domcomment_get_ownerDocument(
Modified: trunk/reactos/dll/win32/msxml3/docfrag.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/docfrag.c?... ============================================================================== --- trunk/reactos/dll/win32/msxml3/docfrag.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/docfrag.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -55,7 +55,7 @@ static const tid_t domfrag_se_tids[] = { IXMLDOMNode_tid, IXMLDOMDocumentFragment_tid, - 0 + NULL_tid };
static inline domfrag *impl_from_IXMLDOMDocumentFragment( IXMLDOMDocumentFragment *iface )
Modified: trunk/reactos/dll/win32/msxml3/domdoc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/domdoc.c?r... ============================================================================== --- trunk/reactos/dll/win32/msxml3/domdoc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/domdoc.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -419,10 +419,26 @@
if (ctxt->node) { - /* during domdoc_loadXML() the xmlDocPtr->_private data is not available */ + xmlChar cur = *(ctxt->input->cur); + + /* Characters are reported with multiple calls, for example each charref is reported with a separate + call and then parser appends it to a single text node or creates a new node if not created. + It's not possible to tell if it's ignorable data or not just looking at data itself cause it could be + space chars that separate charrefs or similar case. We only need to skip leading and trailing spaces, + or whole node if it has nothing but space chars, so to detect leading space node->last is checked that + contains text node pointer if already created, trailing spaces are detected directly looking at parser input + for next '<' opening bracket - similar logic is used by libxml2 itself. Basically 'cur' == '<' means the last + chunk of char data, in case it's not the last chunk we check for previously added node type and if it's not + a text node it's safe to ignore. + + Note that during domdoc_loadXML() the xmlDocPtr->_private data is not available. */ + if (!This->properties->preserving && !is_preserving_whitespace(ctxt->node) && - strn_isspace(ch, len)) + strn_isspace(ch, len) && + (!ctxt->node->last || + ((ctxt->node->last && (cur == '<' || ctxt->node->last->type != XML_TEXT_NODE)) + ))) return; }
@@ -852,7 +868,7 @@ IXMLDOMDocument_tid, IXMLDOMDocument2_tid, IXMLDOMDocument3_tid, - 0 + NULL_tid };
static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument3 *iface, REFIID riid, void** ppvObject ) @@ -1921,9 +1937,6 @@ hr = get_node_type(Type, &node_type); if(FAILED(hr)) return hr;
- if(namespaceURI && namespaceURI[0] && node_type != NODE_ELEMENT) - FIXME("nodes with namespaces currently not supported.\n"); - TRACE("node_type %d\n", node_type);
/* exit earlier for types that need name */ @@ -1966,8 +1979,26 @@ break; } case NODE_ATTRIBUTE: - xmlnode = (xmlNodePtr)xmlNewDocProp(get_doc(This), xml_name, NULL); + { + xmlChar *local, *prefix; + + local = xmlSplitQName2(xml_name, &prefix); + + xmlnode = (xmlNodePtr)xmlNewDocProp(get_doc(This), local ? local : xml_name, NULL); + + if (local || (href && *href)) + { + /* we need a floating namespace here, it can't be created linked to attribute from + a start */ + xmlNsPtr ns = xmlNewNs(NULL, href, prefix); + xmlSetNs(xmlnode, ns); + } + + xmlFree(local); + xmlFree(prefix); + break; + } case NODE_TEXT: xmlnode = (xmlNodePtr)xmlNewDocText(get_doc(This), NULL); break; @@ -2984,7 +3015,7 @@ lstrcmpiW(p, PropertyResolveExternalsW) == 0) { /* Ignore */ - FIXME("Ignoring property %s, value %d\n", debugstr_w(p), V_BOOL(&value)); + FIXME("Ignoring property %s, value %s\n", debugstr_w(p), debugstr_variant(&value)); return S_OK; }
Modified: trunk/reactos/dll/win32/msxml3/element.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/element.c?... ============================================================================== --- trunk/reactos/dll/win32/msxml3/element.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/element.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -61,7 +61,7 @@ static const tid_t domelem_se_tids[] = { IXMLDOMNode_tid, IXMLDOMElement_tid, - 0 + NULL_tid };
static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
Modified: trunk/reactos/dll/win32/msxml3/entityref.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/entityref.... ============================================================================== --- trunk/reactos/dll/win32/msxml3/entityref.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/entityref.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -55,7 +55,7 @@ static const tid_t domentityref_se_tids[] = { IXMLDOMNode_tid, IXMLDOMEntityReference_tid, - 0 + NULL_tid };
static inline entityref *impl_from_IXMLDOMEntityReference( IXMLDOMEntityReference *iface )
Modified: trunk/reactos/dll/win32/msxml3/httprequest.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/httpreques... ============================================================================== --- trunk/reactos/dll/win32/msxml3/httprequest.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/httprequest.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -622,8 +622,27 @@ HWND *hwnd, LPWSTR *username, LPWSTR *password) { BindStatusCallback *This = impl_from_IAuthenticate(iface); - FIXME("(%p)->(%p %p %p)\n", This, hwnd, username, password); - return E_NOTIMPL; + httprequest *request = This->request; + + TRACE("(%p)->(%p %p %p)\n", This, hwnd, username, password); + + if (request->user && *request->user) + { + if (hwnd) *hwnd = NULL; + *username = CoTaskMemAlloc(SysStringByteLen(request->user)+sizeof(WCHAR)); + *password = CoTaskMemAlloc(SysStringByteLen(request->password)+sizeof(WCHAR)); + if (!*username || !*password) + { + CoTaskMemFree(*username); + CoTaskMemFree(*password); + return E_OUTOFMEMORY; + } + + memcpy(*username, request->user, SysStringByteLen(request->user)+sizeof(WCHAR)); + memcpy(*password, request->password, SysStringByteLen(request->password)+sizeof(WCHAR)); + } + + return S_OK; }
static const IAuthenticateVtbl AuthenticateVtbl = { @@ -706,7 +725,7 @@ heap_free(bsc); return hr; } - if ((hr = SafeArrayGetUBound(sa, 1, &size) != S_OK)) + if ((hr = SafeArrayGetUBound(sa, 1, &size)) != S_OK) { SafeArrayUnaccessData(sa); heap_free(bsc); @@ -720,26 +739,30 @@ /* fall through */ case VT_EMPTY: case VT_ERROR: + case VT_NULL: ptr = NULL; size = 0; break; }
- bsc->body = GlobalAlloc(GMEM_FIXED, size); - if (!bsc->body) + if (size) { - if (V_VT(body) == VT_BSTR) - heap_free(ptr); - else if (V_VT(body) == (VT_ARRAY|VT_UI1)) - SafeArrayUnaccessData(sa); - - heap_free(bsc); - return E_OUTOFMEMORY; + bsc->body = GlobalAlloc(GMEM_FIXED, size); + if (!bsc->body) + { + if (V_VT(body) == VT_BSTR) + heap_free(ptr); + else if (V_VT(body) == (VT_ARRAY|VT_UI1)) + SafeArrayUnaccessData(sa); + + heap_free(bsc); + return E_OUTOFMEMORY; + } + + send_data = GlobalLock(bsc->body); + memcpy(send_data, ptr, size); + GlobalUnlock(bsc->body); } - - send_data = GlobalLock(bsc->body); - memcpy(send_data, ptr, size); - GlobalUnlock(bsc->body);
if (V_VT(body) == VT_BSTR) heap_free(ptr); @@ -885,12 +908,6 @@ return hr; }
- This->uri = uri; - - VariantInit(&is_async); - hr = VariantChangeType(&is_async, &async, 0, VT_BOOL); - This->async = hr == S_OK && V_BOOL(&is_async); - VariantInit(&str); hr = VariantChangeType(&str, &user, 0, VT_BSTR); if (hr == S_OK) @@ -900,6 +917,38 @@ hr = VariantChangeType(&str, &password, 0, VT_BSTR); if (hr == S_OK) This->password = V_BSTR(&str); + + /* add authentication info */ + if (This->user && *This->user) + { + IUriBuilder *builder; + + hr = CreateIUriBuilder(uri, 0, 0, &builder); + if (hr == S_OK) + { + IUri *full_uri; + + IUriBuilder_SetUserName(builder, This->user); + IUriBuilder_SetPassword(builder, This->password); + hr = IUriBuilder_CreateUri(builder, -1, 0, 0, &full_uri); + if (hr == S_OK) + { + IUri_Release(uri); + uri = full_uri; + } + else + WARN("failed to create modified uri, 0x%08x\n", hr); + IUriBuilder_Release(builder); + } + else + WARN("IUriBuilder creation failed, 0x%08x\n", hr); + } + + This->uri = uri; + + VariantInit(&is_async); + hr = VariantChangeType(&is_async, &async, 0, VT_BOOL); + This->async = hr == S_OK && V_BOOL(&is_async);
httprequest_setreadystate(This, READYSTATE_LOADING);
Modified: trunk/reactos/dll/win32/msxml3/main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/main.c?rev... ============================================================================== --- trunk/reactos/dll/win32/msxml3/main.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/main.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -212,7 +212,7 @@ #endif }
-BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID reserved) { MSXML_hInstance = hInstDLL;
@@ -243,7 +243,6 @@ { pxsltCleanupGlobals(); wine_dlclose(libxslt_handle, NULL, 0); - libxslt_handle = NULL; } #endif #ifdef HAVE_LIBXML2
Modified: trunk/reactos/dll/win32/msxml3/msxml_private.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/msxml_priv... ============================================================================== --- trunk/reactos/dll/win32/msxml3/msxml_private.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/msxml_private.h [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -475,6 +475,15 @@ return S_FALSE; }
+static inline HRESULT return_var_false(VARIANT_BOOL *p) +{ + if(!p) + return E_INVALIDARG; + + *p = VARIANT_FALSE; + return S_FALSE; +} + extern IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR srcText, LONG line, LONG linepos, LONG filepos ) DECLSPEC_HIDDEN; extern HRESULT DOMDocument_create(MSXML_VERSION, IUnknown*, void**) DECLSPEC_HIDDEN;
Modified: trunk/reactos/dll/win32/msxml3/mxwriter.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/mxwriter.c... ============================================================================== --- trunk/reactos/dll/win32/msxml3/mxwriter.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/mxwriter.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -1,7 +1,7 @@ /* * MXWriter implementation * - * Copyright 2011-2012 Nikolay Sivov for CodeWeavers + * Copyright 2011-2013 Nikolay Sivov for CodeWeavers * Copyright 2011 Thomas Mullaly * * This library is free software; you can redistribute it and/or @@ -46,6 +46,8 @@ static const WCHAR spaceW[] = {' '}; static const WCHAR quotW[] = {'"'}; static const WCHAR closetagW[] = {'>','\r','\n'}; +static const WCHAR crlfW[] = {'\r','\n'}; +static const WCHAR entityW[] = {'<','!','E','N','T','I','T','Y',' '};
/* should be ordered as encoding names are sorted */ typedef enum @@ -148,6 +150,10 @@ VARIANT_BOOL props[MXWriter_LastProp]; BOOL prop_changed; BOOL cdata; + + BOOL text; /* last node was text node, so we shouldn't indent next node */ + BOOL newline; /* newline was already added as a part of previous call */ + UINT indent; /* indentation level for next node */
BSTR version;
@@ -457,14 +463,13 @@ return ret; }
-static void write_prolog_buffer(const mxwriter *This) +static void write_prolog_buffer(mxwriter *This) { static const WCHAR versionW[] = {'<','?','x','m','l',' ','v','e','r','s','i','o','n','='}; static const WCHAR encodingW[] = {' ','e','n','c','o','d','i','n','g','=','"'}; static const WCHAR standaloneW[] = {' ','s','t','a','n','d','a','l','o','n','e','=','"'}; static const WCHAR yesW[] = {'y','e','s','"','?','>'}; static const WCHAR noW[] = {'n','o','"','?','>'}; - static const WCHAR crlfW[] = {'\r','\n'};
/* version */ write_output_buffer(This->buffer, versionW, sizeof(versionW)/sizeof(WCHAR)); @@ -486,6 +491,7 @@ write_output_buffer(This->buffer, noW, sizeof(noW)/sizeof(WCHAR));
write_output_buffer(This->buffer, crlfW, sizeof(crlfW)/sizeof(WCHAR)); + This->newline = TRUE; }
/* Attempts to the write data from the mxwriter's buffer to @@ -537,6 +543,41 @@ static const WCHAR gtW[] = {'>'}; if (!This->element) return; write_output_buffer(This->buffer, gtW, 1); +} + +static void write_node_indent(mxwriter *This) +{ + static const WCHAR tabW[] = {'\t'}; + int indent = This->indent; + + if (!This->props[MXWriter_Indent] || This->text) + { + This->text = FALSE; + return; + } + + /* This is to workaround PI output logic that always puts newline chars, + document prolog PI does that too. */ + if (!This->newline) + write_output_buffer(This->buffer, crlfW, sizeof(crlfW)/sizeof(WCHAR)); + while (indent--) + write_output_buffer(This->buffer, tabW, 1); + + This->newline = FALSE; + This->text = FALSE; +} + +static inline void writer_inc_indent(mxwriter *This) +{ + This->indent++; +} + +static inline void writer_dec_indent(mxwriter *This) +{ + if (This->indent) This->indent--; + /* depth is decreased only when element is closed, meaning it's not a text node + at this point */ + This->text = FALSE; }
static void set_element_name(mxwriter *This, const WCHAR *name, int len) @@ -1085,8 +1126,11 @@ set_element_name(This, QName ? QName : emptyW, QName ? nQName : 0);
+ write_node_indent(This); + write_output_buffer(This->buffer, ltW, 1); write_output_buffer(This->buffer, QName, nQName); + writer_inc_indent(This);
if (attr) { @@ -1150,6 +1194,8 @@ (nQName == -1 && This->class_version == MSXML6)) return E_INVALIDARG;
+ writer_dec_indent(This); + if (This->element) { static const WCHAR closeW[] = {'/','>'}; @@ -1160,6 +1206,7 @@ static const WCHAR closetagW[] = {'<','/'}; static const WCHAR gtW[] = {'>'};
+ write_node_indent(This); write_output_buffer(This->buffer, closetagW, 2); write_output_buffer(This->buffer, QName, nQName); write_output_buffer(This->buffer, gtW, 1); @@ -1183,6 +1230,9 @@
close_element_starttag(This); set_element_name(This, NULL, 0); + + if (!This->cdata) + This->text = TRUE;
if (nchars) { @@ -1233,6 +1283,7 @@
if (!target) return E_INVALIDARG;
+ write_node_indent(This); write_output_buffer(This->buffer, openpiW, sizeof(openpiW)/sizeof(WCHAR));
if (*target) @@ -1245,6 +1296,7 @@ }
write_output_buffer(This->buffer, closepiW, sizeof(closepiW)/sizeof(WCHAR)); + This->newline = TRUE;
return S_OK; } @@ -1384,6 +1436,7 @@
TRACE("(%p)\n", This);
+ write_node_indent(This); write_output_buffer(This->buffer, scdataW, sizeof(scdataW)/sizeof(WCHAR)); This->cdata = TRUE;
@@ -1414,6 +1467,7 @@ if (!chars) return E_INVALIDARG;
close_element_starttag(This); + write_node_indent(This);
write_output_buffer(This->buffer, copenW, sizeof(copenW)/sizeof(WCHAR)); if (nchars) @@ -1526,7 +1580,6 @@ const WCHAR *name, int n_name, const WCHAR *value, int n_value) { mxwriter *This = impl_from_ISAXDeclHandler( iface ); - static const WCHAR entityW[] = {'<','!','E','N','T','I','T','Y',' '};
TRACE("(%p)->(%s:%d %s:%d)\n", This, debugstr_wn(name, n_name), n_name, debugstr_wn(value, n_value), n_value); @@ -1551,10 +1604,39 @@ const WCHAR *name, int n_name, const WCHAR *publicId, int n_publicId, const WCHAR *systemId, int n_systemId) { + static const WCHAR publicW[] = {'P','U','B','L','I','C',' '}; + static const WCHAR systemW[] = {'S','Y','S','T','E','M',' '}; mxwriter *This = impl_from_ISAXDeclHandler( iface ); - FIXME("(%p)->(%s:%d %s:%d %s:%d): stub\n", This, debugstr_wn(name, n_name), n_name, + + TRACE("(%p)->(%s:%d %s:%d %s:%d)\n", This, debugstr_wn(name, n_name), n_name, debugstr_wn(publicId, n_publicId), n_publicId, debugstr_wn(systemId, n_systemId), n_systemId); - return E_NOTIMPL; + + if (!name) return E_INVALIDARG; + if (publicId && !systemId) return E_INVALIDARG; + if (!publicId && !systemId) return E_INVALIDARG; + + write_output_buffer(This->buffer, entityW, sizeof(entityW)/sizeof(WCHAR)); + if (n_name) { + write_output_buffer(This->buffer, name, n_name); + write_output_buffer(This->buffer, spaceW, sizeof(spaceW)/sizeof(WCHAR)); + } + + if (publicId) + { + write_output_buffer(This->buffer, publicW, sizeof(publicW)/sizeof(WCHAR)); + write_output_buffer_quoted(This->buffer, publicId, n_publicId); + write_output_buffer(This->buffer, spaceW, sizeof(spaceW)/sizeof(WCHAR)); + write_output_buffer_quoted(This->buffer, systemId, n_systemId); + } + else + { + write_output_buffer(This->buffer, systemW, sizeof(systemW)/sizeof(WCHAR)); + write_output_buffer_quoted(This->buffer, systemId, n_systemId); + } + + write_output_buffer(This->buffer, closetagW, sizeof(closetagW)/sizeof(WCHAR)); + + return S_OK; }
static const ISAXDeclHandlerVtbl SAXDeclHandlerVtbl = { @@ -1612,6 +1694,9 @@
This->element = NULL; This->cdata = FALSE; + This->indent = 0; + This->text = FALSE; + This->newline = FALSE;
This->dest = NULL; This->dest_written = 0; @@ -1806,11 +1891,32 @@ return S_OK; }
+static mxattribute *get_attribute_byindex(mxattributes *attrs, int index) +{ + if (index < 0 || index >= attrs->length) return NULL; + return &attrs->attr[index]; +} + static HRESULT WINAPI MXAttributes_removeAttribute(IMXAttributes *iface, int index) { mxattributes *This = impl_from_IMXAttributes( iface ); - FIXME("(%p)->(%d): stub\n", This, index); - return E_NOTIMPL; + mxattribute *dst; + + TRACE("(%p)->(%d)\n", This, index); + + if (!(dst = get_attribute_byindex(This, index))) return E_INVALIDARG; + + /* no need to remove last attribute, just make it inaccessible */ + if (index + 1 == This->length) + { + This->length--; + return S_OK; + } + + memmove(dst, dst + 1, (This->length-index-1)*sizeof(*dst)); + This->length--; + + return S_OK; }
static HRESULT WINAPI MXAttributes_setAttribute(IMXAttributes *iface, int index, @@ -1833,29 +1939,61 @@ BSTR localName) { mxattributes *This = impl_from_IMXAttributes( iface ); - FIXME("(%p)->(%d %s): stub\n", This, index, debugstr_w(localName)); - return E_NOTIMPL; + mxattribute *attr; + + TRACE("(%p)->(%d %s)\n", This, index, debugstr_w(localName)); + + if (!(attr = get_attribute_byindex(This, index))) return E_INVALIDARG; + + SysFreeString(attr->local); + attr->local = SysAllocString(localName); + + return S_OK; }
static HRESULT WINAPI MXAttributes_setQName(IMXAttributes *iface, int index, BSTR QName) { mxattributes *This = impl_from_IMXAttributes( iface ); - FIXME("(%p)->(%d %s): stub\n", This, index, debugstr_w(QName)); - return E_NOTIMPL; + mxattribute *attr; + + TRACE("(%p)->(%d %s)\n", This, index, debugstr_w(QName)); + + if (!(attr = get_attribute_byindex(This, index))) return E_INVALIDARG; + + SysFreeString(attr->qname); + attr->qname = SysAllocString(QName); + + return S_OK; }
static HRESULT WINAPI MXAttributes_setURI(IMXAttributes *iface, int index, BSTR uri) { mxattributes *This = impl_from_IMXAttributes( iface ); - FIXME("(%p)->(%d %s): stub\n", This, index, debugstr_w(uri)); - return E_NOTIMPL; + mxattribute *attr; + + TRACE("(%p)->(%d %s)\n", This, index, debugstr_w(uri)); + + if (!(attr = get_attribute_byindex(This, index))) return E_INVALIDARG; + + SysFreeString(attr->uri); + attr->uri = SysAllocString(uri); + + return S_OK; }
static HRESULT WINAPI MXAttributes_setValue(IMXAttributes *iface, int index, BSTR value) { mxattributes *This = impl_from_IMXAttributes( iface ); - FIXME("(%p)->(%d %s): stub\n", This, index, debugstr_w(value)); - return E_NOTIMPL; + mxattribute *attr; + + TRACE("(%p)->(%d %s)\n", This, index, debugstr_w(value)); + + if (!(attr = get_attribute_byindex(This, index))) return E_INVALIDARG; + + SysFreeString(attr->value); + attr->value = SysAllocString(value); + + return S_OK; }
static const IMXAttributesVtbl MXAttributesVtbl = {
Modified: trunk/reactos/dll/win32/msxml3/node.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/node.c?rev... ============================================================================== --- trunk/reactos/dll/win32/msxml3/node.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/node.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -153,7 +153,7 @@ TRACE("(%p)->(%s)\n", This, debugstr_guid(riid));
tid = This->iids; - while (*tid) + while (*tid != NULL_tid) { if (IsEqualGUID(riid, get_riid_from_tid(*tid))) return S_OK; @@ -899,6 +899,50 @@ return *ret ? S_OK : E_OUTOFMEMORY; }
+/* duplicates xmlBufferWriteQuotedString() logic */ +static void xml_write_quotedstring(xmlOutputBufferPtr buf, const xmlChar *string) +{ + const xmlChar *cur, *base; + + if (xmlStrchr(string, '"')) + { + if (xmlStrchr(string, ''')) + { + xmlOutputBufferWrite(buf, 1, """); + base = cur = string; + + while (*cur) + { + if (*cur == '"') + { + if (base != cur) + xmlOutputBufferWrite(buf, cur-base, (const char*)base); + xmlOutputBufferWrite(buf, 6, """); + cur++; + base = cur; + } + else + cur++; + } + if (base != cur) + xmlOutputBufferWrite(buf, cur-base, (const char*)base); + xmlOutputBufferWrite(buf, 1, """); + } + else + { + xmlOutputBufferWrite(buf, 1, "'"); + xmlOutputBufferWriteString(buf, (const char*)string); + xmlOutputBufferWrite(buf, 1, "'"); + } + } + else + { + xmlOutputBufferWrite(buf, 1, """); + xmlOutputBufferWriteString(buf, (const char*)string); + xmlOutputBufferWrite(buf, 1, """); + } +} + static void htmldtd_dumpcontent(xmlOutputBufferPtr buf, xmlDocPtr doc) { xmlDtdPtr cur = doc->intSubset; @@ -908,17 +952,17 @@ if (cur->ExternalID) { xmlOutputBufferWriteString(buf, " PUBLIC "); - xmlBufferWriteQuotedString(buf->buffer, cur->ExternalID); + xml_write_quotedstring(buf, cur->ExternalID); if (cur->SystemID) { xmlOutputBufferWriteString(buf, " "); - xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); + xml_write_quotedstring(buf, cur->SystemID); } } else if (cur->SystemID) { xmlOutputBufferWriteString(buf, " SYSTEM "); - xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); + xml_write_quotedstring(buf, cur->SystemID); } xmlOutputBufferWriteString(buf, ">\n"); } @@ -946,6 +990,15 @@ doc->type = type; }
+static const xmlChar *get_output_buffer_content(xmlOutputBufferPtr output) +{ +#ifdef LIBXML2_NEW_BUFFER + return xmlOutputBufferGetContent(output); +#else + return xmlBufferContent(output->buffer); +#endif +} + HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *p) { #ifdef SONAME_LIBXSLT @@ -974,7 +1027,7 @@ if (output) { htmldoc_dumpcontent(output, result->doc); - content = xmlBufferContent(output->buffer); + content = get_output_buffer_content(output); *p = bstr_from_xmlChar(content); xmlOutputBufferClose(output); }
Modified: trunk/reactos/dll/win32/msxml3/pi.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/pi.c?rev=6... ============================================================================== --- trunk/reactos/dll/win32/msxml3/pi.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/pi.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -57,7 +57,7 @@ static const tid_t dompi_se_tids[] = { IXMLDOMNode_tid, IXMLDOMProcessingInstruction_tid, - 0 + NULL_tid };
static inline dom_pi *impl_from_IXMLDOMProcessingInstruction( IXMLDOMProcessingInstruction *iface )
Modified: trunk/reactos/dll/win32/msxml3/saxreader.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/saxreader.... ============================================================================== --- trunk/reactos/dll/win32/msxml3/saxreader.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/saxreader.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -1268,6 +1268,49 @@ isaxattributes_getValueFromQName };
+/* Libxml2 escapes '&' back to char reference '&' in attribute value, + so when document has escaped value with '&' it's parsed to '&' and then + escaped to '&'. This function takes care of ampersands only. */ +static BSTR saxreader_get_unescaped_value(const xmlChar *buf, int len) +{ + static const WCHAR ampescW[] = {'&','#','3','8',';',0}; + WCHAR *dest, *ptrW, *str; + DWORD str_len; + BSTR bstr; + + if (!buf) + return NULL; + + str_len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0); + if (len != -1) str_len++; + + str = heap_alloc(str_len*sizeof(WCHAR)); + if (!str) return NULL; + + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, str, str_len); + if (len != -1) str[str_len-1] = 0; + + ptrW = str; + while ((dest = strstrW(ptrW, ampescW))) + { + WCHAR *src; + + /* leave first '&' from a reference as a value */ + src = dest + (sizeof(ampescW)/sizeof(WCHAR) - 1); + dest++; + + /* move together with null terminator */ + memmove(dest, src, (strlenW(src) + 1)*sizeof(WCHAR)); + + ptrW++; + } + + bstr = SysAllocString(str); + heap_free(str); + + return bstr; +} + static HRESULT SAXAttributes_populate(saxlocator *locator, int nb_namespaces, const xmlChar **xmlNamespaces, int nb_attributes, const xmlChar **xmlAttributes) @@ -1320,8 +1363,7 @@ attrs[i].szURI = find_element_uri(locator, xmlAttributes[i*5+2]);
attrs[i].szLocalname = bstr_from_xmlChar(xmlAttributes[i*5]); - attrs[i].szValue = bstr_from_xmlCharN(xmlAttributes[i*5+3], - xmlAttributes[i*5+4]-xmlAttributes[i*5+3]); + attrs[i].szValue = saxreader_get_unescaped_value(xmlAttributes[i*5+3], xmlAttributes[i*5+4]-xmlAttributes[i*5+3]); attrs[i].szQName = QName_from_xmlChar(xmlAttributes[i*5+1], xmlAttributes[i*5]); }
Modified: trunk/reactos/dll/win32/msxml3/text.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/text.c?rev... ============================================================================== --- trunk/reactos/dll/win32/msxml3/text.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/text.c [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -333,7 +333,7 @@ { domtext *This = impl_from_IXMLDOMText( iface ); TRACE("(%p)->(%p)\n", This, ret); - return node_has_childnodes(&This->node, ret); + return return_var_false(ret); }
static HRESULT WINAPI domtext_get_ownerDocument(
Modified: trunk/reactos/dll/win32/msxml3/version.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msxml3/version.rc... ============================================================================== --- trunk/reactos/dll/win32/msxml3/version.rc [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msxml3/version.rc [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -22,7 +22,7 @@ #define WINE_PRODUCTVERSION_STR "8.90.1101.0" #define WINE_EXTRAVALUES VALUE "OLESelfRegister",""
-#include "wine/wine_common_ver.rc" +#include <wine/wine_common_ver.rc>
/* @makedep: msxml3.manifest */ WINE_MANIFEST 24 msxml3.manifest
Modified: trunk/reactos/media/doc/README.WINE URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=6... ============================================================================== --- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original) +++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Mon Sep 23 11:38:27 2013 @@ -132,7 +132,7 @@ reactos/dll/win32/msvidc32 # Synced to Wine-1.7.1 reactos/dll/win32/msxml # Synced to Wine-1.5.19 reactos/dll/win32/msxml2 # Synced to Wine-1.5.19 -reactos/dll/win32/msxml3 # Synced to Wine-1.5.26 +reactos/dll/win32/msxml3 # Synced to Wine-1.7.1 reactos/dll/win32/msxml4 # Synced to Wine-1.5.19 reactos/dll/win32/msxml6 # Synced to Wine-1.5.19 reactos/dll/win32/nddeapi # Synced to Wine-1.5.19