static inline HRESULT writeroutput_query_for_stream(xmlwriteroutput *writeroutput) { HRESULT hr; writeroutput_release_stream(writeroutput); hr = IUnknown_QueryInterface(writeroutput->output, &IID_IStream, (void**)&writeroutput->stream); if (hr != S_OK) hr = IUnknown_QueryInterface(writeroutput->output, &IID_ISequentialStream, (void**)&writeroutput->stream); return hr; }
/*** IXmlWriter methods ***/ static HRESULT WINAPI xmlwriter_SetOutput(IXmlWriter *iface, IUnknown *output) { xmlwriter *This = impl_from_IXmlWriter(iface); IXmlWriterOutput *writeroutput; HRESULT hr; TRACE("(%p)->(%p)\n", This, output); if (This->output) { writeroutput_release_stream(This->output); IUnknown_Release(&This->output->IXmlWriterOutput_iface); This->output = NULL; This->bomwritten = FALSE; This->indent_level = 0; } /* just reset current output */ if (!output) { This->state = XmlWriterState_Initial; return S_OK; } /* now try IXmlWriterOutput, ISequentialStream, IStream */ hr = IUnknown_QueryInterface(output, &IID_IXmlWriterOutput, (void**)&writeroutput); if (hr == S_OK) { if (writeroutput->lpVtbl == &xmlwriteroutputvtbl) This->output = impl_from_IXmlWriterOutput(writeroutput); else { ERR("got external IXmlWriterOutput implementation: %p, vtbl=%p\n", writeroutput, writeroutput->lpVtbl); IUnknown_Release(writeroutput); return E_FAIL; } } if (hr != S_OK || !writeroutput) { /* create IXmlWriterOutput basing on supplied interface */ hr = CreateXmlWriterOutputWithEncodingName(output, This->imalloc, NULL, &writeroutput); if (hr != S_OK) return hr; This->output = impl_from_IXmlWriterOutput(writeroutput); } This->state = XmlWriterState_Ready; return writeroutput_query_for_stream(This->output); }