Nikolay Sivov : msxml3: Support setting namespaces feature to default value .

Alexandre Julliard julliard at winehq.org
Wed Oct 5 18:03:58 CDT 2011


Module: wine
Branch: master
Commit: 3d3786c2fab1bada769801ab43dd8ae141caa9a4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3d3786c2fab1bada769801ab43dd8ae141caa9a4

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Oct  5 13:29:37 2011 -0500

msxml3: Support setting namespaces feature to default value.

---

 dlls/msxml3/saxreader.c       |   27 ++++++++++++++++++++----
 dlls/msxml3/tests/saxreader.c |   45 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 5 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index b771802..d3f2ec0 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -56,7 +56,7 @@ enum ReaderFeatures
     ExternalParameterEntities    = 1 << 3,
     ForcedResync                 = 1 << 4,
     NamespacePrefixes            = 1 << 5,
-    Namespace                    = 1 << 6,
+    Namespaces                   = 1 << 6,
     ParameterEntities            = 1 << 7,
     PreserveSystemIndentifiers   = 1 << 8,
     ProhibitDTD                  = 1 << 9,
@@ -221,6 +221,11 @@ static const WCHAR FeatureProhibitDTDW[] = {
     'p','r','o','h','i','b','i','t','-','d','t','d',0
 };
 
+static const WCHAR FeatureNamespacesW[] = {
+    'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/','f','e','a','t','u','r','e','s',
+    '/','n','a','m','e','s','p','a','c','e','s',0
+};
+
 static inline HRESULT set_feature_value(saxreader *reader, enum ReaderFeatures feature, VARIANT_BOOL value)
 {
     if (value == VARIANT_TRUE)
@@ -231,6 +236,12 @@ static inline HRESULT set_feature_value(saxreader *reader, enum ReaderFeatures f
     return S_OK;
 }
 
+static inline HRESULT get_feature_value(const saxreader *reader, enum ReaderFeatures feature, VARIANT_BOOL *value)
+{
+    *value = reader->features & feature ? VARIANT_TRUE : VARIANT_FALSE;
+    return S_OK;
+}
+
 static inline BOOL has_content_handler(const saxlocator *locator)
 {
     return  (locator->vbInterface && locator->saxreader->vbcontentHandler) ||
@@ -2616,12 +2627,15 @@ static HRESULT WINAPI saxxmlreader_Invoke(
 /*** IVBSAXXMLReader methods ***/
 static HRESULT WINAPI saxxmlreader_getFeature(
     IVBSAXXMLReader* iface,
-    const WCHAR *pFeature,
-    VARIANT_BOOL *pValue)
+    const WCHAR *feature,
+    VARIANT_BOOL *value)
 {
     saxreader *This = impl_from_IVBSAXXMLReader( iface );
 
-    FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
+    if (!strcmpW(FeatureNamespacesW, feature))
+        return get_feature_value(This, Namespaces, value);
+
+    FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(feature), value);
     return E_NOTIMPL;
 }
 
@@ -2652,6 +2666,9 @@ static HRESULT WINAPI saxxmlreader_putFeature(
         return set_feature_value(This, ProhibitDTD, value);
     }
 
+    if (!strcmpW(FeatureNamespacesW, feature) && value == VARIANT_TRUE)
+        return set_feature_value(This, Namespaces, value);
+
     FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(feature), value);
     return E_NOTIMPL;
 }
@@ -3043,7 +3060,7 @@ HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
     reader->pool.pool = NULL;
     reader->pool.index = 0;
     reader->pool.len = 0;
-    reader->features = 0;
+    reader->features = Namespaces;
 
     memset(&reader->sax, 0, sizeof(xmlSAXHandler));
     reader->sax.initialized = XML_SAX2_MAGIC;
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index b5477d9..6493776 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -1267,6 +1267,50 @@ static void test_saxreader_properties(void)
     free_bstrs();
 }
 
+struct feature_ns_entry_t {
+    const GUID *guid;
+    const char *clsid;
+    VARIANT_BOOL value;
+};
+
+static const struct feature_ns_entry_t feature_ns_entry_data[] = {
+    { &CLSID_SAXXMLReader,   "CLSID_SAXXMLReader",   VARIANT_TRUE },
+    { &CLSID_SAXXMLReader30, "CLSID_SAXXMLReader30", VARIANT_TRUE },
+    { &CLSID_SAXXMLReader40, "CLSID_SAXXMLReader40", VARIANT_TRUE },
+    { &CLSID_SAXXMLReader60, "CLSID_SAXXMLReader60", VARIANT_TRUE },
+    { 0 }
+};
+
+static void test_saxreader_features(void)
+{
+    const struct feature_ns_entry_t *entry = feature_ns_entry_data;
+    ISAXXMLReader *reader;
+
+    while (entry->guid)
+    {
+        VARIANT_BOOL value;
+        HRESULT hr;
+
+        hr = CoCreateInstance(entry->guid, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void**)&reader);
+        if (hr != S_OK)
+        {
+            win_skip("can't create %s instance\n", entry->clsid);
+            entry++;
+            continue;
+        }
+
+        value = 0xc;
+        hr = ISAXXMLReader_getFeature(reader, _bstr_("http://xml.org/sax/features/namespaces"), &value);
+        EXPECT_HR(hr, S_OK);
+
+        ok(entry->value == value, "%s: got wrong default value %x, expected %x\n", entry->clsid, value, entry->value);
+
+        ISAXXMLReader_Release(reader);
+
+        entry++;
+    }
+}
+
 /* UTF-8 data with UTF-8 BOM and UTF-16 in prolog */
 static const CHAR UTF8BOMTest[] =
 "\xEF\xBB\xBF<?xml version = \"1.0\" encoding = \"UTF-16\"?>\n"
@@ -2317,6 +2361,7 @@ START_TEST(saxreader)
 
     test_saxreader();
     test_saxreader_properties();
+    test_saxreader_features();
     test_encoding();
 
     /* MXXMLWriter tests */




More information about the wine-cvs mailing list