static ULONG WINAPI xmlwriteroutput_AddRef(IXmlWriterOutput *iface) { xmlwriteroutput *This = impl_from_IXmlWriterOutput(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p)->(%d)\n", This, ref); return ref; }
/*** 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); }
static ULONG WINAPI xmlwriteroutput_Release(IXmlWriterOutput *iface) { xmlwriteroutput *This = impl_from_IXmlWriterOutput(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(%d)\n", This, ref); if (ref == 0) { IMalloc *imalloc = This->imalloc; if (This->output) IUnknown_Release(This->output); if (This->stream) ISequentialStream_Release(This->stream); free_output_buffer(This); writeroutput_free(This, This); if (imalloc) IMalloc_Release(imalloc); } return ref; }
/** IXmlWriterOutput **/ static HRESULT WINAPI xmlwriteroutput_QueryInterface(IXmlWriterOutput *iface, REFIID riid, void** ppvObject) { xmlwriteroutput *This = impl_from_IXmlWriterOutput(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); if (IsEqualGUID(riid, &IID_IXmlWriterOutput) || IsEqualGUID(riid, &IID_IUnknown)) { *ppvObject = iface; } else { WARN("interface %s not implemented\n", debugstr_guid(riid)); *ppvObject = NULL; return E_NOINTERFACE; } IUnknown_AddRef(iface); return S_OK; }