2 * Copyright 2012 Piotr Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #define NONAMELESSUNION
27 #include <libxml/parser.h>
39 #include "wine/debug.h"
41 #include "msxml_private.h"
43 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
49 IPersistMoniker IPersistMoniker_iface;
50 IPersistHistory IPersistHistory_iface;
51 IOleCommandTarget IOleCommandTarget_iface;
52 IOleObject IOleObject_iface;
62 IMoniker IMoniker_iface;
71 IBindStatusCallback IBindStatusCallback_iface;
73 IBindStatusCallback *bsc;
81 IBinding IBinding_iface;
86 static inline Binding* impl_from_IBinding(IBinding *iface)
88 return CONTAINING_RECORD(iface, Binding, IBinding_iface);
91 static HRESULT WINAPI XMLView_Binding_QueryInterface(
92 IBinding *iface, REFIID riid, void **ppvObject)
94 Binding *This = impl_from_IBinding(iface);
96 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
98 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBinding)) {
100 IBinding_AddRef(iface);
105 return E_NOINTERFACE;
108 static ULONG WINAPI XMLView_Binding_AddRef(IBinding *iface)
110 Binding *This = impl_from_IBinding(iface);
111 LONG ref = InterlockedIncrement(&This->ref);
113 TRACE("(%p)->(%d)\n", This, ref);
118 static ULONG WINAPI XMLView_Binding_Release(IBinding *iface)
120 Binding *This = impl_from_IBinding(iface);
121 ULONG ref = InterlockedDecrement(&This->ref);
123 TRACE("(%p)->(%d)\n", This, ref);
126 IBinding_Release(This->binding);
132 static HRESULT WINAPI XMLView_Binding_Abort(IBinding *iface)
134 Binding *This = impl_from_IBinding(iface);
135 TRACE("(%p)\n", This);
137 return IBinding_Abort(This->binding);
140 static HRESULT WINAPI XMLView_Binding_Suspend(IBinding *iface)
142 Binding *This = impl_from_IBinding(iface);
143 FIXME("(%p)\n", This);
147 static HRESULT WINAPI XMLView_Binding_Resume(IBinding *iface)
149 Binding *This = impl_from_IBinding(iface);
150 FIXME("(%p)\n", This);
154 static HRESULT WINAPI XMLView_Binding_SetPriority(
155 IBinding *iface, LONG nPriority)
157 Binding *This = impl_from_IBinding(iface);
158 TRACE("(%p)->(%d)\n", This, nPriority);
160 return IBinding_SetPriority(This->binding, nPriority);
163 static HRESULT WINAPI XMLView_Binding_GetPriority(
164 IBinding *iface, LONG *pnPriority)
166 Binding *This = impl_from_IBinding(iface);
167 TRACE("(%p)->(%p)\n", This, pnPriority);
169 return IBinding_GetPriority(This->binding, pnPriority);
172 static HRESULT WINAPI XMLView_Binding_GetBindResult(IBinding *iface,
173 CLSID *pclsidProtocol, DWORD *pdwResult, LPOLESTR *pszResult,
176 Binding *This = impl_from_IBinding(iface);
177 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_guid(pclsidProtocol),
178 pdwResult, pszResult, pdwReserved);
182 static IBindingVtbl XMLView_BindingVtbl = {
183 XMLView_Binding_QueryInterface,
184 XMLView_Binding_AddRef,
185 XMLView_Binding_Release,
186 XMLView_Binding_Abort,
187 XMLView_Binding_Suspend,
188 XMLView_Binding_Resume,
189 XMLView_Binding_SetPriority,
190 XMLView_Binding_GetPriority,
191 XMLView_Binding_GetBindResult
194 static inline HRESULT XMLView_Binding_Create(IBinding *binding, IBinding **ret)
198 bind = heap_alloc_zero(sizeof(Binding));
200 return E_OUTOFMEMORY;
202 bind->IBinding_iface.lpVtbl = &XMLView_BindingVtbl;
205 bind->binding = binding;
206 IBinding_AddRef(binding);
208 *ret = &bind->IBinding_iface;
212 static inline BindStatusCallback* impl_from_IBindStatusCallback(
213 IBindStatusCallback *iface)
215 return CONTAINING_RECORD(iface, BindStatusCallback,
216 IBindStatusCallback_iface);
219 static HRESULT WINAPI XMLView_BindStatusCallback_QueryInterface(
220 IBindStatusCallback *iface, REFIID riid, void **ppvObject)
222 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
224 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
226 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBindStatusCallback)) {
228 IBindStatusCallback_AddRef(iface);
233 return E_NOINTERFACE;
236 static ULONG WINAPI XMLView_BindStatusCallback_AddRef(
237 IBindStatusCallback *iface)
239 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
240 LONG ref = InterlockedIncrement(&This->ref);
242 TRACE("(%p)->(%d)\n", This, ref);
247 static ULONG WINAPI XMLView_BindStatusCallback_Release(
248 IBindStatusCallback *iface)
250 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
251 ULONG ref = InterlockedDecrement(&This->ref);
253 TRACE("(%p)->(%d)\n", This, ref);
257 IStream_Release(This->stream);
258 IBindStatusCallback_Release(This->bsc);
259 IMoniker_Release(This->mon);
265 static HRESULT WINAPI XMLView_BindStatusCallback_OnStartBinding(
266 IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib)
268 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
272 TRACE("(%p)->(%x %p)\n", This, dwReserved, pib);
274 hres = XMLView_Binding_Create(pib, &binding);
280 hres = IBindStatusCallback_OnStartBinding(This->bsc, dwReserved, binding);
282 IBinding_Abort(binding);
286 IBinding_Release(binding);
290 static HRESULT WINAPI XMLView_BindStatusCallback_GetPriority(
291 IBindStatusCallback *iface, LONG *pnPriority)
293 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
294 FIXME("(%p)->(%p)\n", This, pnPriority);
298 static HRESULT WINAPI XMLView_BindStatusCallback_OnLowResource(
299 IBindStatusCallback *iface, DWORD reserved)
301 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
302 FIXME("(%p)->(%x)\n", This, reserved);
306 static HRESULT WINAPI XMLView_BindStatusCallback_OnProgress(
307 IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax,
308 ULONG ulStatusCode, LPCWSTR szStatusText)
310 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
311 TRACE("(%p)->(%d %d %x %s)\n", This, ulProgress, ulProgressMax,
312 ulStatusCode, debugstr_w(szStatusText));
314 switch(ulStatusCode) {
315 case BINDSTATUS_BEGINDOWNLOADDATA:
316 return IBindStatusCallback_OnProgress(This->bsc, ulProgress,
317 ulProgressMax, ulStatusCode, szStatusText);
318 case BINDSTATUS_MIMETYPEAVAILABLE:
321 FIXME("ulStatusCode: %d\n", ulStatusCode);
326 static HRESULT WINAPI XMLView_BindStatusCallback_OnStopBinding(
327 IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
329 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
330 TRACE("(%p)->(%x %s)\n", This, hresult, debugstr_w(szError));
331 return IBindStatusCallback_OnStopBinding(This->bsc, hresult, szError);
334 static HRESULT WINAPI XMLView_BindStatusCallback_GetBindInfo(
335 IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
337 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
338 TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
339 return IBindStatusCallback_GetBindInfo(This->bsc, grfBINDF, pbindinfo);
342 static inline HRESULT report_data(BindStatusCallback *This)
344 FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM};
351 hres = IStream_Seek(This->stream, off, STREAM_SEEK_CUR, &size);
355 hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL);
359 stgmedium.tymed = TYMED_ISTREAM;
360 stgmedium.u.pstm = This->stream;
361 stgmedium.pUnkForRelease = NULL;
363 hres = IBindStatusCallback_OnDataAvailable(This->bsc,
364 BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION,
365 size.u.LowPart, &formatetc, &stgmedium);
367 IStream_Release(This->stream);
372 static inline HRESULT display_error_page(BindStatusCallback *This)
374 FIXME("Error page not implemented yet.\n");
375 return report_data(This);
378 static inline HRESULT handle_xml_load(BindStatusCallback *This)
380 static const WCHAR selectW[] = {'p','r','o','c','e','s','s','i','n','g','-',
381 'i','n','s','t','r','u','c','t','i','o','n','(','\'','x','m','l',
382 '-','s','t','y','l','e','s','h','e','e','t','\'',')',0};
383 static const WCHAR hrefW[] = {'h','r','e','f','=',0};
385 IXMLDOMDocument3 *xml = NULL, *xsl = NULL;
386 IXMLDOMNode *stylesheet;
393 WCHAR *href = NULL, *p;
398 hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL);
400 return display_error_page(This);
402 hres = DOMDocument_create(MSXML_DEFAULT, NULL, (void**)&xml);
404 return display_error_page(This);
406 V_VT(&var) = VT_UNKNOWN;
407 V_UNKNOWN(&var) = (IUnknown*)This->stream;
408 hres = IXMLDOMDocument3_load(xml, var, &succ);
409 if(FAILED(hres) || !succ) {
410 IXMLDOMDocument3_Release(xml);
411 return display_error_page(This);
413 V_VT(&var) = VT_EMPTY;
415 bstr = SysAllocString(selectW);
416 hres = IXMLDOMDocument3_selectSingleNode(xml, bstr, &stylesheet);
419 IXMLDOMDocument3_Release(xml);
420 return display_error_page(This);
423 hres = IXMLDOMNode_get_nodeValue(stylesheet, &var);
424 IXMLDOMNode_Release(stylesheet);
425 if(SUCCEEDED(hres) && V_VT(&var)!=VT_BSTR) {
426 FIXME("Variant type %d not supported\n", V_VT(&var));
431 IXMLDOMDocument3_Release(xml);
432 return display_error_page(This);
435 /* TODO: fix parsing processing instruction value */
436 if((p = strstrW(V_BSTR(&var), hrefW))) {
437 p += sizeof(hrefW)/sizeof(WCHAR)-1;
438 if(*p!='\'' && *p!='\"') p = NULL;
441 p = strchrW(href, *p);
448 IXMLDOMDocument3_Release(xml);
449 return display_error_page(This);
452 hres = CreateURLMonikerEx(This->mon, href, &mon, 0);
455 IXMLDOMDocument3_Release(xml);
456 return display_error_page(This);
459 hres = CreateBindCtx(0, &pbc);
460 if(SUCCEEDED(hres)) {
461 hres = IMoniker_GetDisplayName(mon, pbc, NULL, &xsl_url);
462 IMoniker_Release(mon);
463 IBindCtx_Release(pbc);
466 IXMLDOMDocument3_Release(xml);
467 return display_error_page(This);
470 V_VT(&var) = VT_BSTR;
471 V_BSTR(&var) = SysAllocString(xsl_url);
472 CoTaskMemFree(xsl_url);
474 IXMLDOMDocument3_Release(xml);
475 return display_error_page(This);
478 hres = DOMDocument_create(MSXML_DEFAULT, NULL, (void**)&xsl);
481 IXMLDOMDocument3_Release(xml);
482 return display_error_page(This);
485 /* TODO: do the binding asynchronously */
486 hres = IXMLDOMDocument3_load(xsl, var, &succ);
488 if(FAILED(hres) || !succ) {
489 IXMLDOMDocument3_Release(xsl);
490 IXMLDOMDocument3_Release(xml);
491 return display_error_page(This);
494 hres = IXMLDOMDocument3_transformNode(xml, (IXMLDOMNode*)xsl, &bstr);
495 IXMLDOMDocument3_Release(xsl);
496 IXMLDOMDocument3_Release(xml);
498 return display_error_page(This);
500 hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL);
503 return display_error_page(This);
506 hres = IStream_Write(This->stream, (BYTE*)bstr,
507 SysStringLen(bstr)*sizeof(WCHAR), NULL);
510 return display_error_page(This);
512 return report_data(This);
515 static HRESULT WINAPI XMLView_BindStatusCallback_OnDataAvailable(
516 IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize,
517 FORMATETC *pformatetc, STGMEDIUM *pstgmed)
519 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
524 TRACE("(%p)->(%x %d %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
530 hres = IStream_Read(pstgmed->u.pstm, buf, sizeof(buf), &size);
531 IStream_Write(This->stream, buf, size, &size);
532 } while(hres==S_OK && size);
534 if(FAILED(hres) && hres!=E_PENDING)
539 return handle_xml_load(This);
542 static HRESULT WINAPI XMLView_BindStatusCallback_OnObjectAvailable(
543 IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
545 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
546 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), punk);
550 static IBindStatusCallbackVtbl XMLView_BindStatusCallbackVtbl = {
551 XMLView_BindStatusCallback_QueryInterface,
552 XMLView_BindStatusCallback_AddRef,
553 XMLView_BindStatusCallback_Release,
554 XMLView_BindStatusCallback_OnStartBinding,
555 XMLView_BindStatusCallback_GetPriority,
556 XMLView_BindStatusCallback_OnLowResource,
557 XMLView_BindStatusCallback_OnProgress,
558 XMLView_BindStatusCallback_OnStopBinding,
559 XMLView_BindStatusCallback_GetBindInfo,
560 XMLView_BindStatusCallback_OnDataAvailable,
561 XMLView_BindStatusCallback_OnObjectAvailable
564 static inline HRESULT XMLView_BindStatusCallback_Create(IBindStatusCallback *bsc_html,
565 IMoniker *mon, IStream *stream, IBindStatusCallback **ret)
567 BindStatusCallback *bsc;
569 bsc = heap_alloc_zero(sizeof(BindStatusCallback));
571 return E_OUTOFMEMORY;
573 bsc->IBindStatusCallback_iface.lpVtbl = &XMLView_BindStatusCallbackVtbl;
577 IBindStatusCallback_AddRef(bsc_html);
578 bsc->stream = stream;
579 IStream_AddRef(bsc->stream);
581 IMoniker_AddRef(mon);
583 *ret = &bsc->IBindStatusCallback_iface;
587 static inline Moniker* impl_from_IMoniker(IMoniker *iface)
589 return CONTAINING_RECORD(iface, Moniker, IMoniker_iface);
592 static HRESULT WINAPI XMLView_Moniker_QueryInterface(
593 IMoniker *iface, REFIID riid, void **ppvObject)
595 Moniker *This = impl_from_IMoniker(iface);
597 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
599 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IPersist)
600 || IsEqualGUID(riid, &IID_IPersistStream) || IsEqualGUID(riid, &IID_IMoniker)) {
602 IMoniker_AddRef(iface);
607 return E_NOINTERFACE;
610 static ULONG WINAPI XMLView_Moniker_AddRef(IMoniker *iface)
612 Moniker *This = impl_from_IMoniker(iface);
613 LONG ref = InterlockedIncrement(&This->ref);
615 TRACE("(%p)->(%d)\n", This, ref);
620 static ULONG WINAPI XMLView_Moniker_Release(IMoniker *iface)
622 Moniker *This = impl_from_IMoniker(iface);
623 ULONG ref = InterlockedDecrement(&This->ref);
625 TRACE("(%p)->(%d)\n", This, ref);
628 IMoniker_Release(This->mon);
634 static HRESULT WINAPI XMLView_Moniker_GetClassID(IMoniker *iface, CLSID *pClassID)
636 Moniker *This = impl_from_IMoniker(iface);
637 FIXME("(%p)->(%p)\n", This, pClassID);
641 static HRESULT WINAPI XMLView_Moniker_IsDirty(IMoniker *iface)
643 Moniker *This = impl_from_IMoniker(iface);
644 FIXME("(%p)\n", This);
648 static HRESULT WINAPI XMLView_Moniker_Load(IMoniker *iface, IStream *pStm)
650 Moniker *This = impl_from_IMoniker(iface);
651 FIXME("(%p)->(%p)\n", This, pStm);
655 static HRESULT WINAPI XMLView_Moniker_Save(IMoniker *iface,
656 IStream *pStm, BOOL fClearDirty)
658 Moniker *This = impl_from_IMoniker(iface);
659 FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty);
663 static HRESULT WINAPI XMLView_Moniker_GetSizeMax(
664 IMoniker *iface, ULARGE_INTEGER *pcbSize)
666 Moniker *This = impl_from_IMoniker(iface);
667 FIXME("(%p)->(%p)\n", This, pcbSize);
671 static HRESULT WINAPI XMLView_Moniker_BindToObject(IMoniker *iface, IBindCtx *pbc,
672 IMoniker *pmkToLeft, REFIID riidResult, void **ppvResult)
674 Moniker *This = impl_from_IMoniker(iface);
675 FIXME("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft,
676 debugstr_guid(riidResult), ppvResult);
680 static HRESULT WINAPI XMLView_Moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc,
681 IMoniker *pmkToLeft, REFIID riid, void **ppvObj)
683 Moniker *This = impl_from_IMoniker(iface);
685 TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj);
687 if(IsEqualGUID(riid, &IID_IStream)) {
691 *ppvObj = This->stream;
693 return S_ASYNCHRONOUS;
699 static HRESULT WINAPI XMLView_Moniker_Reduce(IMoniker *iface, IBindCtx *pbc,
700 DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced)
702 Moniker *This = impl_from_IMoniker(iface);
703 FIXME("(%p)->(%p %d %p %p)\n", This, pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced);
707 static HRESULT WINAPI XMLView_Moniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight,
708 BOOL fOnlyIfNotGeneric, IMoniker **ppmkComposite)
710 Moniker *This = impl_from_IMoniker(iface);
711 FIXME("(%p)->(%p %x %p)\n", This, pmkRight, fOnlyIfNotGeneric, ppmkComposite);
715 static HRESULT WINAPI XMLView_Moniker_Enum(IMoniker *iface,
716 BOOL fForward, IEnumMoniker **ppenumMoniker)
718 Moniker *This = impl_from_IMoniker(iface);
719 FIXME("(%p)->(%x %p)\n", This, fForward, ppenumMoniker);
723 static HRESULT WINAPI XMLView_Moniker_IsEqual(IMoniker *iface,
724 IMoniker *pmkOtherMoniker)
726 Moniker *This = impl_from_IMoniker(iface);
727 FIXME("(%p)->(%p)\n", This, pmkOtherMoniker);
731 static HRESULT WINAPI XMLView_Moniker_Hash(IMoniker *iface, DWORD *pdwHash)
733 Moniker *This = impl_from_IMoniker(iface);
734 FIXME("(%p)->(%p)\n", This, pdwHash);
738 static HRESULT WINAPI XMLView_Moniker_IsRunning(IMoniker *iface, IBindCtx *pbc,
739 IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning)
741 Moniker *This = impl_from_IMoniker(iface);
742 FIXME("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, pmkNewlyRunning);
746 static HRESULT WINAPI XMLView_Moniker_GetTimeOfLastChange(IMoniker *iface,
747 IBindCtx *pbc, IMoniker *pmkToLeft, FILETIME *pFileTime)
749 Moniker *This = impl_from_IMoniker(iface);
750 FIXME("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, pFileTime);
754 static HRESULT WINAPI XMLView_Moniker_Inverse(IMoniker *iface, IMoniker **ppmk)
756 Moniker *This = impl_from_IMoniker(iface);
757 FIXME("(%p)->(%p)\n", This, ppmk);
761 static HRESULT WINAPI XMLView_Moniker_CommonPrefixWith(IMoniker *iface,
762 IMoniker *pmkOther, IMoniker **ppmkPrefix)
764 Moniker *This = impl_from_IMoniker(iface);
765 FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkPrefix);
769 static HRESULT WINAPI XMLView_Moniker_RelativePathTo(IMoniker *iface,
770 IMoniker *pmkOther, IMoniker **ppmkRelPath)
772 Moniker *This = impl_from_IMoniker(iface);
773 FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkRelPath);
777 static HRESULT WINAPI XMLView_Moniker_GetDisplayName(IMoniker *iface,
778 IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName)
780 Moniker *This = impl_from_IMoniker(iface);
781 TRACE("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, ppszDisplayName);
782 return IMoniker_GetDisplayName(This->mon, pbc, pmkToLeft, ppszDisplayName);
785 static HRESULT WINAPI XMLView_Moniker_ParseDisplayName(IMoniker *iface,
786 IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR pszDisplayName,
787 ULONG *pchEaten, IMoniker **ppmkOut)
789 Moniker *This = impl_from_IMoniker(iface);
790 FIXME("(%p)->(%p %p %s %p %p)\n", This, pbc, pmkToLeft,
791 debugstr_w(pszDisplayName), pchEaten, ppmkOut);
795 static HRESULT WINAPI XMLView_Moniker_IsSystemMoniker(
796 IMoniker *iface, DWORD *pdwMksys)
798 Moniker *This = impl_from_IMoniker(iface);
799 FIXME("(%p)->(%p)\n", This, pdwMksys);
803 static IMonikerVtbl XMLView_MonikerVtbl = {
804 XMLView_Moniker_QueryInterface,
805 XMLView_Moniker_AddRef,
806 XMLView_Moniker_Release,
807 XMLView_Moniker_GetClassID,
808 XMLView_Moniker_IsDirty,
809 XMLView_Moniker_Load,
810 XMLView_Moniker_Save,
811 XMLView_Moniker_GetSizeMax,
812 XMLView_Moniker_BindToObject,
813 XMLView_Moniker_BindToStorage,
814 XMLView_Moniker_Reduce,
815 XMLView_Moniker_ComposeWith,
816 XMLView_Moniker_Enum,
817 XMLView_Moniker_IsEqual,
818 XMLView_Moniker_Hash,
819 XMLView_Moniker_IsRunning,
820 XMLView_Moniker_GetTimeOfLastChange,
821 XMLView_Moniker_Inverse,
822 XMLView_Moniker_CommonPrefixWith,
823 XMLView_Moniker_RelativePathTo,
824 XMLView_Moniker_GetDisplayName,
825 XMLView_Moniker_ParseDisplayName,
826 XMLView_Moniker_IsSystemMoniker
829 static inline HRESULT XMLView_Moniker_Create(IMoniker *mon,
830 IStream *stream, IMoniker **ret)
834 wrap = heap_alloc_zero(sizeof(Moniker));
836 return E_OUTOFMEMORY;
838 wrap->IMoniker_iface.lpVtbl = &XMLView_MonikerVtbl;
842 IMoniker_AddRef(mon);
843 wrap->stream = stream;
844 IStream_AddRef(stream);
846 *ret = &wrap->IMoniker_iface;
850 static inline XMLView* impl_from_IPersistMoniker(IPersistMoniker *iface)
852 return CONTAINING_RECORD(iface, XMLView, IPersistMoniker_iface);
855 static HRESULT WINAPI XMLView_PersistMoniker_QueryInterface(
856 IPersistMoniker *iface, REFIID riid, void **ppvObject)
858 XMLView *This = impl_from_IPersistMoniker(iface);
860 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
862 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IPersistMoniker))
863 *ppvObject = &This->IPersistMoniker_iface;
864 else if(IsEqualGUID(riid, &IID_IPersistHistory) ||
865 IsEqualGUID(riid, &IID_IPersist))
866 *ppvObject = &This->IPersistHistory_iface;
867 else if(IsEqualGUID(riid, &IID_IOleCommandTarget))
868 *ppvObject = &This->IOleCommandTarget_iface;
869 else if(IsEqualGUID(riid, &IID_IOleObject))
870 *ppvObject = &This->IOleObject_iface;
872 return IUnknown_QueryInterface(This->html_doc, riid, ppvObject);
874 IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
878 static ULONG WINAPI XMLView_PersistMoniker_AddRef(IPersistMoniker *iface)
880 XMLView *This = impl_from_IPersistMoniker(iface);
881 LONG ref = InterlockedIncrement(&This->ref);
883 TRACE("(%p)->(%d)\n", This, ref);
888 static ULONG WINAPI XMLView_PersistMoniker_Release(IPersistMoniker *iface)
890 XMLView *This = impl_from_IPersistMoniker(iface);
891 ULONG ref = InterlockedDecrement(&This->ref);
893 TRACE("(%p)->(%d)\n", This, ref);
897 IMoniker_Release(This->mon);
898 IUnknown_Release(This->html_doc);
904 static HRESULT WINAPI XMLView_PersistMoniker_GetClassID(
905 IPersistMoniker *iface, CLSID *pClassID)
907 XMLView *This = impl_from_IPersistMoniker(iface);
908 FIXME("(%p)->(%p)\n", This, pClassID);
912 static HRESULT WINAPI XMLView_PersistMoniker_IsDirty(IPersistMoniker *iface)
914 XMLView *This = impl_from_IPersistMoniker(iface);
915 FIXME("(%p)\n", This);
919 static HRESULT WINAPI XMLView_PersistMoniker_Load(IPersistMoniker *iface,
920 BOOL fFullyAvailable, IMoniker *pimkName, LPBC pibc, DWORD grfMode)
922 static const WCHAR XSLParametersW[] = {'X','S','L','P','a','r','a','m','e','t','e','r','s',0};
923 static const WCHAR XMLBufferStreamW[] = {'X','M','L','B','u','f','f','e','r','S','t','r','e','a','m',0};
924 static const WCHAR DWNBINDINFOW[] = {'_','_','D','W','N','B','I','N','D','I','N','F','O',0};
925 static const WCHAR HTMLLOADOPTIONSW[] = {'_','_','H','T','M','L','L','O','A','D','O','P','T','I','O','N','S',0};
926 static const WCHAR BSCBHolderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
928 XMLView *This = impl_from_IPersistMoniker(iface);
929 IPersistMoniker *html_persist_mon;
930 IBindStatusCallback *bsc, *bsc_html;
937 TRACE("(%p)->(%x %p %p %x)\n", This, fFullyAvailable, pimkName, pibc, grfMode);
939 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XSLParametersW, &unk);
940 if(SUCCEEDED(hres)) {
941 FIXME("ignoring XSLParameters\n");
942 IUnknown_Release(unk);
944 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XMLBufferStreamW, &unk);
945 if(SUCCEEDED(hres)) {
946 FIXME("ignoring XMLBufferStream\n");
947 IUnknown_Release(unk);
950 hres = CreateBindCtx(0, &bindctx);
954 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)DWNBINDINFOW, &unk);
955 if(SUCCEEDED(hres)) {
956 IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)DWNBINDINFOW, unk);
957 IUnknown_Release(unk);
959 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)HTMLLOADOPTIONSW, &unk);
960 if(SUCCEEDED(hres)) {
961 IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)HTMLLOADOPTIONSW, unk);
962 IUnknown_Release(unk);
964 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk);
965 if(SUCCEEDED(hres)) {
966 IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, unk);
967 IUnknown_Release(unk);
970 hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
972 IBindCtx_Release(bindctx);
977 IMoniker_Release(This->mon);
978 This->mon = pimkName;
979 IMoniker_AddRef(This->mon);
981 hres = XMLView_Moniker_Create(This->mon, stream, &mon);
983 IStream_Release(stream);
984 IBindCtx_Release(bindctx);
988 hres = IUnknown_QueryInterface(This->html_doc,
989 &IID_IPersistMoniker, (void**)&html_persist_mon);
991 IMoniker_Release(mon);
992 IStream_Release(stream);
993 IBindCtx_Release(bindctx);
997 hres = IPersistMoniker_Load(html_persist_mon, FALSE, mon, bindctx, 0);
998 IPersistMoniker_Release(html_persist_mon);
999 IMoniker_Release(mon);
1001 IStream_Release(stream);
1002 IBindCtx_Release(bindctx);
1006 hres = IBindCtx_GetObjectParam(bindctx, (LPOLESTR)BSCBHolderW, &unk);
1007 IBindCtx_Release(bindctx);
1009 IStream_Release(stream);
1012 hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc_html);
1013 IUnknown_Release(unk);
1015 IStream_Release(stream);
1019 hres = XMLView_BindStatusCallback_Create(bsc_html, This->mon, stream, &bsc);
1020 IStream_Release(stream);
1022 IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL);
1023 IBindStatusCallback_Release(bsc_html);
1027 hres = RegisterBindStatusCallback(pibc, bsc, NULL, 0);
1028 IBindStatusCallback_Release(bsc);
1030 IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL);
1031 IBindStatusCallback_Release(bsc_html);
1035 hres = IMoniker_BindToStorage(pimkName, pibc, NULL,
1036 &IID_IStream, (void**)&stream);
1038 IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL);
1039 IBindStatusCallback_Release(bsc_html);
1044 IStream_Release(stream);
1045 IBindStatusCallback_Release(bsc_html);
1049 static HRESULT WINAPI XMLView_PersistMoniker_Save(IPersistMoniker *iface,
1050 IMoniker *pimkName, LPBC pbc, BOOL fRemember)
1052 XMLView *This = impl_from_IPersistMoniker(iface);
1053 FIXME("(%p)->(%p %p %x)\n", This, pimkName, pbc, fRemember);
1057 static HRESULT WINAPI XMLView_PersistMoniker_SaveCompleted(
1058 IPersistMoniker *iface, IMoniker *pimkName, LPBC pibc)
1060 XMLView *This = impl_from_IPersistMoniker(iface);
1061 FIXME("(%p)->(%p %p)\n", This, pimkName, pibc);
1065 static HRESULT WINAPI XMLView_PersistMoniker_GetCurMoniker(
1066 IPersistMoniker *iface, IMoniker **ppimkName)
1068 XMLView *This = impl_from_IPersistMoniker(iface);
1069 FIXME("(%p)->(%p)\n", This, ppimkName);
1073 static IPersistMonikerVtbl XMLView_PersistMonikerVtbl = {
1074 XMLView_PersistMoniker_QueryInterface,
1075 XMLView_PersistMoniker_AddRef,
1076 XMLView_PersistMoniker_Release,
1077 XMLView_PersistMoniker_GetClassID,
1078 XMLView_PersistMoniker_IsDirty,
1079 XMLView_PersistMoniker_Load,
1080 XMLView_PersistMoniker_Save,
1081 XMLView_PersistMoniker_SaveCompleted,
1082 XMLView_PersistMoniker_GetCurMoniker
1085 static inline XMLView* impl_from_IPersistHistory(IPersistHistory *iface)
1087 return CONTAINING_RECORD(iface, XMLView, IPersistHistory_iface);
1090 static HRESULT WINAPI XMLView_PersistHistory_QueryInterface(
1091 IPersistHistory *iface, REFIID riid, void **ppvObject)
1093 XMLView *This = impl_from_IPersistHistory(iface);
1094 return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);
1097 static ULONG WINAPI XMLView_PersistHistory_AddRef(IPersistHistory *iface)
1099 XMLView *This = impl_from_IPersistHistory(iface);
1100 return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
1103 static ULONG WINAPI XMLView_PersistHistory_Release(IPersistHistory *iface)
1105 XMLView *This = impl_from_IPersistHistory(iface);
1106 return IPersistMoniker_Release(&This->IPersistMoniker_iface);
1109 static HRESULT WINAPI XMLView_PersistHistory_GetClassID(
1110 IPersistHistory *iface, CLSID *pClassID)
1112 XMLView *This = impl_from_IPersistHistory(iface);
1113 FIXME("(%p)->(%p)\n", This, pClassID);
1117 static HRESULT WINAPI XMLView_PersistHistory_LoadHistory(
1118 IPersistHistory *iface, IStream *pStream, IBindCtx *pbc)
1120 XMLView *This = impl_from_IPersistHistory(iface);
1121 FIXME("(%p)->(%p %p)\n", This, pStream, pbc);
1125 static HRESULT WINAPI XMLView_PersistHistory_SaveHistory(
1126 IPersistHistory *iface, IStream *pStream)
1128 XMLView *This = impl_from_IPersistHistory(iface);
1129 FIXME("(%p)->(%p)\n", This, pStream);
1133 static HRESULT WINAPI XMLView_PersistHistory_SetPositionCookie(
1134 IPersistHistory *iface, DWORD dwPositioncookie)
1136 XMLView *This = impl_from_IPersistHistory(iface);
1137 FIXME("(%p)->(%d)\n", This, dwPositioncookie);
1141 static HRESULT WINAPI XMLView_PersistHistory_GetPositionCookie(
1142 IPersistHistory *iface, DWORD *pdwPositioncookie)
1144 XMLView *This = impl_from_IPersistHistory(iface);
1145 FIXME("(%p)->(%p)\n", This, pdwPositioncookie);
1149 static IPersistHistoryVtbl XMLView_PersistHistoryVtbl = {
1150 XMLView_PersistHistory_QueryInterface,
1151 XMLView_PersistHistory_AddRef,
1152 XMLView_PersistHistory_Release,
1153 XMLView_PersistHistory_GetClassID,
1154 XMLView_PersistHistory_LoadHistory,
1155 XMLView_PersistHistory_SaveHistory,
1156 XMLView_PersistHistory_SetPositionCookie,
1157 XMLView_PersistHistory_GetPositionCookie
1160 static inline XMLView* impl_from_IOleCommandTarget(IOleCommandTarget *iface)
1162 return CONTAINING_RECORD(iface, XMLView, IOleCommandTarget_iface);
1165 static HRESULT WINAPI XMLView_OleCommandTarget_QueryInterface(
1166 IOleCommandTarget *iface, REFIID riid, void **ppvObject)
1168 XMLView *This = impl_from_IOleCommandTarget(iface);
1169 return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);
1172 static ULONG WINAPI XMLView_OleCommandTarget_AddRef(IOleCommandTarget *iface)
1174 XMLView *This = impl_from_IOleCommandTarget(iface);
1175 return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
1178 static ULONG WINAPI XMLView_OleCommandTarget_Release(IOleCommandTarget *iface)
1180 XMLView *This = impl_from_IOleCommandTarget(iface);
1181 return IPersistMoniker_Release(&This->IPersistMoniker_iface);
1184 static HRESULT WINAPI XMLView_OleCommandTarget_QueryStatus(IOleCommandTarget *iface,
1185 const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
1187 XMLView *This = impl_from_IOleCommandTarget(iface);
1188 FIXME("(%p)->(%p %x %p %p)\n", This, pguidCmdGroup, cCmds, prgCmds, pCmdText);
1192 static HRESULT WINAPI XMLView_OleCommandTarget_Exec(IOleCommandTarget *iface,
1193 const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt,
1194 VARIANT *pvaIn, VARIANT *pvaOut)
1196 XMLView *This = impl_from_IOleCommandTarget(iface);
1197 FIXME("(%p)->(%p %d %x %p %p)\n", This, pguidCmdGroup,
1198 nCmdID, nCmdexecopt, pvaIn, pvaOut);
1202 static IOleCommandTargetVtbl XMLView_OleCommandTargetVtbl = {
1203 XMLView_OleCommandTarget_QueryInterface,
1204 XMLView_OleCommandTarget_AddRef,
1205 XMLView_OleCommandTarget_Release,
1206 XMLView_OleCommandTarget_QueryStatus,
1207 XMLView_OleCommandTarget_Exec
1210 static inline XMLView* impl_from_IOleObject(IOleObject *iface)
1212 return CONTAINING_RECORD(iface, XMLView, IOleObject_iface);
1215 static HRESULT WINAPI XMLView_OleObject_QueryInterface(
1216 IOleObject *iface, REFIID riid, void **ppvObject)
1218 XMLView *This = impl_from_IOleObject(iface);
1219 return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);
1222 static ULONG WINAPI XMLView_OleObject_AddRef(IOleObject *iface)
1224 XMLView *This = impl_from_IOleObject(iface);
1225 return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
1228 static ULONG WINAPI XMLView_OleObject_Release(IOleObject *iface)
1230 XMLView *This = impl_from_IOleObject(iface);
1231 return IPersistMoniker_Release(&This->IPersistMoniker_iface);
1234 static HRESULT WINAPI XMLView_OleObject_SetClientSite(
1235 IOleObject *iface, IOleClientSite *pClientSite)
1237 XMLView *This = impl_from_IOleObject(iface);
1238 FIXME("(%p)->(%p)\n", This, pClientSite);
1242 static HRESULT WINAPI XMLView_OleObject_GetClientSite(
1243 IOleObject *iface, IOleClientSite **ppClientSite)
1245 XMLView *This = impl_from_IOleObject(iface);
1246 FIXME("(%p)->(%p)\n", This, ppClientSite);
1250 static HRESULT WINAPI XMLView_OleObject_SetHostNames(IOleObject *iface,
1251 LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
1253 XMLView *This = impl_from_IOleObject(iface);
1254 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
1258 static HRESULT WINAPI XMLView_OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
1260 XMLView *This = impl_from_IOleObject(iface);
1261 FIXME("(%p)->(%x)\n", This, dwSaveOption);
1265 static HRESULT WINAPI XMLView_OleObject_SetMoniker(IOleObject *iface,
1266 DWORD dwWhichMoniker, IMoniker *pmk)
1268 XMLView *This = impl_from_IOleObject(iface);
1269 FIXME("(%p)->(%x %p)\n", This, dwWhichMoniker, pmk);
1273 static HRESULT WINAPI XMLView_OleObject_GetMoniker(IOleObject *iface,
1274 DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
1276 XMLView *This = impl_from_IOleObject(iface);
1277 FIXME("(%p)->(%x %x %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
1281 static HRESULT WINAPI XMLView_OleObject_InitFromData(IOleObject *iface,
1282 IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved)
1284 XMLView *This = impl_from_IOleObject(iface);
1285 FIXME("(%p)->(%p %x %x)\n", This, pDataObject, fCreation, dwReserved);
1289 static HRESULT WINAPI XMLView_OleObject_GetClipboardData(IOleObject *iface,
1290 DWORD dwReserved, IDataObject **ppDataObject)
1292 XMLView *This = impl_from_IOleObject(iface);
1293 FIXME("(%p)->(%x %p)\n", This, dwReserved, ppDataObject);
1297 static HRESULT WINAPI XMLView_OleObject_DoVerb(IOleObject *iface,
1298 LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
1299 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
1301 XMLView *This = impl_from_IOleObject(iface);
1302 FIXME("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg,
1303 pActiveSite, lindex, hwndParent, lprcPosRect);
1307 static HRESULT WINAPI XMLView_OleObject_EnumVerbs(
1308 IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
1310 XMLView *This = impl_from_IOleObject(iface);
1311 FIXME("(%p)->{%p)\n", This, ppEnumOleVerb);
1315 static HRESULT WINAPI XMLView_OleObject_Update(IOleObject *iface)
1317 XMLView *This = impl_from_IOleObject(iface);
1318 FIXME("(%p)\n", This);
1322 static HRESULT WINAPI XMLView_OleObject_IsUpToDate(IOleObject *iface)
1324 XMLView *This = impl_from_IOleObject(iface);
1325 FIXME("(%p)\n", This);
1329 static HRESULT WINAPI XMLView_OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
1331 XMLView *This = impl_from_IOleObject(iface);
1332 FIXME("(%p)->(%p)\n", This, pClsid);
1336 static HRESULT WINAPI XMLView_OleObject_GetUserType(IOleObject *iface,
1337 DWORD dwFormOfType, LPOLESTR *pszUserType)
1339 XMLView *This = impl_from_IOleObject(iface);
1340 FIXME("(%p)->(%x %p)\n", This, dwFormOfType, pszUserType);
1344 static HRESULT WINAPI XMLView_OleObject_SetExtent(IOleObject *iface,
1345 DWORD dwDrawAspect, SIZEL *psizel)
1347 XMLView *This = impl_from_IOleObject(iface);
1348 FIXME("(%p)->(%x %p)\n", This, dwDrawAspect, psizel);
1352 static HRESULT WINAPI XMLView_OleObject_GetExtent(IOleObject *iface,
1353 DWORD dwDrawAspect, SIZEL *psizel)
1355 XMLView *This = impl_from_IOleObject(iface);
1356 FIXME("(%p)->(%x %p)\n", This, dwDrawAspect, psizel);
1360 static HRESULT WINAPI XMLView_OleObject_Advise(IOleObject *iface,
1361 IAdviseSink *pAdvSink, DWORD *pdwConnection)
1363 XMLView *This = impl_from_IOleObject(iface);
1364 FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
1368 static HRESULT WINAPI XMLView_OleObject_Unadvise(
1369 IOleObject *iface, DWORD dwConnection)
1371 XMLView *This = impl_from_IOleObject(iface);
1372 FIXME("(%p)->(%d)\n", This, dwConnection);
1376 static HRESULT WINAPI XMLView_OleObject_EnumAdvise(
1377 IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
1379 XMLView *This = impl_from_IOleObject(iface);
1380 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
1384 static HRESULT WINAPI XMLView_OleObject_GetMiscStatus(
1385 IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
1387 XMLView *This = impl_from_IOleObject(iface);
1388 FIXME("(%p)->(%d %p)\n", This, dwAspect, pdwStatus);
1392 static HRESULT WINAPI XMLView_OleObject_SetColorScheme(
1393 IOleObject *iface, LOGPALETTE *pLogpal)
1395 XMLView *This = impl_from_IOleObject(iface);
1396 FIXME("(%p)->(%p)\n", This, pLogpal);
1400 static IOleObjectVtbl XMLView_OleObjectVtbl = {
1401 XMLView_OleObject_QueryInterface,
1402 XMLView_OleObject_AddRef,
1403 XMLView_OleObject_Release,
1404 XMLView_OleObject_SetClientSite,
1405 XMLView_OleObject_GetClientSite,
1406 XMLView_OleObject_SetHostNames,
1407 XMLView_OleObject_Close,
1408 XMLView_OleObject_SetMoniker,
1409 XMLView_OleObject_GetMoniker,
1410 XMLView_OleObject_InitFromData,
1411 XMLView_OleObject_GetClipboardData,
1412 XMLView_OleObject_DoVerb,
1413 XMLView_OleObject_EnumVerbs,
1414 XMLView_OleObject_Update,
1415 XMLView_OleObject_IsUpToDate,
1416 XMLView_OleObject_GetUserClassID,
1417 XMLView_OleObject_GetUserType,
1418 XMLView_OleObject_SetExtent,
1419 XMLView_OleObject_GetExtent,
1420 XMLView_OleObject_Advise,
1421 XMLView_OleObject_Unadvise,
1422 XMLView_OleObject_EnumAdvise,
1423 XMLView_OleObject_GetMiscStatus,
1424 XMLView_OleObject_SetColorScheme
1427 HRESULT XMLView_create(IUnknown *outer, void **ppObj)
1432 TRACE("(%p %p)\n", outer, ppObj);
1437 This = heap_alloc_zero(sizeof(*This));
1439 return E_OUTOFMEMORY;
1441 This->IPersistMoniker_iface.lpVtbl = &XMLView_PersistMonikerVtbl;
1442 This->IPersistHistory_iface.lpVtbl = &XMLView_PersistHistoryVtbl;
1443 This->IOleCommandTarget_iface.lpVtbl = &XMLView_OleCommandTargetVtbl;
1444 This->IOleObject_iface.lpVtbl = &XMLView_OleObjectVtbl;
1447 hres = CoCreateInstance(&CLSID_HTMLDocument, (IUnknown*)&This->IPersistMoniker_iface,
1448 CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->html_doc);
1454 *ppObj = &This->IPersistMoniker_iface;
1460 HRESULT XMLView_create(IUnknown *outer, void **ppObj)
1462 MESSAGE("This program tried to use a XMLView object, but\n"
1463 "libxml2 support was not present at compile time.\n");
1467 #endif /* HAVE_LIBXML2 */