Module: wine Branch: master Commit: 2dfa1bffc4b975cdd72f0f1f7cd55d7db28e6c57 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2dfa1bffc4b975cdd72f0f1f7c...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat May 7 19:37:59 2011 +0400
msxml3: Support attributes list for elements.
---
dlls/msxml3/mxwriter.c | 39 +++++++- dlls/msxml3/tests/saxreader.c | 209 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 246 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index 141f58d..a791acb 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -548,12 +548,47 @@ static HRESULT WINAPI mxwriter_saxcontent_startElement(
if (!namespaceUri || !local_name || !QName) return E_INVALIDARG;
- if (attr) FIXME("attributes not handled\n"); - xmlOutputBufferWriteString(This->buffer, "<"); s = xmlchar_from_wchar(QName); xmlOutputBufferWriteString(This->buffer, (char*)s); heap_free(s); + + if (attr) + { + HRESULT hr; + INT length; + INT i; + + hr = ISAXAttributes_getLength(attr, &length); + if (FAILED(hr)) return hr; + + if (length) xmlOutputBufferWriteString(This->buffer, " "); + + for (i = 0; i < length; i++) + { + const WCHAR *str; + INT len; + + hr = ISAXAttributes_getQName(attr, i, &str, &len); + if (FAILED(hr)) return hr; + + s = xmlchar_from_wchar(str); + xmlOutputBufferWriteString(This->buffer, (char*)s); + heap_free(s); + + xmlOutputBufferWriteString(This->buffer, "=""); + + hr = ISAXAttributes_getValue(attr, i, &str, &len); + if (FAILED(hr)) return hr; + + s = xmlchar_from_wchar(str); + xmlOutputBufferWriteString(This->buffer, (char*)s); + heap_free(s); + + xmlOutputBufferWriteString(This->buffer, """); + } + } + xmlOutputBufferWriteString(This->buffer, ">");
return S_OK; diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 2bdb8b5..cac238c 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -491,6 +491,211 @@ static const ISAXErrorHandlerVtbl errorHandlerVtbl =
static ISAXErrorHandler errorHandler = { &errorHandlerVtbl };
+static HRESULT WINAPI isaxattributes_QueryInterface( + ISAXAttributes* iface, + REFIID riid, + void **ppvObject) +{ + *ppvObject = NULL; + + if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ISAXAttributes)) + { + *ppvObject = iface; + } + else + { + return E_NOINTERFACE; + } + + return S_OK; +} + +static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface) +{ + return 2; +} + +static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface) +{ + return 1; +} + +static HRESULT WINAPI isaxattributes_getLength(ISAXAttributes* iface, int *length) +{ + *length = 2; + return S_OK; +} + +static HRESULT WINAPI isaxattributes_getURI( + ISAXAttributes* iface, + int nIndex, + const WCHAR **pUrl, + int *pUriSize) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getLocalName( + ISAXAttributes* iface, + int nIndex, + const WCHAR **pLocalName, + int *pLocalNameLength) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getQName( + ISAXAttributes* iface, + int nIndex, + const WCHAR **pQName, + int *pQNameLength) +{ + static const WCHAR attr1W[] = {'a',':','a','t','t','r','1',0}; + static const WCHAR attr2W[] = {'a','t','t','r','2',0}; + + ok(nIndex == 0 || nIndex == 1, "invalid index received %d\n", nIndex); + + *pQName = (nIndex == 0) ? attr1W : attr2W; + *pQNameLength = lstrlenW(*pQName); + + return S_OK; +} + +static HRESULT WINAPI isaxattributes_getName( + ISAXAttributes* iface, + int nIndex, + const WCHAR **pUri, + int * pUriLength, + const WCHAR ** pLocalName, + int * pLocalNameSize, + const WCHAR ** pQName, + int * pQNameLength) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getIndexFromName( + ISAXAttributes* iface, + const WCHAR * pUri, + int cUriLength, + const WCHAR * pLocalName, + int cocalNameLength, + int * index) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getIndexFromQName( + ISAXAttributes* iface, + const WCHAR * pQName, + int nQNameLength, + int * index) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getType( + ISAXAttributes* iface, + int nIndex, + const WCHAR ** pType, + int * pTypeLength) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getTypeFromName( + ISAXAttributes* iface, + const WCHAR * pUri, + int nUri, + const WCHAR * pLocalName, + int nLocalName, + const WCHAR ** pType, + int * nType) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getTypeFromQName( + ISAXAttributes* iface, + const WCHAR * pQName, + int nQName, + const WCHAR ** pType, + int * nType) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getValue( + ISAXAttributes* iface, + int nIndex, + const WCHAR ** pValue, + int * nValue) +{ + static const WCHAR attrval1W[] = {'a','1',0}; + static const WCHAR attrval2W[] = {'a','2',0}; + + ok(nIndex == 0 || nIndex == 1, "invalid index received %d\n", nIndex); + + *pValue = (nIndex == 0) ? attrval1W : attrval2W; + *nValue = lstrlenW(*pValue); + + return S_OK; +} + +static HRESULT WINAPI isaxattributes_getValueFromName( + ISAXAttributes* iface, + const WCHAR * pUri, + int nUri, + const WCHAR * pLocalName, + int nLocalName, + const WCHAR ** pValue, + int * nValue) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI isaxattributes_getValueFromQName( + ISAXAttributes* iface, + const WCHAR * pQName, + int nQName, + const WCHAR ** pValue, + int * nValue) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const ISAXAttributesVtbl SAXAttributesVtbl = +{ + isaxattributes_QueryInterface, + isaxattributes_AddRef, + isaxattributes_Release, + isaxattributes_getLength, + isaxattributes_getURI, + isaxattributes_getLocalName, + isaxattributes_getQName, + isaxattributes_getName, + isaxattributes_getIndexFromName, + isaxattributes_getIndexFromQName, + isaxattributes_getType, + isaxattributes_getTypeFromName, + isaxattributes_getTypeFromQName, + isaxattributes_getValue, + isaxattributes_getValueFromName, + isaxattributes_getValueFromQName +}; + +static ISAXAttributes saxattributes = { &SAXAttributesVtbl }; + static void test_saxreader(void) { HRESULT hr; @@ -1059,6 +1264,10 @@ static void test_mxwriter_startendelement(void) todo_wine ok(!lstrcmpW(_bstr_("<><b></b>nspace:c/</a>"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest))); VariantClear(&dest);
+ /* try with attributes */ + hr = ISAXContentHandler_startElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("b"), 1, &saxattributes); + ok(hr == S_OK, "got %08x\n", hr); + hr = ISAXContentHandler_endDocument(content); todo_wine ok(hr == S_OK, "got %08x\n", hr);