[PATCH] msxml3: put_output accepts DOMDocument destination

Jefferson Carpenter jeffersoncarpenter2 at gmail.com
Mon Apr 22 00:39:40 CDT 2019


On 4/14/2019 7:29 AM, Nikolay Sivov wrote:
> Hi, Jefferson. Please see comments below.
>> @@ -344,10 +355,10 @@ static HRESULT write_output_buffer(mxwriter 
>> *writer, const WCHAR *data, int len)
>>               if (!avail)
>>               {
>> -                IStream_Write(writer->dest, buff->data, 
>> buff->written, &written);
>> +                IStream_Write(writer->dest_stream, buff->data, 
>> buff->written, &written);
>>                   buff->written = 0;
>>                   if (src_len >= buff->allocated)
>> -                    IStream_Write(writer->dest, data, src_len, 
>> &written);
>> +                    IStream_Write(writer->dest_stream, data, src_len, 
>> &written);
>>                   else if (src_len)
>>                   {
>>                       memcpy(buff->data, data, src_len);
>> @@ -371,7 +382,7 @@ static HRESULT write_output_buffer(mxwriter 
>> *writer, const WCHAR *data, int len)
>>                   /* drain what we go so far */
>>                   if (buff->written)
>>                   {
>> -                    IStream_Write(writer->dest, buff->data, 
>> buff->written, &written);
>> +                    IStream_Write(writer->dest_stream, buff->data, 
>> buff->written, &written);
>>                       buff->written = 0;
>>                       avail = buff->allocated;
>>                   }
> I don't think this is a way to deal with that case. When writer output 
> is set to DOM document what will probably happen
> is a complete tree created and accumulated during SAX calls, and then 
> cloned back to said document on endDocument(). That means we'll simply
> have to skip over any writing call, both for existing stream or BSTR 
> path, and create nodes instead.

Indeed, I was thinking that instead of calling write_output_buffer at 
all when the destination is a DOMDocument, the DOMDocument's createNode 
etc. functions would be called instead.  Perhaps the mxwriter would need 
to hold a reference to an IXMLDOMNode for in-progress nodes whose 
attributes and child nodes are presently being assigned.

Note that presently even though write_output_buffer is called when the 
destination is a DOMDocument, it now contains the code

+    else {
+        FIXME("unsupported destination type for writing %d\n", 
writer->dest_type);
+    }

which would be called if the destination were set to a DOMDocument.

It's not clear without tests whether the entire result is cloned back on 
endDocument, or whether the DOMDocument is built progressively in 
response to events sent to the SAXContentHandler.

> 
>> +    case VT_DISPATCH:
>> +    {
>> +        IXMLDOMDocument *doc;
>> +        hr = IUnknown_QueryInterface(V_DISPATCH(&dest), 
>> &IID_IXMLDOMDocument, (void**)&doc);
>> +        if (hr == S_OK)
>> +        {
>> +            This->dest_type = MXWriterDestDocument;
>> +            This->dest_document = doc;
>> +            break;
>> +        }
>> +        FIXME("unhandled interface type for VT_DISPATCH destination\n");
>> +        return E_NOTIMPL;
>> +    }
> It's impossible to tell if this is correct without tests, e.g. 
> VT_UNKNOWN could also be passed with document pointer, it's valid in 
> VARIANT sense.

Will write tests ASAP.



More information about the wine-devel mailing list