mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 20:59:54 +00:00
msxml3: Implement IXMLDOMDocument2::setProperty("SelectionLanguage", ...).
This commit is contained in:
parent
918ee77d1c
commit
bf3849ad6f
@ -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;
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "xmldom.h"
|
||||
#include "msxml2.h"
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#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)
|
||||
|
Loading…
Reference in New Issue
Block a user