diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index 603517e4367..2378de47999 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -1934,13 +1934,24 @@ static HRESULT WINAPI SAXAttributes_getValue(ISAXAttributes *iface, int index, c return S_OK; } -static HRESULT WINAPI SAXAttributes_getValueFromName(ISAXAttributes *iface, const WCHAR * pUri, - int nUri, const WCHAR * pLocalName, int nLocalName, const WCHAR ** pValue, int * nValue) +static HRESULT WINAPI SAXAttributes_getValueFromName(ISAXAttributes *iface, const WCHAR *uri, + int uri_len, const WCHAR *name, int name_len, const WCHAR **value, int *value_len) { mxattributes *This = impl_from_ISAXAttributes( iface ); - FIXME("(%p)->(%s:%d %s:%d %p %p): stub\n", This, debugstr_wn(pUri, nUri), nUri, - debugstr_wn(pLocalName, nLocalName), nLocalName, pValue, nValue); - return E_NOTIMPL; + HRESULT hr; + int index; + + TRACE("(%p)->(%s:%d %s:%d %p %p)\n", This, debugstr_wn(uri, uri_len), uri_len, + debugstr_wn(name, name_len), name_len, value, value_len); + + if (!uri || !name || !value || !value_len) + return (This->class_version == MSXML_DEFAULT || This->class_version == MSXML3) ? E_POINTER : E_INVALIDARG; + + hr = ISAXAttributes_getIndexFromName(iface, uri, uri_len, name, name_len, &index); + if (hr == S_OK) + hr = ISAXAttributes_getValue(iface, index, value, value_len); + + return hr; } static HRESULT WINAPI SAXAttributes_getValueFromQName(ISAXAttributes *iface, const WCHAR *qname, diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 5db2d113202..340bdd0de26 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -4193,6 +4193,15 @@ static void test_mxattr_addAttribute(void) hr = ISAXAttributes_getValueFromQName(saxattr, _bstr_(table->qname), 0, &value, NULL); EXPECT_HR(hr, E_INVALIDARG); + + hr = ISAXAttributes_getValueFromName(saxattr, NULL, 0, NULL, 0, NULL, NULL); + EXPECT_HR(hr, E_INVALIDARG); + + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), 0, NULL, 0, NULL, NULL); + EXPECT_HR(hr, E_INVALIDARG); + + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), 0, NULL, 0, &value, NULL); + EXPECT_HR(hr, E_INVALIDARG); } else { @@ -4211,10 +4220,41 @@ static void test_mxattr_addAttribute(void) hr = ISAXAttributes_getValueFromQName(saxattr, _bstr_(table->qname), strlen(table->qname), NULL, &len); EXPECT_HR(hr, E_POINTER); + + hr = ISAXAttributes_getValueFromName(saxattr, NULL, 0, NULL, 0, NULL, NULL); + EXPECT_HR(hr, E_POINTER); + + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), 0, NULL, 0, NULL, NULL); + EXPECT_HR(hr, E_POINTER); + + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), 0, NULL, 0, &value, NULL); + EXPECT_HR(hr, E_POINTER); + + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), 0, _bstr_(table->local), 0, &value, NULL); + EXPECT_HR(hr, E_POINTER); + + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), 0, _bstr_(table->local), 0, NULL, &len); + EXPECT_HR(hr, E_POINTER); + + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), strlen(table->uri), _bstr_(table->local), + strlen(table->local), NULL, NULL); + EXPECT_HR(hr, E_POINTER); } hr = ISAXAttributes_getValueFromQName(saxattr, _bstr_(table->qname), strlen(table->qname), &value, &len); EXPECT_HR(hr, S_OK); + ok(!lstrcmpW(_bstr_(table->value), value), "%d: got %s, expected %s\n", i, wine_dbgstr_w(value), + table->value); + ok(lstrlenW(value) == len, "%d: got wrong value length %d\n", i, len); + + if (table->uri) { + hr = ISAXAttributes_getValueFromName(saxattr, _bstr_(table->uri), strlen(table->uri), + _bstr_(table->local), strlen(table->local), &value, &len); + EXPECT_HR(hr, S_OK); + ok(!lstrcmpW(_bstr_(table->value), value), "%d: got %s, expected %s\n", i, wine_dbgstr_w(value), + table->value); + ok(lstrlenW(value) == len, "%d: got wrong value length %d\n", i, len); + } } len = -1;