Piotr Caban : msxml3: Added support for more arguments in ISAXXMLReader_parse.

Alexandre Julliard julliard at winehq.org
Thu Jul 24 06:58:12 CDT 2008


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Wed Jul 23 16:38:58 2008 +0200

msxml3: Added support for more arguments in ISAXXMLReader_parse.

Parsing is not working when XMLDOMDocument is passed. It's because
IXMLDOMDocument_get_xml returns incomplete data.

---

 dlls/msxml3/saxreader.c |   36 ++++++++++++++++++++++++++++++------
 1 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index d0afcf5..9ea2aa2 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -1071,26 +1071,50 @@ static HRESULT WINAPI isaxxmlreader_parse(
         case VT_UNKNOWN:
         case VT_DISPATCH: {
             IPersistStream *persistStream;
-            IStream *stream;
+            IStream *stream = NULL;
             IXMLDOMDocument *xmlDoc;
 
             if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
                         &IID_IPersistStream, (void**)&persistStream) == S_OK)
             {
+                hr = IPersistStream_Save(persistStream, stream, TRUE);
                 IPersistStream_Release(persistStream);
-                hr = E_NOTIMPL;
-                break;
+                if(hr != S_OK) break;
             }
-            if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
-                                       &IID_IStream, (void**)&stream) == S_OK)
+            if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
+                        &IID_IStream, (void**)&stream) == S_OK)
             {
+                STATSTG dataInfo;
+                ULONG dataRead;
+
+                while(1)
+                {
+                    hr = IStream_Stat(stream, &dataInfo, STATFLAG_NONAME);
+                    if(hr == E_PENDING) continue;
+                    break;
+                }
+                data = HeapAlloc(GetProcessHeap(), 0,
+                        dataInfo.cbSize.QuadPart+1);
+                while(1)
+                {
+                    hr = IStream_Read(stream, data,
+                            dataInfo.cbSize.QuadPart, &dataRead);
+                    if(hr == E_PENDING) continue;
+                    break;
+                }
+                data[dataInfo.cbSize.QuadPart] = '\0';
+                xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
                 IStream_Release(stream);
-                hr = E_NOTIMPL;
                 break;
             }
             if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
                                        &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
             {
+                BSTR bstrData;
+
+                IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
+                data = xmlChar_from_wchar(bstrData);
+                xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
                 IXMLDOMDocument_Release(xmlDoc);
                 hr = E_NOTIMPL;
                 break;




More information about the wine-cvs mailing list