From bf3849ad6f4205c9e11e3ef26a67ef192a99fbe0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Miko=C5=82aj=20Zalewski?= Date: Wed, 9 May 2007 20:09:11 +0200 Subject: [PATCH] msxml3: Implement IXMLDOMDocument2::setProperty("SelectionLanguage", ...). --- dlls/msxml3/domdoc.c | 58 ++++++++++++++++++++++-- dlls/msxml3/tests/domdoc.c | 91 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 4 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 8b3f561dfb..a0264ca865 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -43,6 +43,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml); #ifdef HAVE_LIBXML2 +static const WCHAR SZ_PROPERTY_SELECTION_LANGUAGE[] = {'S','e','l','e','c','t','i','o','n','L','a','n','g','u','a','g','e',0}; +static const WCHAR SZ_VALUE_XPATH[] = {'X','P','a','t','h',0}; +static const WCHAR SZ_VALUE_XSLPATTERN[] = {'X','S','L','P','a','t','t','e','r','n',0}; + typedef struct { const struct IBindStatusCallbackVtbl *lpVtbl; } bsc; @@ -169,6 +173,7 @@ typedef struct _domdoc VARIANT_BOOL validating; VARIANT_BOOL resolving; VARIANT_BOOL preserving; + BOOL bUseXPath; IUnknown *node_unk; IXMLDOMNode *node; IXMLDOMSchemaCollection *schema; @@ -1374,8 +1379,38 @@ static HRESULT WINAPI domdoc_setProperty( BSTR p, VARIANT var) { - FIXME("\n"); - return E_NOTIMPL; + domdoc *This = impl_from_IXMLDOMDocument2( iface ); + + if (lstrcmpiW(p, SZ_PROPERTY_SELECTION_LANGUAGE) == 0) + { + VARIANT varStr; + HRESULT hr; + BSTR bstr; + + V_VT(&varStr) = VT_EMPTY; + if (V_VT(&var) != VT_BSTR) + { + if (FAILED(hr = VariantChangeType(&varStr, &var, 0, VT_BSTR))) + return hr; + bstr = V_BSTR(&varStr); + } + else + bstr = V_BSTR(&var); + + hr = S_OK; + if (lstrcmpiW(bstr, SZ_VALUE_XPATH) == 0) + This->bUseXPath = TRUE; + else if (lstrcmpiW(bstr, SZ_VALUE_XSLPATTERN) == 0) + This->bUseXPath = FALSE; + else + hr = E_FAIL; + + VariantClear(&varStr); + return hr; + } + + FIXME("Unknown property %s\n", wine_dbgstr_w(p)); + return E_FAIL; } static HRESULT WINAPI domdoc_getProperty( @@ -1383,8 +1418,22 @@ static HRESULT WINAPI domdoc_getProperty( BSTR p, VARIANT* var) { - FIXME("\n"); - return E_NOTIMPL; + domdoc *This = impl_from_IXMLDOMDocument2( iface ); + + if (var == NULL) + return E_INVALIDARG; + if (lstrcmpiW(p, SZ_PROPERTY_SELECTION_LANGUAGE) == 0) + { + V_VT(var) = VT_BSTR; + if (This->bUseXPath) + V_BSTR(var) = SysAllocString(SZ_VALUE_XPATH); + else + V_BSTR(var) = SysAllocString(SZ_VALUE_XSLPATTERN); + return S_OK; + } + + FIXME("Unknown property %s\n", wine_dbgstr_w(p)); + return E_FAIL; } static const struct IXMLDOMDocument2Vtbl domdoc_vtbl = @@ -1491,6 +1540,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj) doc->validating = 0; doc->resolving = 0; doc->preserving = 0; + doc->bUseXPath = FALSE; doc->error = S_OK; doc->schema = NULL; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index cdf3fac751..02e8bf99d7 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -26,6 +26,7 @@ #include "xmldom.h" #include "msxml2.h" #include +#include #include "wine/test.h" @@ -101,6 +102,59 @@ static const WCHAR szstr2[] = { 's','t','r','2',0 }; static const WCHAR szstar[] = { '*',0 }; static const WCHAR szfn1_txt[] = {'f','n','1','.','t','x','t',0}; +#define expect_bstr_eq_and_free(bstr, expect) { \ + BSTR bstrExp = alloc_str_from_narrow(expect); \ + ok(lstrcmpW(bstr, bstrExp) == 0, "String differs\n"); \ + SysFreeString(bstr); \ + SysFreeString(bstrExp); \ +} + +#define expect_eq(expr, value, type, format) { type ret = (expr); ok((value) == ret, #expr " expected " format " got " format "\n", value, ret); } + +#define ole_check(expr) { \ + HRESULT r = expr; \ + ok(r == S_OK, #expr " returned %x\n", r); \ +} + +#define ole_expect(expr, expect) { \ + HRESULT r = expr; \ + ok(r == (expect), #expr " returned %x, expected %x\n", r, expect); \ +} + +static BSTR alloc_str_from_narrow(const char *str) +{ + int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + BSTR ret = SysAllocStringLen(NULL, len - 1); /* NUL character added automatically */ + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + return ret; +} + +BSTR alloced_bstrs[256]; +int alloced_bstrs_count = 0; + +static BSTR _bstr_(const char *str) +{ + assert(alloced_bstrs_count < sizeof(alloced_bstrs)/sizeof(alloced_bstrs[0])); + alloced_bstrs[alloced_bstrs_count] = alloc_str_from_narrow(str); + return alloced_bstrs[alloced_bstrs_count++]; +} + +static void free_bstrs() +{ + int i; + for (i = 0; i < alloced_bstrs_count; i++) + SysFreeString(alloced_bstrs[i]); + alloced_bstrs_count = 0; +} + +static VARIANT _variantbstr_(const char *str) +{ + VARIANT v; + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_(str); + return v; +} + static void test_domdoc( void ) { HRESULT r; @@ -1162,6 +1216,8 @@ static void test_IXMLDOMDocument2(void) BSTR str; IXMLDOMDocument *doc; IXMLDOMDocument2 *doc2; + VARIANT var; + int ref; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -1177,8 +1233,43 @@ static void test_IXMLDOMDocument2(void) r = IXMLDOMDocument_QueryInterface( doc, &IID_IXMLDOMDocument2, (void**)&doc2 ); ok( r == S_OK, "ret %08x\n", r ); ok( doc == (IXMLDOMDocument*)doc2, "interfaces differ\n"); + + /* we will check if the variant got cleared */ + ref = IXMLDOMDocument2_AddRef(doc2); + expect_eq(ref, 3, int, "%d"); /* doc, doc2, AddRef*/ + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown *)doc2; + + /* invalid calls */ + ole_expect(IXMLDOMDocument2_getProperty(doc2, _bstr_("askldhfaklsdf"), &var), E_FAIL); + expect_eq(V_VT(&var), VT_UNKNOWN, int, "%x"); + ole_expect(IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), NULL), E_INVALIDARG); + + /* valid call */ + ole_check(IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var)); + expect_eq(V_VT(&var), VT_BSTR, int, "%x"); + expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern"); + V_VT(&var) = VT_R4; + + /* the variant didn't get cleared*/ + expect_eq(IXMLDOMDocument2_Release(doc2), 2, int, "%d"); + + /* setProperty tests */ + ole_expect(IXMLDOMDocument2_setProperty(doc2, _bstr_("askldhfaklsdf"), var), E_FAIL); + ole_expect(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), var), E_FAIL); + ole_expect(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("alskjdh faklsjd hfk")), E_FAIL); + ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"))); + ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath"))); + ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern"))); + + /* contrary to what MSDN calims you can switch back from XPath to XSLPattern */ + ole_check(IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var)); + expect_eq(V_VT(&var), VT_BSTR, int, "%x"); + expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern"); + IXMLDOMDocument2_Release( doc2 ); IXMLDOMDocument_Release( doc ); + free_bstrs(); } START_TEST(domdoc) -- 2.32.0.93.g670b81a890