msxml3[1/4]: implement IXMLDOMDocument2::setProperty("SelectionLanguage", ...)

Mikołaj Zalewski mikolaj at zalewski.pl
Fri May 11 10:35:24 CDT 2007


-------------- next part --------------
From 785323266a543f085f9b3e643babea62191f03f6 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Miko=C5=82aj_Zalewski?= <mikolaj at zalewski.pl>
Date: Wed, 9 May 2007 20:09:11 +0200
Subject: [PATCH] msxml3: implement IXMLDOMDocuments::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 8b3f561..6954f81 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 cdf3fac..02e8bf9 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -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)
-- 
1.4.4.2


More information about the wine-patches mailing list