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);
47 IPersistMoniker IPersistMoniker_iface;
48 IPersistHistory IPersistHistory_iface;
49 IOleCommandTarget IOleCommandTarget_iface;
50 IOleObject IOleObject_iface;
60 IMoniker IMoniker_iface;
69 IBindStatusCallback IBindStatusCallback_iface;
71 IBindStatusCallback *bsc;
79 IBinding IBinding_iface;
84 static inline Binding* impl_from_IBinding(IBinding *iface)
86 return CONTAINING_RECORD(iface, Binding, IBinding_iface);
89 static HRESULT WINAPI XMLView_Binding_QueryInterface(
90 IBinding *iface, REFIID riid, void **ppvObject)
92 Binding *This = impl_from_IBinding(iface);
94 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
96 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBinding)) {
98 IBinding_AddRef(iface);
103 return E_NOINTERFACE;
106 static ULONG WINAPI XMLView_Binding_AddRef(IBinding *iface)
108 Binding *This = impl_from_IBinding(iface);
109 LONG ref = InterlockedIncrement(&This->ref);
111 TRACE("(%p)->(%d)\n", This, ref);
116 static ULONG WINAPI XMLView_Binding_Release(IBinding *iface)
118 Binding *This = impl_from_IBinding(iface);
119 ULONG ref = InterlockedDecrement(&This->ref);
121 TRACE("(%p)->(%d)\n", This, ref);
124 IBinding_Release(This->binding);
130 static HRESULT WINAPI XMLView_Binding_Abort(IBinding *iface)
132 Binding *This = impl_from_IBinding(iface);
133 TRACE("(%p)\n", This);
135 return IBinding_Abort(This->binding);
138 static HRESULT WINAPI XMLView_Binding_Suspend(IBinding *iface)
140 Binding *This = impl_from_IBinding(iface);
141 FIXME("(%p)\n", This);
145 static HRESULT WINAPI XMLView_Binding_Resume(IBinding *iface)
147 Binding *This = impl_from_IBinding(iface);
148 FIXME("(%p)\n", This);
152 static HRESULT WINAPI XMLView_Binding_SetPriority(
153 IBinding *iface, LONG nPriority)
155 Binding *This = impl_from_IBinding(iface);
156 TRACE("(%p)->(%d)\n", This, nPriority);
158 return IBinding_SetPriority(This->binding, nPriority);
161 static HRESULT WINAPI XMLView_Binding_GetPriority(
162 IBinding *iface, LONG *pnPriority)
164 Binding *This = impl_from_IBinding(iface);
165 TRACE("(%p)->(%p)\n", This, pnPriority);
167 return IBinding_GetPriority(This->binding, pnPriority);
170 static HRESULT WINAPI XMLView_Binding_GetBindResult(IBinding *iface,
171 CLSID *pclsidProtocol, DWORD *pdwResult, LPOLESTR *pszResult,
174 Binding *This = impl_from_IBinding(iface);
175 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_guid(pclsidProtocol),
176 pdwResult, pszResult, pdwReserved);
180 static IBindingVtbl XMLView_BindingVtbl = {
181 XMLView_Binding_QueryInterface,
182 XMLView_Binding_AddRef,
183 XMLView_Binding_Release,
184 XMLView_Binding_Abort,
185 XMLView_Binding_Suspend,
186 XMLView_Binding_Resume,
187 XMLView_Binding_SetPriority,
188 XMLView_Binding_GetPriority,
189 XMLView_Binding_GetBindResult
192 static inline HRESULT XMLView_Binding_Create(IBinding *binding, IBinding **ret)
196 bind = heap_alloc_zero(sizeof(Binding));
198 return E_OUTOFMEMORY;
200 bind->IBinding_iface.lpVtbl = &XMLView_BindingVtbl;
203 bind->binding = binding;
204 IBinding_AddRef(binding);
206 *ret = &bind->IBinding_iface;
210 static inline BindStatusCallback* impl_from_IBindStatusCallback(
211 IBindStatusCallback *iface)
213 return CONTAINING_RECORD(iface, BindStatusCallback,
214 IBindStatusCallback_iface);
217 static HRESULT WINAPI XMLView_BindStatusCallback_QueryInterface(
218 IBindStatusCallback *iface, REFIID riid, void **ppvObject)
220 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
222 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
224 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBindStatusCallback)) {
226 IBindStatusCallback_AddRef(iface);
231 return E_NOINTERFACE;
234 static ULONG WINAPI XMLView_BindStatusCallback_AddRef(
235 IBindStatusCallback *iface)
237 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
238 LONG ref = InterlockedIncrement(&This->ref);
240 TRACE("(%p)->(%d)\n", This, ref);
245 static ULONG WINAPI XMLView_BindStatusCallback_Release(
246 IBindStatusCallback *iface)
248 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
249 ULONG ref = InterlockedDecrement(&This->ref);
251 TRACE("(%p)->(%d)\n", This, ref);
255 IStream_Release(This->stream);
256 IBindStatusCallback_Release(This->bsc);
257 IMoniker_Release(This->mon);
263 static HRESULT WINAPI XMLView_BindStatusCallback_OnStartBinding(
264 IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib)
266 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
270 TRACE("(%p)->(%x %p)\n", This, dwReserved, pib);
272 hres = XMLView_Binding_Create(pib, &binding);
278 hres = IBindStatusCallback_OnStartBinding(This->bsc, dwReserved, binding);
280 IBinding_Abort(binding);
284 IBinding_Release(binding);
288 static HRESULT WINAPI XMLView_BindStatusCallback_GetPriority(
289 IBindStatusCallback *iface, LONG *pnPriority)
291 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
292 FIXME("(%p)->(%p)\n", This, pnPriority);
296 static HRESULT WINAPI XMLView_BindStatusCallback_OnLowResource(
297 IBindStatusCallback *iface, DWORD reserved)
299 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
300 FIXME("(%p)->(%x)\n", This, reserved);
304 static HRESULT WINAPI XMLView_BindStatusCallback_OnProgress(
305 IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax,
306 ULONG ulStatusCode, LPCWSTR szStatusText)
308 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
309 TRACE("(%p)->(%d %d %x %s)\n", This, ulProgress, ulProgressMax,
310 ulStatusCode, debugstr_w(szStatusText));
312 switch(ulStatusCode) {
313 case BINDSTATUS_BEGINDOWNLOADDATA:
314 return IBindStatusCallback_OnProgress(This->bsc, ulProgress,
315 ulProgressMax, ulStatusCode, szStatusText);
316 case BINDSTATUS_MIMETYPEAVAILABLE:
319 FIXME("ulStatusCode: %d\n", ulStatusCode);
324 static HRESULT WINAPI XMLView_BindStatusCallback_OnStopBinding(
325 IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
327 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
328 TRACE("(%p)->(%x %s)\n", This, hresult, debugstr_w(szError));
329 return IBindStatusCallback_OnStopBinding(This->bsc, hresult, szError);
332 static HRESULT WINAPI XMLView_BindStatusCallback_GetBindInfo(
333 IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
335 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
336 TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
337 return IBindStatusCallback_GetBindInfo(This->bsc, grfBINDF, pbindinfo);
340 static inline HRESULT report_data(BindStatusCallback *This)
342 FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM};
348 hres = IStream_Seek(This->stream, off, STREAM_SEEK_CUR, &size);
353 hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL);
357 stgmedium.tymed = TYMED_ISTREAM;
358 stgmedium.u.pstm = This->stream;
359 stgmedium.pUnkForRelease = NULL;
361 hres = IBindStatusCallback_OnDataAvailable(This->bsc,
362 BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION,
363 size.u.LowPart, &formatetc, &stgmedium);
365 IStream_Release(This->stream);
370 static inline HRESULT display_error_page(BindStatusCallback *This)
372 FIXME("Error page not implemented yet.\n");
373 return report_data(This);
376 static inline HRESULT handle_xml_load(BindStatusCallback *This)
378 static const WCHAR selectW[] = {'p','r','o','c','e','s','s','i','n','g','-',
379 'i','n','s','t','r','u','c','t','i','o','n','(','\'','x','m','l',
380 '-','s','t','y','l','e','s','h','e','e','t','\'',')',0};
381 static const WCHAR hrefW[] = {'h','r','e','f','=',0};
383 IXMLDOMDocument3 *xml = NULL, *xsl = NULL;
384 IXMLDOMNode *stylesheet;
391 WCHAR *href = NULL, *p;
396 hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL);
398 return display_error_page(This);
400 hres = DOMDocument_create(MSXML_DEFAULT, NULL, (void**)&xml);
402 return display_error_page(This);
404 V_VT(&var) = VT_UNKNOWN;
405 V_UNKNOWN(&var) = (IUnknown*)This->stream;
406 hres = IXMLDOMDocument3_load(xml, var, &succ);
407 if(FAILED(hres) || !succ) {
408 IXMLDOMDocument3_Release(xml);
409 return display_error_page(This);
411 V_VT(&var) = VT_EMPTY;
413 bstr = SysAllocString(selectW);
414 hres = IXMLDOMDocument3_selectSingleNode(xml, bstr, &stylesheet);
417 IXMLDOMDocument3_Release(xml);
418 return display_error_page(This);
421 hres = IXMLDOMNode_get_nodeValue(stylesheet, &var);
422 IXMLDOMNode_Release(stylesheet);
423 if(SUCCEEDED(hres) && V_VT(&var)!=VT_BSTR) {
424 FIXME("Variant type %d not supported\n", V_VT(&var));
429 IXMLDOMDocument3_Release(xml);
430 return display_error_page(This);
433 /* TODO: fix parsing processing instruction value */
434 if((p = strstrW(V_BSTR(&var), hrefW))) {
435 p += sizeof(hrefW)/sizeof(WCHAR)-1;
436 if(*p!='\'' && *p!='\"') p = NULL;
439 p = strchrW(href, *p);
446 IXMLDOMDocument3_Release(xml);
447 return display_error_page(This);
450 hres = CreateURLMonikerEx(This->mon, href, &mon, 0);
453 IXMLDOMDocument3_Release(xml);
454 return display_error_page(This);
457 hres = CreateBindCtx(0, &pbc);
458 if(SUCCEEDED(hres)) {
459 hres = IMoniker_GetDisplayName(mon, pbc, NULL, &xsl_url);
460 IMoniker_Release(mon);
461 IBindCtx_Release(pbc);
464 IXMLDOMDocument3_Release(xml);
465 return display_error_page(This);
468 V_VT(&var) = VT_BSTR;
469 V_BSTR(&var) = SysAllocString(xsl_url);
470 CoTaskMemFree(xsl_url);
472 IXMLDOMDocument3_Release(xml);
473 return display_error_page(This);
476 hres = DOMDocument_create(MSXML_DEFAULT, NULL, (void**)&xsl);
479 IXMLDOMDocument3_Release(xml);
480 return display_error_page(This);
483 /* TODO: do the binding asynchronously */
484 hres = IXMLDOMDocument3_load(xsl, var, &succ);
486 if(FAILED(hres) || !succ) {
487 IXMLDOMDocument3_Release(xsl);
488 IXMLDOMDocument3_Release(xml);
489 return display_error_page(This);
492 hres = IXMLDOMDocument_transformNode(xml, (IXMLDOMNode*)xsl, &bstr);
493 IXMLDOMDocument3_Release(xsl);
494 IXMLDOMDocument3_Release(xml);
496 return display_error_page(This);
498 hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL);
501 return display_error_page(This);
504 hres = IStream_Write(This->stream, (BYTE*)bstr,
505 SysStringLen(bstr)*sizeof(WCHAR), NULL);
508 return display_error_page(This);
510 return report_data(This);
513 static HRESULT WINAPI XMLView_BindStatusCallback_OnDataAvailable(
514 IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize,
515 FORMATETC *pformatetc, STGMEDIUM *pstgmed)
517 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
522 TRACE("(%p)->(%x %d %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
528 hres = IStream_Read(pstgmed->u.pstm, buf, sizeof(buf), &size);
529 IStream_Write(This->stream, buf, size, &size);
530 } while(hres==S_OK && size);
532 if(FAILED(hres) && hres!=E_PENDING)
537 return handle_xml_load(This);
540 static HRESULT WINAPI XMLView_BindStatusCallback_OnObjectAvailable(
541 IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
543 BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
544 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), punk);
548 static IBindStatusCallbackVtbl XMLView_BindStatusCallbackVtbl = {
549 XMLView_BindStatusCallback_QueryInterface,
550 XMLView_BindStatusCallback_AddRef,
551 XMLView_BindStatusCallback_Release,
552 XMLView_BindStatusCallback_OnStartBinding,
553 XMLView_BindStatusCallback_GetPriority,
554 XMLView_BindStatusCallback_OnLowResource,
555 XMLView_BindStatusCallback_OnProgress,
556 XMLView_BindStatusCallback_OnStopBinding,
557 XMLView_BindStatusCallback_GetBindInfo,
558 XMLView_BindStatusCallback_OnDataAvailable,
559 XMLView_BindStatusCallback_OnObjectAvailable
562 static inline HRESULT XMLView_BindStatusCallback_Create(IBindStatusCallback *bsc_html,
563 IMoniker *mon, IStream *stream, IBindStatusCallback **ret)
565 BindStatusCallback *bsc;
567 bsc = heap_alloc_zero(sizeof(BindStatusCallback));
569 return E_OUTOFMEMORY;
571 bsc->IBindStatusCallback_iface.lpVtbl = &XMLView_BindStatusCallbackVtbl;
575 IBindStatusCallback_AddRef(bsc_html);
576 bsc->stream = stream;
577 IStream_AddRef(bsc->stream);
579 IMoniker_AddRef(mon);
581 *ret = &bsc->IBindStatusCallback_iface;
585 static inline Moniker* impl_from_IMoniker(IMoniker *iface)
587 return CONTAINING_RECORD(iface, Moniker, IMoniker_iface);
590 static HRESULT WINAPI XMLView_Moniker_QueryInterface(
591 IMoniker *iface, REFIID riid, void **ppvObject)
593 Moniker *This = impl_from_IMoniker(iface);
595 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
597 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IPersist)
598 || IsEqualGUID(riid, &IID_IPersistStream) || IsEqualGUID(riid, &IID_IMoniker)) {
600 IMoniker_AddRef(iface);
605 return E_NOINTERFACE;
608 static ULONG WINAPI XMLView_Moniker_AddRef(IMoniker *iface)
610 Moniker *This = impl_from_IMoniker(iface);
611 LONG ref = InterlockedIncrement(&This->ref);
613 TRACE("(%p)->(%d)\n", This, ref);
618 static ULONG WINAPI XMLView_Moniker_Release(IMoniker *iface)
620 Moniker *This = impl_from_IMoniker(iface);
621 ULONG ref = InterlockedDecrement(&This->ref);
623 TRACE("(%p)->(%d)\n", This, ref);
626 IMoniker_Release(This->mon);
632 static HRESULT WINAPI XMLView_Moniker_GetClassID(IMoniker *iface, CLSID *pClassID)
634 Moniker *This = impl_from_IMoniker(iface);
635 FIXME("(%p)->(%p)\n", This, pClassID);
639 static HRESULT WINAPI XMLView_Moniker_IsDirty(IMoniker *iface)
641 Moniker *This = impl_from_IMoniker(iface);
642 FIXME("(%p)\n", This);
646 static HRESULT WINAPI XMLView_Moniker_Load(IMoniker *iface, IStream *pStm)
648 Moniker *This = impl_from_IMoniker(iface);
649 FIXME("(%p)->(%p)\n", This, pStm);
653 static HRESULT WINAPI XMLView_Moniker_Save(IMoniker *iface,
654 IStream *pStm, BOOL fClearDirty)
656 Moniker *This = impl_from_IMoniker(iface);
657 FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty);
661 static HRESULT WINAPI XMLView_Moniker_GetSizeMax(
662 IMoniker *iface, ULARGE_INTEGER *pcbSize)
664 Moniker *This = impl_from_IMoniker(iface);
665 FIXME("(%p)->(%p)\n", This, pcbSize);
669 static HRESULT WINAPI XMLView_Moniker_BindToObject(IMoniker *iface, IBindCtx *pbc,
670 IMoniker *pmkToLeft, REFIID riidResult, void **ppvResult)
672 Moniker *This = impl_from_IMoniker(iface);
673 FIXME("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft,
674 debugstr_guid(riidResult), ppvResult);
678 static HRESULT WINAPI XMLView_Moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc,
679 IMoniker *pmkToLeft, REFIID riid, void **ppvObj)
681 Moniker *This = impl_from_IMoniker(iface);
683 TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj);
685 if(IsEqualGUID(riid, &IID_IStream)) {
689 *ppvObj = This->stream;
691 return S_ASYNCHRONOUS;
697 static HRESULT WINAPI XMLView_Moniker_Reduce(IMoniker *iface, IBindCtx *pbc,
698 DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced)
700 Moniker *This = impl_from_IMoniker(iface);
701 FIXME("(%p)->(%p %d %p %p)\n", This, pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced);
705 static HRESULT WINAPI XMLView_Moniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight,
706 BOOL fOnlyIfNotGeneric, IMoniker **ppmkComposite)
708 Moniker *This = impl_from_IMoniker(iface);
709 FIXME("(%p)->(%p %x %p)\n", This, pmkRight, fOnlyIfNotGeneric, ppmkComposite);
713 static HRESULT WINAPI XMLView_Moniker_Enum(IMoniker *iface,
714 BOOL fForward, IEnumMoniker **ppenumMoniker)
716 Moniker *This = impl_from_IMoniker(iface);
717 FIXME("(%p)->(%x %p)\n", This, fForward, ppenumMoniker);
721 static HRESULT WINAPI XMLView_Moniker_IsEqual(IMoniker *iface,
722 IMoniker *pmkOtherMoniker)
724 Moniker *This = impl_from_IMoniker(iface);
725 FIXME("(%p)->(%p)\n", This, pmkOtherMoniker);
729 static HRESULT WINAPI XMLView_Moniker_Hash(IMoniker *iface, DWORD *pdwHash)
731 Moniker *This = impl_from_IMoniker(iface);
732 FIXME("(%p)->(%p)\n", This, pdwHash);
736 static HRESULT WINAPI XMLView_Moniker_IsRunning(IMoniker *iface, IBindCtx *pbc,
737 IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning)
739 Moniker *This = impl_from_IMoniker(iface);
740 FIXME("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, pmkNewlyRunning);
744 static HRESULT WINAPI XMLView_Moniker_GetTimeOfLastChange(IMoniker *iface,
745 IBindCtx *pbc, IMoniker *pmkToLeft, FILETIME *pFileTime)
747 Moniker *This = impl_from_IMoniker(iface);
748 FIXME("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, pFileTime);
752 static HRESULT WINAPI XMLView_Moniker_Inverse(IMoniker *iface, IMoniker **ppmk)
754 Moniker *This = impl_from_IMoniker(iface);
755 FIXME("(%p)->(%p)\n", This, ppmk);
759 static HRESULT WINAPI XMLView_Moniker_CommonPrefixWith(IMoniker *iface,
760 IMoniker *pmkOther, IMoniker **ppmkPrefix)
762 Moniker *This = impl_from_IMoniker(iface);
763 FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkPrefix);
767 static HRESULT WINAPI XMLView_Moniker_RelativePathTo(IMoniker *iface,
768 IMoniker *pmkOther, IMoniker **ppmkRelPath)
770 Moniker *This = impl_from_IMoniker(iface);
771 FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkRelPath);
775 static HRESULT WINAPI XMLView_Moniker_GetDisplayName(IMoniker *iface,
776 IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName)
778 Moniker *This = impl_from_IMoniker(iface);
779 TRACE("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, ppszDisplayName);
780 return IMoniker_GetDisplayName(This->mon, pbc, pmkToLeft, ppszDisplayName);
783 static HRESULT WINAPI XMLView_Moniker_ParseDisplayName(IMoniker *iface,
784 IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR pszDisplayName,
785 ULONG *pchEaten, IMoniker **ppmkOut)
787 Moniker *This = impl_from_IMoniker(iface);
788 FIXME("(%p)->(%p %p %s %p %p)\n", This, pbc, pmkToLeft,
789 debugstr_w(pszDisplayName), pchEaten, ppmkOut);
793 static HRESULT WINAPI XMLView_Moniker_IsSystemMoniker(
794 IMoniker *iface, DWORD *pdwMksys)
796 Moniker *This = impl_from_IMoniker(iface);
797 FIXME("(%p)->(%p)\n", This, pdwMksys);
801 static IMonikerVtbl XMLView_MonikerVtbl = {
802 XMLView_Moniker_QueryInterface,
803 XMLView_Moniker_AddRef,
804 XMLView_Moniker_Release,
805 XMLView_Moniker_GetClassID,
806 XMLView_Moniker_IsDirty,
807 XMLView_Moniker_Load,
808 XMLView_Moniker_Save,
809 XMLView_Moniker_GetSizeMax,
810 XMLView_Moniker_BindToObject,
811 XMLView_Moniker_BindToStorage,
812 XMLView_Moniker_Reduce,
813 XMLView_Moniker_ComposeWith,
814 XMLView_Moniker_Enum,
815 XMLView_Moniker_IsEqual,
816 XMLView_Moniker_Hash,
817 XMLView_Moniker_IsRunning,
818 XMLView_Moniker_GetTimeOfLastChange,
819 XMLView_Moniker_Inverse,
820 XMLView_Moniker_CommonPrefixWith,
821 XMLView_Moniker_RelativePathTo,
822 XMLView_Moniker_GetDisplayName,
823 XMLView_Moniker_ParseDisplayName,
824 XMLView_Moniker_IsSystemMoniker
827 static inline HRESULT XMLView_Moniker_Create(IMoniker *mon,
828 IStream *stream, IMoniker **ret)
832 wrap = heap_alloc_zero(sizeof(Moniker));
834 return E_OUTOFMEMORY;
836 wrap->IMoniker_iface.lpVtbl = &XMLView_MonikerVtbl;
840 IMoniker_AddRef(mon);
841 wrap->stream = stream;
842 IStream_AddRef(stream);
844 *ret = &wrap->IMoniker_iface;
848 static inline XMLView* impl_from_IPersistMoniker(IPersistMoniker *iface)
850 return CONTAINING_RECORD(iface, XMLView, IPersistMoniker_iface);
853 static HRESULT WINAPI XMLView_PersistMoniker_QueryInterface(
854 IPersistMoniker *iface, REFIID riid, void **ppvObject)
856 XMLView *This = impl_from_IPersistMoniker(iface);
858 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
860 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IPersistMoniker))
861 *ppvObject = &This->IPersistMoniker_iface;
862 else if(IsEqualGUID(riid, &IID_IPersistHistory) ||
863 IsEqualGUID(riid, &IID_IPersist))
864 *ppvObject = &This->IPersistHistory_iface;
865 else if(IsEqualGUID(riid, &IID_IOleCommandTarget))
866 *ppvObject = &This->IOleCommandTarget_iface;
867 else if(IsEqualGUID(riid, &IID_IOleObject))
868 *ppvObject = &This->IOleObject_iface;
870 return IUnknown_QueryInterface(This->html_doc, riid, ppvObject);
872 IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
876 static ULONG WINAPI XMLView_PersistMoniker_AddRef(IPersistMoniker *iface)
878 XMLView *This = impl_from_IPersistMoniker(iface);
879 LONG ref = InterlockedIncrement(&This->ref);
881 TRACE("(%p)->(%d)\n", This, ref);
886 static ULONG WINAPI XMLView_PersistMoniker_Release(IPersistMoniker *iface)
888 XMLView *This = impl_from_IPersistMoniker(iface);
889 ULONG ref = InterlockedDecrement(&This->ref);
891 TRACE("(%p)->(%d)\n", This, ref);
895 IMoniker_Release(This->mon);
896 IUnknown_Release(This->html_doc);
902 static HRESULT WINAPI XMLView_PersistMoniker_GetClassID(
903 IPersistMoniker *iface, CLSID *pClassID)
905 XMLView *This = impl_from_IPersistMoniker(iface);
906 FIXME("(%p)->(%p)\n", This, pClassID);
910 static HRESULT WINAPI XMLView_PersistMoniker_IsDirty(IPersistMoniker *iface)
912 XMLView *This = impl_from_IPersistMoniker(iface);
913 FIXME("(%p)\n", This);
917 static HRESULT WINAPI XMLView_PersistMoniker_Load(IPersistMoniker *iface,
918 BOOL fFullyAvailable, IMoniker *pimkName, LPBC pibc, DWORD grfMode)
920 static const WCHAR XSLParametersW[] = {'X','S','L','P','a','r','a','m','e','t','e','r','s',0};
921 static const WCHAR XMLBufferStreamW[] = {'X','M','L','B','u','f','f','e','r','S','t','r','e','a','m',0};
922 static const WCHAR DWNBINDINFOW[] = {'_','_','D','W','N','B','I','N','D','I','N','F','O',0};
923 static const WCHAR HTMLLOADOPTIONSW[] = {'_','_','H','T','M','L','L','O','A','D','O','P','T','I','O','N','S',0};
924 static const WCHAR BSCBHolderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
926 XMLView *This = impl_from_IPersistMoniker(iface);
927 IPersistMoniker *html_persist_mon;
928 IBindStatusCallback *bsc, *bsc_html;
935 TRACE("(%p)->(%x %p %p %x)\n", This, fFullyAvailable, pimkName, pibc, grfMode);
937 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XSLParametersW, &unk);
938 if(SUCCEEDED(hres)) {
939 FIXME("ignoring XSLParameters\n");
940 IUnknown_Release(unk);
942 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XMLBufferStreamW, &unk);
943 if(SUCCEEDED(hres)) {
944 FIXME("ignoring XMLBufferStream\n");
945 IUnknown_Release(unk);
948 hres = CreateBindCtx(0, &bindctx);
952 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)DWNBINDINFOW, &unk);
953 if(SUCCEEDED(hres)) {
954 IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)DWNBINDINFOW, unk);
955 IUnknown_Release(unk);
957 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)HTMLLOADOPTIONSW, &unk);
958 if(SUCCEEDED(hres)) {
959 IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)HTMLLOADOPTIONSW, unk);
960 IUnknown_Release(unk);
962 hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk);
963 if(SUCCEEDED(hres)) {
964 IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, unk);
965 IUnknown_Release(unk);
968 hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
970 IBindCtx_Release(bindctx);
975 IMoniker_Release(This->mon);
976 This->mon = pimkName;
977 IMoniker_AddRef(This->mon);
979 hres = XMLView_Moniker_Create(This->mon, stream, &mon);
981 IStream_Release(stream);
982 IBindCtx_Release(bindctx);
986 hres = IUnknown_QueryInterface(This->html_doc,
987 &IID_IPersistMoniker, (void**)&html_persist_mon);
989 IMoniker_Release(mon);
990 IStream_Release(stream);
991 IBindCtx_Release(bindctx);
995 hres = IPersistMoniker_Load(html_persist_mon, FALSE, mon, bindctx, 0);
996 IPersistMoniker_Release(html_persist_mon);
997 IMoniker_Release(mon);
999 IStream_Release(stream);
1000 IBindCtx_Release(bindctx);
1004 hres = IBindCtx_GetObjectParam(bindctx, (LPOLESTR)BSCBHolderW, &unk);
1005 IBindCtx_Release(bindctx);
1007 IStream_Release(stream);
1010 hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc_html);
1011 IUnknown_Release(unk);
1013 IStream_Release(stream);
1017 hres = XMLView_BindStatusCallback_Create(bsc_html, This->mon, stream, &bsc);
1018 IStream_Release(stream);
1020 IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL);
1021 IBindStatusCallback_Release(bsc_html);
1025 hres = RegisterBindStatusCallback(pibc, bsc, NULL, 0);
1026 IBindStatusCallback_Release(bsc);
1028 IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL);
1029 IBindStatusCallback_Release(bsc_html);
1033 hres = IMoniker_BindToStorage(pimkName, pibc, NULL,
1034 &IID_IStream, (void**)&stream);
1036 IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL);
1037 IBindStatusCallback_Release(bsc_html);
1042 IStream_Release(stream);
1043 IBindStatusCallback_Release(bsc_html);
1047 static HRESULT WINAPI XMLView_PersistMoniker_Save(IPersistMoniker *iface,
1048 IMoniker *pimkName, LPBC pbc, BOOL fRemember)
1050 XMLView *This = impl_from_IPersistMoniker(iface);
1051 FIXME("(%p)->(%p %p %x)\n", This, pimkName, pbc, fRemember);
1055 static HRESULT WINAPI XMLView_PersistMoniker_SaveCompleted(
1056 IPersistMoniker *iface, IMoniker *pimkName, LPBC pibc)
1058 XMLView *This = impl_from_IPersistMoniker(iface);
1059 FIXME("(%p)->(%p %p)\n", This, pimkName, pibc);
1063 static HRESULT WINAPI XMLView_PersistMoniker_GetCurMoniker(
1064 IPersistMoniker *iface, IMoniker **ppimkName)
1066 XMLView *This = impl_from_IPersistMoniker(iface);
1067 FIXME("(%p)->(%p)\n", This, ppimkName);
1071 static IPersistMonikerVtbl XMLView_PersistMonikerVtbl = {
1072 XMLView_PersistMoniker_QueryInterface,
1073 XMLView_PersistMoniker_AddRef,
1074 XMLView_PersistMoniker_Release,
1075 XMLView_PersistMoniker_GetClassID,
1076 XMLView_PersistMoniker_IsDirty,
1077 XMLView_PersistMoniker_Load,
1078 XMLView_PersistMoniker_Save,
1079 XMLView_PersistMoniker_SaveCompleted,
1080 XMLView_PersistMoniker_GetCurMoniker
1083 static inline XMLView* impl_from_IPersistHistory(IPersistHistory *iface)
1085 return CONTAINING_RECORD(iface, XMLView, IPersistHistory_iface);
1088 static HRESULT WINAPI XMLView_PersistHistory_QueryInterface(
1089 IPersistHistory *iface, REFIID riid, void **ppvObject)
1091 XMLView *This = impl_from_IPersistHistory(iface);
1092 return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);
1095 static ULONG WINAPI XMLView_PersistHistory_AddRef(IPersistHistory *iface)
1097 XMLView *This = impl_from_IPersistHistory(iface);
1098 return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
1101 static ULONG WINAPI XMLView_PersistHistory_Release(IPersistHistory *iface)
1103 XMLView *This = impl_from_IPersistHistory(iface);
1104 return IPersistMoniker_Release(&This->IPersistMoniker_iface);
1107 static HRESULT WINAPI XMLView_PersistHistory_GetClassID(
1108 IPersistHistory *iface, CLSID *pClassID)
1110 XMLView *This = impl_from_IPersistHistory(iface);
1111 FIXME("(%p)->(%p)\n", This, pClassID);
1115 static HRESULT WINAPI XMLView_PersistHistory_LoadHistory(
1116 IPersistHistory *iface, IStream *pStream, IBindCtx *pbc)
1118 XMLView *This = impl_from_IPersistHistory(iface);
1119 FIXME("(%p)->(%p %p)\n", This, pStream, pbc);
1123 static HRESULT WINAPI XMLView_PersistHistory_SaveHistory(
1124 IPersistHistory *iface, IStream *pStream)
1126 XMLView *This = impl_from_IPersistHistory(iface);
1127 FIXME("(%p)->(%p)\n", This, pStream);
1131 static HRESULT WINAPI XMLView_PersistHistory_SetPositionCookie(
1132 IPersistHistory *iface, DWORD dwPositioncookie)
1134 XMLView *This = impl_from_IPersistHistory(iface);
1135 FIXME("(%p)->(%d)\n", This, dwPositioncookie);
1139 static HRESULT WINAPI XMLView_PersistHistory_GetPositionCookie(
1140 IPersistHistory *iface, DWORD *pdwPositioncookie)
1142 XMLView *This = impl_from_IPersistHistory(iface);
1143 FIXME("(%p)->(%p)\n", This, pdwPositioncookie);
1147 static IPersistHistoryVtbl XMLView_PersistHistoryVtbl = {
1148 XMLView_PersistHistory_QueryInterface,
1149 XMLView_PersistHistory_AddRef,
1150 XMLView_PersistHistory_Release,
1151 XMLView_PersistHistory_GetClassID,
1152 XMLView_PersistHistory_LoadHistory,
1153 XMLView_PersistHistory_SaveHistory,
1154 XMLView_PersistHistory_SetPositionCookie,
1155 XMLView_PersistHistory_GetPositionCookie
1158 static inline XMLView* impl_from_IOleCommandTarget(IOleCommandTarget *iface)
1160 return CONTAINING_RECORD(iface, XMLView, IOleCommandTarget_iface);
1163 static HRESULT WINAPI XMLView_OleCommandTarget_QueryInterface(
1164 IOleCommandTarget *iface, REFIID riid, void **ppvObject)
1166 XMLView *This = impl_from_IOleCommandTarget(iface);
1167 return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);
1170 static ULONG WINAPI XMLView_OleCommandTarget_AddRef(IOleCommandTarget *iface)
1172 XMLView *This = impl_from_IOleCommandTarget(iface);
1173 return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
1176 static ULONG WINAPI XMLView_OleCommandTarget_Release(IOleCommandTarget *iface)
1178 XMLView *This = impl_from_IOleCommandTarget(iface);
1179 return IPersistMoniker_Release(&This->IPersistMoniker_iface);
1182 static HRESULT WINAPI XMLView_OleCommandTarget_QueryStatus(IOleCommandTarget *iface,
1183 const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
1185 XMLView *This = impl_from_IOleCommandTarget(iface);
1186 FIXME("(%p)->(%p %x %p %p)\n", This, pguidCmdGroup, cCmds, prgCmds, pCmdText);
1190 static HRESULT WINAPI XMLView_OleCommandTarget_Exec(IOleCommandTarget *iface,
1191 const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt,
1192 VARIANT *pvaIn, VARIANT *pvaOut)
1194 XMLView *This = impl_from_IOleCommandTarget(iface);
1195 FIXME("(%p)->(%p %d %x %p %p)\n", This, pguidCmdGroup,
1196 nCmdID, nCmdexecopt, pvaIn, pvaOut);
1200 static IOleCommandTargetVtbl XMLView_OleCommandTargetVtbl = {
1201 XMLView_OleCommandTarget_QueryInterface,
1202 XMLView_OleCommandTarget_AddRef,
1203 XMLView_OleCommandTarget_Release,
1204 XMLView_OleCommandTarget_QueryStatus,
1205 XMLView_OleCommandTarget_Exec
1208 static inline XMLView* impl_from_IOleObject(IOleObject *iface)
1210 return CONTAINING_RECORD(iface, XMLView, IOleObject_iface);
1213 static HRESULT WINAPI XMLView_OleObject_QueryInterface(
1214 IOleObject *iface, REFIID riid, void **ppvObject)
1216 XMLView *This = impl_from_IOleObject(iface);
1217 return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);
1220 static ULONG WINAPI XMLView_OleObject_AddRef(IOleObject *iface)
1222 XMLView *This = impl_from_IOleObject(iface);
1223 return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);
1226 static ULONG WINAPI XMLView_OleObject_Release(IOleObject *iface)
1228 XMLView *This = impl_from_IOleObject(iface);
1229 return IPersistMoniker_Release(&This->IPersistMoniker_iface);
1232 static HRESULT WINAPI XMLView_OleObject_SetClientSite(
1233 IOleObject *iface, IOleClientSite *pClientSite)
1235 XMLView *This = impl_from_IOleObject(iface);
1236 FIXME("(%p)->(%p)\n", This, pClientSite);
1240 static HRESULT WINAPI XMLView_OleObject_GetClientSite(
1241 IOleObject *iface, IOleClientSite **ppClientSite)
1243 XMLView *This = impl_from_IOleObject(iface);
1244 FIXME("(%p)->(%p)\n", This, ppClientSite);
1248 static HRESULT WINAPI XMLView_OleObject_SetHostNames(IOleObject *iface,
1249 LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
1251 XMLView *This = impl_from_IOleObject(iface);
1252 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
1256 static HRESULT WINAPI XMLView_OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
1258 XMLView *This = impl_from_IOleObject(iface);
1259 FIXME("(%p)->(%x)\n", This, dwSaveOption);
1263 static HRESULT WINAPI XMLView_OleObject_SetMoniker(IOleObject *iface,
1264 DWORD dwWhichMoniker, IMoniker *pmk)
1266 XMLView *This = impl_from_IOleObject(iface);
1267 FIXME("(%p)->(%x %p)\n", This, dwWhichMoniker, pmk);
1271 static HRESULT WINAPI XMLView_OleObject_GetMoniker(IOleObject *iface,
1272 DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
1274 XMLView *This = impl_from_IOleObject(iface);
1275 FIXME("(%p)->(%x %x %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
1279 static HRESULT WINAPI XMLView_OleObject_InitFromData(IOleObject *iface,
1280 IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved)
1282 XMLView *This = impl_from_IOleObject(iface);
1283 FIXME("(%p)->(%p %x %x)\n", This, pDataObject, fCreation, dwReserved);
1287 static HRESULT WINAPI XMLView_OleObject_GetClipboardData(IOleObject *iface,
1288 DWORD dwReserved, IDataObject **ppDataObject)
1290 XMLView *This = impl_from_IOleObject(iface);
1291 FIXME("(%p)->(%x %p)\n", This, dwReserved, ppDataObject);
1295 static HRESULT WINAPI XMLView_OleObject_DoVerb(IOleObject *iface,
1296 LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
1297 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
1299 XMLView *This = impl_from_IOleObject(iface);
1300 FIXME("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg,
1301 pActiveSite, lindex, hwndParent, lprcPosRect);
1305 static HRESULT WINAPI XMLView_OleObject_EnumVerbs(
1306 IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
1308 XMLView *This = impl_from_IOleObject(iface);
1309 FIXME("(%p)->{%p)\n", This, ppEnumOleVerb);
1313 static HRESULT WINAPI XMLView_OleObject_Update(IOleObject *iface)
1315 XMLView *This = impl_from_IOleObject(iface);
1316 FIXME("(%p)\n", This);
1320 static HRESULT WINAPI XMLView_OleObject_IsUpToDate(IOleObject *iface)
1322 XMLView *This = impl_from_IOleObject(iface);
1323 FIXME("(%p)\n", This);
1327 static HRESULT WINAPI XMLView_OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
1329 XMLView *This = impl_from_IOleObject(iface);
1330 FIXME("(%p)->(%p)\n", This, pClsid);
1334 static HRESULT WINAPI XMLView_OleObject_GetUserType(IOleObject *iface,
1335 DWORD dwFormOfType, LPOLESTR *pszUserType)
1337 XMLView *This = impl_from_IOleObject(iface);
1338 FIXME("(%p)->(%x %p)\n", This, dwFormOfType, pszUserType);
1342 static HRESULT WINAPI XMLView_OleObject_SetExtent(IOleObject *iface,
1343 DWORD dwDrawAspect, SIZEL *psizel)
1345 XMLView *This = impl_from_IOleObject(iface);
1346 FIXME("(%p)->(%x %p)\n", This, dwDrawAspect, psizel);
1350 static HRESULT WINAPI XMLView_OleObject_GetExtent(IOleObject *iface,
1351 DWORD dwDrawAspect, SIZEL *psizel)
1353 XMLView *This = impl_from_IOleObject(iface);
1354 FIXME("(%p)->(%x %p)\n", This, dwDrawAspect, psizel);
1358 static HRESULT WINAPI XMLView_OleObject_Advise(IOleObject *iface,
1359 IAdviseSink *pAdvSink, DWORD *pdwConnection)
1361 XMLView *This = impl_from_IOleObject(iface);
1362 FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
1366 static HRESULT WINAPI XMLView_OleObject_Unadvise(
1367 IOleObject *iface, DWORD dwConnection)
1369 XMLView *This = impl_from_IOleObject(iface);
1370 FIXME("(%p)->(%d)\n", This, dwConnection);
1374 static HRESULT WINAPI XMLView_OleObject_EnumAdvise(
1375 IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
1377 XMLView *This = impl_from_IOleObject(iface);
1378 FIXME("(%p)->(%p)\n", This, ppenumAdvise);
1382 static HRESULT WINAPI XMLView_OleObject_GetMiscStatus(
1383 IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
1385 XMLView *This = impl_from_IOleObject(iface);
1386 FIXME("(%p)->(%d %p)\n", This, dwAspect, pdwStatus);
1390 static HRESULT WINAPI XMLView_OleObject_SetColorScheme(
1391 IOleObject *iface, LOGPALETTE *pLogpal)
1393 XMLView *This = impl_from_IOleObject(iface);
1394 FIXME("(%p)->(%p)\n", This, pLogpal);
1398 static IOleObjectVtbl XMLView_OleObjectVtbl = {
1399 XMLView_OleObject_QueryInterface,
1400 XMLView_OleObject_AddRef,
1401 XMLView_OleObject_Release,
1402 XMLView_OleObject_SetClientSite,
1403 XMLView_OleObject_GetClientSite,
1404 XMLView_OleObject_SetHostNames,
1405 XMLView_OleObject_Close,
1406 XMLView_OleObject_SetMoniker,
1407 XMLView_OleObject_GetMoniker,
1408 XMLView_OleObject_InitFromData,
1409 XMLView_OleObject_GetClipboardData,
1410 XMLView_OleObject_DoVerb,
1411 XMLView_OleObject_EnumVerbs,
1412 XMLView_OleObject_Update,
1413 XMLView_OleObject_IsUpToDate,
1414 XMLView_OleObject_GetUserClassID,
1415 XMLView_OleObject_GetUserType,
1416 XMLView_OleObject_SetExtent,
1417 XMLView_OleObject_GetExtent,
1418 XMLView_OleObject_Advise,
1419 XMLView_OleObject_Unadvise,
1420 XMLView_OleObject_EnumAdvise,
1421 XMLView_OleObject_GetMiscStatus,
1422 XMLView_OleObject_SetColorScheme
1426 HRESULT XMLView_create(IUnknown *outer, void **ppObj)
1431 TRACE("(%p %p)\n", outer, ppObj);
1436 This = heap_alloc_zero(sizeof(*This));
1438 return E_OUTOFMEMORY;
1440 This->IPersistMoniker_iface.lpVtbl = &XMLView_PersistMonikerVtbl;
1441 This->IPersistHistory_iface.lpVtbl = &XMLView_PersistHistoryVtbl;
1442 This->IOleCommandTarget_iface.lpVtbl = &XMLView_OleCommandTargetVtbl;
1443 This->IOleObject_iface.lpVtbl = &XMLView_OleObjectVtbl;
1446 hres = CoCreateInstance(&CLSID_HTMLDocument, (IUnknown*)&This->IPersistMoniker_iface,
1447 CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->html_doc);
1453 *ppObj = &This->IPersistMoniker_iface;
1457 HRESULT XMLView_create(IUnknown *outer, void **ppObj)
1459 MESSAGE("This program tried to use a XMLView object, but\n"
1460 "libxml2 support was not present at compile time.\n");