[PATCH v4 3/3] msxml3: When saving XML use encoding specified in the processing instruction.

Dmitry Timoshkov dmitry at baikal.ru
Thu May 27 03:26:15 CDT 2021


Nikolay Sivov <nsivov at codeweavers.com> wrote:

> >>> +static char *xmldoc_encoding(IXMLDOMDocument3 *doc)
> >>> +{
> >>> +    HRESULT hr;
> >>> +    IXMLDOMNode *node;
> >>> +    char *encoding = NULL;
> >>> +
> >>> +    hr = IXMLDOMDocument3_get_firstChild(doc, &node);
> >>> +    if (hr == S_OK)
> >>> +    {
> >>> +        DOMNodeType type;
> >>> +
> >>> +        hr = IXMLDOMNode_get_nodeType(node, &type);
> >>> +        if (hr == S_OK && type == NODE_PROCESSING_INSTRUCTION)
> >>> +        {
> >>> +            IXMLDOMProcessingInstruction *pi;
> >>> +            IXMLDOMNode *item;
> >>> +            IXMLDOMNamedNodeMap *node_map;
> >>> +
> >>> +            hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMProcessingInstruction, (void **)&pi);
> >>> +            if (hr == S_OK)
> >>> +            {
> >>> +                hr = IXMLDOMNode_get_attributes(node, &node_map);
> >>> +                if (hr == S_OK)
> >>> +                {
> >>> +                    static const WCHAR encodingW[] = {'e','n','c','o','d','i','n','g',0};
> >>> +                    BSTR bstr;
> >>> +
> >>> +                    bstr = SysAllocString(encodingW);
> >>> +                    hr = IXMLDOMNamedNodeMap_getNamedItem(node_map, bstr, &item);
> >>> +                    SysFreeString(bstr);
> >>> +                    if (hr == S_OK)
> >>> +                    {
> >>> +                        VARIANT var;
> >>> +
> >>> +                        hr = IXMLDOMNode_get_nodeValue(item, &var);
> >>> +                        if (hr == S_OK)
> >>> +                        {
> >>> +                            if (V_VT(&var) == VT_BSTR)
> >>> +                                encoding = (char *)xmlchar_from_wchar(V_BSTR(&var));
> >>> +
> >>> +                            VariantClear(&var);
> >>> +                        }
> >>> +                    }
> >>> +
> >>> +                    IXMLDOMNamedNodeMap_Release(node_map);
> >>> +                }
> >>> +
> >>> +                IXMLDOMProcessingInstruction_Release(pi);
> >>> +            }
> >>> +        }
> >>> +
> >>> +        IXMLDOMNode_Release(node);
> >>> +    }
> >>> +
> >>> +    return encoding;
> >>> +}
> >> Why all this complexity? Isn't it the same as reading current "encoding"
> >> value from artificially linked PI node?
> > Do you mean checking the first document child node type for XML_PI_NODE
> > and directly calling xmlGetProp("encoding")? Or something else?
> >
> xmlGetProp() won't get you anything for PI node, as I understand. You
> could read it from content like in parse_xml_decl() from first patch,
> but only for attribute that matters.

So, you're basically suggesting to add another copy of code for parsing
XML declaration? The code above is supposed to avoid that.

-- 
Dmitry.



More information about the wine-devel mailing list