Module: wine Branch: master Commit: 2a8552a925566e4f3c4062a5b6829ddb2bd4097c URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a8552a925566e4f3c4062a5b6...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Aug 27 09:39:43 2012 +0400
msxml3: Implement xmldecl-version property for a reader.
---
dlls/msxml3/saxreader.c | 20 ++++++++++++++++ dlls/msxml3/tests/saxreader.c | 49 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index d10b822..9ebdc0f 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -209,6 +209,7 @@ typedef struct BOOL isParsing; struct bstrpool pool; saxreader_feature features; + BSTR xmldecl_version; MSXML_VERSION version; } saxreader;
@@ -334,6 +335,9 @@ static inline int saxreader_has_handler(const saxlocator *locator, enum saxhandl static const WCHAR PropertyCharsetW[] = { 'c','h','a','r','s','e','t',0 }; +static const WCHAR PropertyXmlDeclVersionW[] = { + 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0 +}; static const WCHAR PropertyDeclHandlerW[] = { 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/', 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/', @@ -1311,6 +1315,13 @@ static void libxmlStartDocument(void *ctx) This->column++; }
+ /* store version value, declaration has to contain version attribute */ + if (This->pParserCtxt->standalone != -1) + { + SysFreeString(This->saxreader->xmldecl_version); + This->saxreader->xmldecl_version = bstr_from_xmlChar(This->pParserCtxt->version); + } + if (saxreader_has_handler(This, SAXContentHandler)) { if(This->vbInterface) @@ -2654,6 +2665,13 @@ static HRESULT internal_getProperty(const saxreader* This, const WCHAR *prop, VA return S_OK; }
+ if (!memcmp(PropertyXmlDeclVersionW, prop, sizeof(PropertyXmlDeclVersionW))) + { + V_VT(value) = VT_BSTR; + V_BSTR(value) = SysAllocString(This->xmldecl_version); + return S_OK; + } + FIXME("(%p)->(%s) unsupported property\n", This, debugstr_w(prop));
return E_NOTIMPL; @@ -2725,6 +2743,7 @@ static ULONG WINAPI saxxmlreader_Release( IUnknown_Release(iface->vbhandler); }
+ SysFreeString(This->xmldecl_version); free_bstr_pool(&This->pool);
release_dispex(&This->dispex); @@ -3214,6 +3233,7 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, IUnknown *outer, LPVOID *ppOb reader->ref = 1; memset(reader->saxhandlers, 0, sizeof(reader->saxhandlers)); reader->isParsing = FALSE; + reader->xmldecl_version = NULL; reader->pool.pool = NULL; reader->pool.index = 0; reader->pool.len = 0; diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 9216f3a..bcf7529 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -557,7 +557,7 @@ static const CHAR szUtf8XML[] = static const char utf8xml2[] = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n";
-static const CHAR testXML[] = +static const char testXML[] = "<?xml version=\"1.0\" ?>\n" "<BankAccount>\n" " <Number>1234</Number>\n" @@ -2247,6 +2247,7 @@ static void test_saxreader_properties(void) const struct saxreader_props_test_t *ptr = props_test_data; ISAXXMLReader *reader; HRESULT hr; + VARIANT v;
hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void**)&reader); @@ -2257,7 +2258,6 @@ static void test_saxreader_properties(void)
while (ptr->prop_name) { - VARIANT v; LONG ref;
init_saxlexicalhandler(&lexicalhandler, S_OK); @@ -2356,9 +2356,54 @@ static void test_saxreader_properties(void) ok(V_UNKNOWN(&v) != NULL, "got %p\n", V_UNKNOWN(&v));
ptr++; + free_bstrs(); }
ISAXXMLReader_Release(reader); + + if (!is_clsid_supported(&CLSID_SAXXMLReader40, reader_support_data)) + return; + + hr = CoCreateInstance(&CLSID_SAXXMLReader40, NULL, CLSCTX_INPROC_SERVER, + &IID_ISAXXMLReader, (void**)&reader); + EXPECT_HR(hr, S_OK); + + /* xmldecl-version property */ + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + EXPECT_HR(hr, S_OK); + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(V_BSTR(&v) == NULL, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + + /* stream without declaration */ + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("<element></element>"); + hr = ISAXXMLReader_parse(reader, v); + EXPECT_HR(hr, S_OK); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + EXPECT_HR(hr, S_OK); + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(V_BSTR(&v) == NULL, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + + /* stream with declaration */ + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("<?xml version=\"1.0\"?><element></element>"); + hr = ISAXXMLReader_parse(reader, v); + EXPECT_HR(hr, S_OK); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + EXPECT_HR(hr, S_OK); + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(!lstrcmpW(V_BSTR(&v), _bstr_("1.0")), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + ISAXXMLReader_Release(reader); free_bstrs(); }