[3/5] msxml3/xsl: Basic put_input() method for IXSLProcessor
Jacek Caban
jacek at codeweavers.com
Tue Feb 15 09:53:10 CST 2011
Hi Nikolay,
On 2/14/11 9:04 PM, Nikolay Sivov wrote:
> Basic put_input() method for IXSLProcessor
>
+ IXMLDOMNode *old_input = This->input;
+ HRESULT hr;
- FIXME("(%p): stub\n", This);
- return E_NOTIMPL;
+ TRACE("(%p)->(type=%d)\n", This, V_VT(&input));
+
+ /* try IXMLDOMNode directly first */
+ if (V_VT(&input) == VT_UNKNOWN)
+ hr = IUnknown_QueryInterface(V_UNKNOWN(&input),&IID_IXMLDOMNode, (void**)&This->input);
+ else if (V_VT(&input) == VT_DISPATCH)
+ hr = IDispatch_QueryInterface(V_DISPATCH(&input),&IID_IXMLDOMNode, (void**)&This->input);
+
+ if (hr != S_OK)
+ {
+ IXMLDOMDocument *doc;
+
+ hr = DOMDocument_create(&CLSID_DOMDocument, NULL, (void**)&doc);
+ if (hr == S_OK)
+ {
+ hr = IXMLDOMDocument_QueryInterface(doc,&IID_IXMLDOMNode, (void**)&This->input);
+ IXMLDOMDocument_Release(doc);
+ }
+ }
+
+ if (hr == S_OK&& old_input) IXMLDOMNode_Release(old_input);
Failure of QueryInterface call will set This->input to NULL (you probably want it not changed and even if not, that's a leak). It's probably better idea to have local pointer to the new input instead of old one and change it once you know the function will succeed.
Jacek
More information about the wine-devel
mailing list