Nikolay Sivov : msxml3: Store raw text data passed through characters().

Alexandre Julliard julliard at winehq.org
Mon May 9 13:34:44 CDT 2011


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat May  7 21:51:33 2011 +0400

msxml3: Store raw text data passed through characters().

---

 dlls/msxml3/msxml_private.h   |   16 ++++++++++---
 dlls/msxml3/mxwriter.c        |   15 +++++++++++-
 dlls/msxml3/tests/saxreader.c |   47 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+), 6 deletions(-)

diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index d1d4617..dcd305a 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -389,17 +389,25 @@ static inline HRESULT return_null_bstr(BSTR *p)
     return S_FALSE;
 }
 
-static inline xmlChar *xmlchar_from_wchar( LPCWSTR str )
+static inline xmlChar *xmlchar_from_wcharn(const WCHAR *str, int nchars)
 {
     xmlChar *xmlstr;
-    DWORD len = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
+    DWORD len = WideCharToMultiByte( CP_UTF8, 0, str, nchars, NULL, 0, NULL, NULL );
 
-    xmlstr = heap_alloc( len );
+    xmlstr = heap_alloc( len+1 );
     if ( xmlstr )
-        WideCharToMultiByte( CP_UTF8, 0, str, -1, (LPSTR) xmlstr, len, NULL, NULL );
+    {
+        WideCharToMultiByte( CP_UTF8, 0, str, nchars, (LPSTR) xmlstr, len+1, NULL, NULL );
+        xmlstr[len] = 0;
+    }
     return xmlstr;
 }
 
+static inline xmlChar *xmlchar_from_wchar( const WCHAR *str )
+{
+    return xmlchar_from_wcharn(str, -1);
+}
+
 #endif
 
 extern IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, BSTR srcText,
diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c
index 3d04ceb..fa0756f 100644
--- a/dlls/msxml3/mxwriter.c
+++ b/dlls/msxml3/mxwriter.c
@@ -636,8 +636,19 @@ static HRESULT WINAPI mxwriter_saxcontent_characters(
     int nchars)
 {
     mxwriter *This = impl_from_ISAXContentHandler( iface );
-    FIXME("(%p)->(%s)\n", This, debugstr_wn(chars, nchars));
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%s:%d)\n", This, debugstr_wn(chars, nchars), nchars);
+
+    if (!chars) return E_INVALIDARG;
+
+    if (nchars)
+    {
+        xmlChar *s = xmlchar_from_wcharn(chars, nchars);
+        xmlOutputBufferWriteString(This->buffer, (char*)s);
+        heap_free(s);
+    }
+
+    return S_OK;
 }
 
 static HRESULT WINAPI mxwriter_saxcontent_ignorableWhitespace(
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index fd07629..3092039 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -1285,6 +1285,52 @@ static void test_mxwriter_startendelement(void)
     free_bstrs();
 }
 
+static void test_mxwriter_characters(void)
+{
+    static const WCHAR chardataW[] = {'T','E','S','T','C','H','A','R','D','A','T','A',' ','.',0};
+    ISAXContentHandler *content;
+    IMXWriter *writer;
+    VARIANT dest;
+    HRESULT hr;
+
+    hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER,
+            &IID_IMXWriter, (void**)&writer);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void**)&content);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = IMXWriter_put_omitXMLDeclaration(writer, VARIANT_TRUE);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ISAXContentHandler_startDocument(content);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ISAXContentHandler_characters(content, NULL, 0);
+    ok(hr == E_INVALIDARG, "got %08x\n", hr);
+
+    hr = ISAXContentHandler_characters(content, chardataW, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = ISAXContentHandler_characters(content, chardataW, sizeof(chardataW)/sizeof(WCHAR) - 1);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    V_VT(&dest) = VT_EMPTY;
+    hr = IMXWriter_get_output(writer, &dest);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest));
+    ok(!lstrcmpW(_bstr_("TESTCHARDATA ."), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest)));
+    VariantClear(&dest);
+
+    hr = ISAXContentHandler_endDocument(content);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+
+    ISAXContentHandler_Release(content);
+    IMXWriter_Release(writer);
+
+    free_bstrs();
+}
+
 START_TEST(saxreader)
 {
     ISAXXMLReader *reader;
@@ -1317,6 +1363,7 @@ START_TEST(saxreader)
         test_mxwriter_contenthandler();
         test_mxwriter_startenddocument();
         test_mxwriter_startendelement();
+        test_mxwriter_characters();
         test_mxwriter_properties();
         test_mxwriter_flush();
     }




More information about the wine-cvs mailing list