Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431/* * Copyright 2012 Piotr Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
#include <stdarg.h>
#define COBJMACROS#include "windef.h"#include "winbase.h"#include "ole2.h"#include "msxml6.h"#ifdef __REACTOS__#include <wingdi.h>#endif#include "mshtml.h"#include "mshtmhst.h"#include "perhist.h"#include "docobj.h"
#include "wine/debug.h"
#include "msxml_dispex.h"
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
typedef struct{ IPersistMoniker IPersistMoniker_iface; IPersistHistory IPersistHistory_iface; IOleCommandTarget IOleCommandTarget_iface; IOleObject IOleObject_iface;
LONG ref;
IUnknown *html_doc; IMoniker *mon;} XMLView;
typedef struct{ IMoniker IMoniker_iface; LONG ref; IMoniker *mon;
IStream *stream;} Moniker;
typedef struct{ IBindStatusCallback IBindStatusCallback_iface; LONG ref; IBindStatusCallback *bsc;
IMoniker *mon; IStream *stream;} BindStatusCallback;
typedef struct{ IBinding IBinding_iface; LONG ref; IBinding *binding;} Binding;
static inline Binding* impl_from_IBinding(IBinding *iface){ return CONTAINING_RECORD(iface, Binding, IBinding_iface);}
static HRESULT WINAPI XMLView_Binding_QueryInterface( IBinding *iface, REFIID riid, void **ppvObject){ Binding *This = impl_from_IBinding(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBinding)) { *ppvObject = iface; IBinding_AddRef(iface); return S_OK; }
*ppvObject = NULL; return E_NOINTERFACE;}
static ULONG WINAPI XMLView_Binding_AddRef(IBinding *iface){ Binding *This = impl_from_IBinding(iface); ULONG ref = InterlockedIncrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
return ref;}
static ULONG WINAPI XMLView_Binding_Release(IBinding *iface){ Binding *This = impl_from_IBinding(iface); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
if(!ref) { IBinding_Release(This->binding); free(This); } return ref;}
static HRESULT WINAPI XMLView_Binding_Abort(IBinding *iface){ Binding *This = impl_from_IBinding(iface); TRACE("(%p)\n", This);
return IBinding_Abort(This->binding);}
static HRESULT WINAPI XMLView_Binding_Suspend(IBinding *iface){ Binding *This = impl_from_IBinding(iface); FIXME("(%p)\n", This); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Binding_Resume(IBinding *iface){ Binding *This = impl_from_IBinding(iface); FIXME("(%p)\n", This); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Binding_SetPriority( IBinding *iface, LONG nPriority){ Binding *This = impl_from_IBinding(iface); TRACE("%p, %ld.\n", iface, nPriority);
return IBinding_SetPriority(This->binding, nPriority);}
static HRESULT WINAPI XMLView_Binding_GetPriority( IBinding *iface, LONG *pnPriority){ Binding *This = impl_from_IBinding(iface); TRACE("(%p)->(%p)\n", This, pnPriority);
return IBinding_GetPriority(This->binding, pnPriority);}
static HRESULT WINAPI XMLView_Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtocol, DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved){ Binding *This = impl_from_IBinding(iface); FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_guid(pclsidProtocol), pdwResult, pszResult, pdwReserved); return E_NOTIMPL;}
static IBindingVtbl XMLView_BindingVtbl = { XMLView_Binding_QueryInterface, XMLView_Binding_AddRef, XMLView_Binding_Release, XMLView_Binding_Abort, XMLView_Binding_Suspend, XMLView_Binding_Resume, XMLView_Binding_SetPriority, XMLView_Binding_GetPriority, XMLView_Binding_GetBindResult};
static inline HRESULT XMLView_Binding_Create(IBinding *binding, IBinding **ret){ Binding *bind;
bind = calloc(1, sizeof(Binding)); if(!bind) return E_OUTOFMEMORY;
bind->IBinding_iface.lpVtbl = &XMLView_BindingVtbl; bind->ref = 1;
bind->binding = binding; IBinding_AddRef(binding);
*ret = &bind->IBinding_iface; return S_OK;}
static inline BindStatusCallback* impl_from_IBindStatusCallback( IBindStatusCallback *iface){ return CONTAINING_RECORD(iface, BindStatusCallback, IBindStatusCallback_iface);}
static HRESULT WINAPI XMLView_BindStatusCallback_QueryInterface( IBindStatusCallback *iface, REFIID riid, void **ppvObject){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBindStatusCallback)) { *ppvObject = iface; IBindStatusCallback_AddRef(iface); return S_OK; }
*ppvObject = NULL; return E_NOINTERFACE;}
static ULONG WINAPI XMLView_BindStatusCallback_AddRef( IBindStatusCallback *iface){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); ULONG ref = InterlockedIncrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
return ref;}
static ULONG WINAPI XMLView_BindStatusCallback_Release( IBindStatusCallback *iface){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
if(!ref) { if(This->stream) IStream_Release(This->stream); IBindStatusCallback_Release(This->bsc); IMoniker_Release(This->mon); free(This); } return ref;}
static HRESULT WINAPI XMLView_BindStatusCallback_OnStartBinding( IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); IBinding *binding; HRESULT hres;
TRACE("%p, %lx, %p.\n", iface, dwReserved, pib);
hres = XMLView_Binding_Create(pib, &binding); if(FAILED(hres)) { IBinding_Abort(pib); return hres; }
hres = IBindStatusCallback_OnStartBinding(This->bsc, dwReserved, binding); if(FAILED(hres)) { IBinding_Abort(binding); return hres; }
IBinding_Release(binding); return hres;}
static HRESULT WINAPI XMLView_BindStatusCallback_GetPriority( IBindStatusCallback *iface, LONG *pnPriority){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); FIXME("(%p)->(%p)\n", This, pnPriority); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_BindStatusCallback_OnLowResource( IBindStatusCallback *iface, DWORD reserved){ FIXME("%p, %lx.\n", iface, reserved); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_BindStatusCallback_OnProgress( IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); TRACE("%p, %lu, %lu, %lu, %s.\n", iface, ulProgress, ulProgressMax, ulStatusCode, debugstr_w(szStatusText));
switch(ulStatusCode) { case BINDSTATUS_BEGINDOWNLOADDATA: return IBindStatusCallback_OnProgress(This->bsc, ulProgress, ulProgressMax, ulStatusCode, szStatusText); case BINDSTATUS_MIMETYPEAVAILABLE: return S_OK; default: FIXME("ulStatusCode: %lu\n", ulStatusCode); return E_NOTIMPL; }}
static HRESULT WINAPI XMLView_BindStatusCallback_OnStopBinding( IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); TRACE("%p, %#lx, %s.\n", iface, hresult, debugstr_w(szError)); return IBindStatusCallback_OnStopBinding(This->bsc, hresult, szError);}
static HRESULT WINAPI XMLView_BindStatusCallback_GetBindInfo( IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); return IBindStatusCallback_GetBindInfo(This->bsc, grfBINDF, pbindinfo);}
static inline HRESULT report_data(BindStatusCallback *This){ FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM}; STGMEDIUM stgmedium; LARGE_INTEGER off; ULARGE_INTEGER size; HRESULT hres;
off.QuadPart = 0; hres = IStream_Seek(This->stream, off, STREAM_SEEK_CUR, &size); if(FAILED(hres)) return hres;
hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL); if(FAILED(hres)) return hres;
stgmedium.tymed = TYMED_ISTREAM; stgmedium.pstm = This->stream; stgmedium.pUnkForRelease = NULL;
hres = IBindStatusCallback_OnDataAvailable(This->bsc, BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION, size.u.LowPart, &formatetc, &stgmedium);
IStream_Release(This->stream); This->stream = NULL; return hres;}
static inline HRESULT display_error_page(BindStatusCallback *This){ FIXME("Error page not implemented yet.\n"); return report_data(This);}
static inline HRESULT handle_xml_load(BindStatusCallback *This){ static const WCHAR selectW[] = {'p','r','o','c','e','s','s','i','n','g','-', 'i','n','s','t','r','u','c','t','i','o','n','(','\'','x','m','l', '-','s','t','y','l','e','s','h','e','e','t','\'',')',0}; static const WCHAR hrefW[] = {'h','r','e','f','=',0};
IXMLDOMDocument3 *xml = NULL, *xsl = NULL; IXMLDOMNode *stylesheet; IBindCtx *pbc; IMoniker *mon; LPOLESTR xsl_url; LARGE_INTEGER off; VARIANT_BOOL succ; VARIANT var; WCHAR *href = NULL, *p; BSTR bstr; HRESULT hres;
off.QuadPart = 0; hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL); if(FAILED(hres)) return display_error_page(This);
hres = dom_document_create(MSXML_DEFAULT, (void **)&xml); if(FAILED(hres)) return display_error_page(This);
V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)This->stream; hres = IXMLDOMDocument3_load(xml, var, &succ); if(FAILED(hres) || !succ) { IXMLDOMDocument3_Release(xml); return display_error_page(This); } V_VT(&var) = VT_EMPTY;
bstr = SysAllocString(selectW); hres = IXMLDOMDocument3_selectSingleNode(xml, bstr, &stylesheet); SysFreeString(bstr); if(hres != S_OK) { IXMLDOMDocument3_Release(xml); return display_error_page(This); }
hres = IXMLDOMNode_get_nodeValue(stylesheet, &var); IXMLDOMNode_Release(stylesheet); if(SUCCEEDED(hres) && V_VT(&var)!=VT_BSTR) { FIXME("Variant type %d not supported\n", V_VT(&var)); VariantClear(&var); hres = E_FAIL; } if(FAILED(hres)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); }
/* TODO: fix parsing processing instruction value */ if((p = wcsstr(V_BSTR(&var), hrefW))) { p += ARRAY_SIZE(hrefW) - 1; if(*p!='\'' && *p!='\"') p = NULL; else { href = p+1; p = wcschr(href, *p); } } if(p) { *p = 0; } else { VariantClear(&var); IXMLDOMDocument3_Release(xml); return display_error_page(This); }
hres = CreateURLMonikerEx(This->mon, href, &mon, 0); VariantClear(&var); if(FAILED(hres)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); }
hres = CreateBindCtx(0, &pbc); if(SUCCEEDED(hres)) { hres = IMoniker_GetDisplayName(mon, pbc, NULL, &xsl_url); IMoniker_Release(mon); IBindCtx_Release(pbc); } if(FAILED(hres)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); }
V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(xsl_url); CoTaskMemFree(xsl_url); if(!V_BSTR(&var)) { IXMLDOMDocument3_Release(xml); return display_error_page(This); }
hres = dom_document_create(MSXML_DEFAULT, (void **)&xsl); if(FAILED(hres)) { VariantClear(&var); IXMLDOMDocument3_Release(xml); return display_error_page(This); }
/* TODO: do the binding asynchronously */ hres = IXMLDOMDocument3_load(xsl, var, &succ); VariantClear(&var); if(FAILED(hres) || !succ) { IXMLDOMDocument3_Release(xsl); IXMLDOMDocument3_Release(xml); return display_error_page(This); }
hres = IXMLDOMDocument3_transformNode(xml, (IXMLDOMNode*)xsl, &bstr); IXMLDOMDocument3_Release(xsl); IXMLDOMDocument3_Release(xml); if(FAILED(hres)) return display_error_page(This);
hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL); if(FAILED(hres)) { SysFreeString(bstr); return display_error_page(This); }
hres = IStream_Write(This->stream, (BYTE*)bstr, SysStringLen(bstr)*sizeof(WCHAR), NULL); SysFreeString(bstr); if(FAILED(hres)) return display_error_page(This);
return report_data(This);}
static HRESULT WINAPI XMLView_BindStatusCallback_OnDataAvailable( IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); char buf[1024]; DWORD size; HRESULT hres;
TRACE("%p, %lx, %ld, %p, %p.\n", iface, grfBSCF, dwSize, pformatetc, pstgmed);
if(!This->stream) return E_FAIL;
do { hres = IStream_Read(pstgmed->pstm, buf, sizeof(buf), &size); IStream_Write(This->stream, buf, size, &size); } while(hres==S_OK && size);
if(FAILED(hres) && hres!=E_PENDING) return hres; if(hres != S_FALSE) return S_OK;
return handle_xml_load(This);}
static HRESULT WINAPI XMLView_BindStatusCallback_OnObjectAvailable( IBindStatusCallback *iface, REFIID riid, IUnknown *punk){ BindStatusCallback *This = impl_from_IBindStatusCallback(iface); FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), punk); return E_NOTIMPL;}
static IBindStatusCallbackVtbl XMLView_BindStatusCallbackVtbl = { XMLView_BindStatusCallback_QueryInterface, XMLView_BindStatusCallback_AddRef, XMLView_BindStatusCallback_Release, XMLView_BindStatusCallback_OnStartBinding, XMLView_BindStatusCallback_GetPriority, XMLView_BindStatusCallback_OnLowResource, XMLView_BindStatusCallback_OnProgress, XMLView_BindStatusCallback_OnStopBinding, XMLView_BindStatusCallback_GetBindInfo, XMLView_BindStatusCallback_OnDataAvailable, XMLView_BindStatusCallback_OnObjectAvailable};
static inline HRESULT XMLView_BindStatusCallback_Create(IBindStatusCallback *bsc_html, IMoniker *mon, IStream *stream, IBindStatusCallback **ret){ BindStatusCallback *bsc;
bsc = calloc(1, sizeof(BindStatusCallback)); if(!bsc) return E_OUTOFMEMORY;
bsc->IBindStatusCallback_iface.lpVtbl = &XMLView_BindStatusCallbackVtbl; bsc->ref = 1;
bsc->bsc = bsc_html; IBindStatusCallback_AddRef(bsc_html); bsc->stream = stream; IStream_AddRef(bsc->stream); bsc->mon = mon; IMoniker_AddRef(mon);
*ret = &bsc->IBindStatusCallback_iface; return S_OK;}
static inline Moniker* impl_from_IMoniker(IMoniker *iface){ return CONTAINING_RECORD(iface, Moniker, IMoniker_iface);}
static HRESULT WINAPI XMLView_Moniker_QueryInterface( IMoniker *iface, REFIID riid, void **ppvObject){ Moniker *This = impl_from_IMoniker(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IPersist) || IsEqualGUID(riid, &IID_IPersistStream) || IsEqualGUID(riid, &IID_IMoniker)) { *ppvObject = iface; IMoniker_AddRef(iface); return S_OK; }
*ppvObject = NULL; return E_NOINTERFACE;}
static ULONG WINAPI XMLView_Moniker_AddRef(IMoniker *iface){ Moniker *This = impl_from_IMoniker(iface); LONG ref = InterlockedIncrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
return ref;}
static ULONG WINAPI XMLView_Moniker_Release(IMoniker *iface){ Moniker *This = impl_from_IMoniker(iface); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
if(!ref) { IMoniker_Release(This->mon); free(This); } return ref;}
static HRESULT WINAPI XMLView_Moniker_GetClassID(IMoniker *iface, CLSID *pClassID){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pClassID); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_IsDirty(IMoniker *iface){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)\n", This); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_Load(IMoniker *iface, IStream *pStm){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pStm); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_Save(IMoniker *iface, IStream *pStm, BOOL fClearDirty){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_GetSizeMax( IMoniker *iface, ULARGE_INTEGER *pcbSize){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pcbSize); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_BindToObject(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riidResult, void **ppvResult){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riidResult), ppvResult); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppvObj){ Moniker *This = impl_from_IMoniker(iface);
TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj);
if(IsEqualGUID(riid, &IID_IStream)) { if(!This->stream) return E_FAIL;
*ppvObj = This->stream; This->stream = NULL; return S_ASYNCHRONOUS; }
return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced){ FIXME("%p, %p, %ld, %p, %p.\n", iface, pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight, BOOL fOnlyIfNotGeneric, IMoniker **ppmkComposite){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %x %p)\n", This, pmkRight, fOnlyIfNotGeneric, ppmkComposite); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_Enum(IMoniker *iface, BOOL fForward, IEnumMoniker **ppenumMoniker){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%x %p)\n", This, fForward, ppenumMoniker); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pmkOtherMoniker); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_Hash(IMoniker *iface, DWORD *pdwHash){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pdwHash); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_IsRunning(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, pmkNewlyRunning); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_GetTimeOfLastChange(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, FILETIME *pFileTime){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, pFileTime); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_Inverse(IMoniker *iface, IMoniker **ppmk){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, ppmk); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_CommonPrefixWith(IMoniker *iface, IMoniker *pmkOther, IMoniker **ppmkPrefix){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkPrefix); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_RelativePathTo(IMoniker *iface, IMoniker *pmkOther, IMoniker **ppmkRelPath){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkRelPath); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName){ Moniker *This = impl_from_IMoniker(iface); TRACE("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, ppszDisplayName); return IMoniker_GetDisplayName(This->mon, pbc, pmkToLeft, ppszDisplayName);}
static HRESULT WINAPI XMLView_Moniker_ParseDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p %s %p %p)\n", This, pbc, pmkToLeft, debugstr_w(pszDisplayName), pchEaten, ppmkOut); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_Moniker_IsSystemMoniker( IMoniker *iface, DWORD *pdwMksys){ Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pdwMksys); return E_NOTIMPL;}
static IMonikerVtbl XMLView_MonikerVtbl = { XMLView_Moniker_QueryInterface, XMLView_Moniker_AddRef, XMLView_Moniker_Release, XMLView_Moniker_GetClassID, XMLView_Moniker_IsDirty, XMLView_Moniker_Load, XMLView_Moniker_Save, XMLView_Moniker_GetSizeMax, XMLView_Moniker_BindToObject, XMLView_Moniker_BindToStorage, XMLView_Moniker_Reduce, XMLView_Moniker_ComposeWith, XMLView_Moniker_Enum, XMLView_Moniker_IsEqual, XMLView_Moniker_Hash, XMLView_Moniker_IsRunning, XMLView_Moniker_GetTimeOfLastChange, XMLView_Moniker_Inverse, XMLView_Moniker_CommonPrefixWith, XMLView_Moniker_RelativePathTo, XMLView_Moniker_GetDisplayName, XMLView_Moniker_ParseDisplayName, XMLView_Moniker_IsSystemMoniker};
static inline HRESULT XMLView_Moniker_Create(IMoniker *mon, IStream *stream, IMoniker **ret){ Moniker *wrap;
wrap = calloc(1, sizeof(Moniker)); if(!wrap) return E_OUTOFMEMORY;
wrap->IMoniker_iface.lpVtbl = &XMLView_MonikerVtbl; wrap->ref = 1;
wrap->mon = mon; IMoniker_AddRef(mon); wrap->stream = stream; IStream_AddRef(stream);
*ret = &wrap->IMoniker_iface; return S_OK;}
static inline XMLView* impl_from_IPersistMoniker(IPersistMoniker *iface){ return CONTAINING_RECORD(iface, XMLView, IPersistMoniker_iface);}
static HRESULT WINAPI XMLView_PersistMoniker_QueryInterface( IPersistMoniker *iface, REFIID riid, void **ppvObject){ XMLView *This = impl_from_IPersistMoniker(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IPersistMoniker)) *ppvObject = &This->IPersistMoniker_iface; else if(IsEqualGUID(riid, &IID_IPersistHistory) || IsEqualGUID(riid, &IID_IPersist)) *ppvObject = &This->IPersistHistory_iface; else if(IsEqualGUID(riid, &IID_IOleCommandTarget)) *ppvObject = &This->IOleCommandTarget_iface; else if(IsEqualGUID(riid, &IID_IOleObject)) *ppvObject = &This->IOleObject_iface; else return IUnknown_QueryInterface(This->html_doc, riid, ppvObject);
IPersistMoniker_AddRef(&This->IPersistMoniker_iface); return S_OK;}
static ULONG WINAPI XMLView_PersistMoniker_AddRef(IPersistMoniker *iface){ XMLView *This = impl_from_IPersistMoniker(iface); ULONG ref = InterlockedIncrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
return ref;}
static ULONG WINAPI XMLView_PersistMoniker_Release(IPersistMoniker *iface){ XMLView *This = impl_from_IPersistMoniker(iface); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("%p, refcount %lu.\n", iface, ref);
if(!ref) { if(This->mon) IMoniker_Release(This->mon); IUnknown_Release(This->html_doc); free(This); } return ref;}
static HRESULT WINAPI XMLView_PersistMoniker_GetClassID( IPersistMoniker *iface, CLSID *pClassID){ XMLView *This = impl_from_IPersistMoniker(iface); FIXME("(%p)->(%p)\n", This, pClassID); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistMoniker_IsDirty(IPersistMoniker *iface){ XMLView *This = impl_from_IPersistMoniker(iface); FIXME("(%p)\n", This); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAvailable, IMoniker *pimkName, LPBC pibc, DWORD grfMode){ static const WCHAR XSLParametersW[] = {'X','S','L','P','a','r','a','m','e','t','e','r','s',0}; static const WCHAR XMLBufferStreamW[] = {'X','M','L','B','u','f','f','e','r','S','t','r','e','a','m',0}; static const WCHAR DWNBINDINFOW[] = {'_','_','D','W','N','B','I','N','D','I','N','F','O',0}; static const WCHAR HTMLLOADOPTIONSW[] = {'_','_','H','T','M','L','L','O','A','D','O','P','T','I','O','N','S',0}; static const WCHAR BSCBHolderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
XMLView *This = impl_from_IPersistMoniker(iface); IPersistMoniker *html_persist_mon; IBindStatusCallback *bsc, *bsc_html; IBindCtx *bindctx; IStream *stream; IMoniker *mon; IUnknown *unk; HRESULT hres;
TRACE("%p, %x, %p, %p, %lx.\n", iface, fFullyAvailable, pimkName, pibc, grfMode);
hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XSLParametersW, &unk); if(SUCCEEDED(hres)) { FIXME("ignoring XSLParameters\n"); IUnknown_Release(unk); } hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XMLBufferStreamW, &unk); if(SUCCEEDED(hres)) { FIXME("ignoring XMLBufferStream\n"); IUnknown_Release(unk); }
hres = CreateBindCtx(0, &bindctx); if(FAILED(hres)) return hres;
hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)DWNBINDINFOW, &unk); if(SUCCEEDED(hres)) { IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)DWNBINDINFOW, unk); IUnknown_Release(unk); } hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)HTMLLOADOPTIONSW, &unk); if(SUCCEEDED(hres)) { IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)HTMLLOADOPTIONSW, unk); IUnknown_Release(unk); } hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk); if(SUCCEEDED(hres)) { IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, unk); IUnknown_Release(unk); }
hres = CreateStreamOnHGlobal(NULL, TRUE, &stream); if(FAILED(hres)) { IBindCtx_Release(bindctx); return hres; }
if(This->mon) IMoniker_Release(This->mon); This->mon = pimkName; IMoniker_AddRef(This->mon);
hres = XMLView_Moniker_Create(This->mon, stream, &mon); if(FAILED(hres)) { IStream_Release(stream); IBindCtx_Release(bindctx); return hres; }
hres = IUnknown_QueryInterface(This->html_doc, &IID_IPersistMoniker, (void**)&html_persist_mon); if(FAILED(hres)) { IMoniker_Release(mon); IStream_Release(stream); IBindCtx_Release(bindctx); return hres; }
hres = IPersistMoniker_Load(html_persist_mon, FALSE, mon, bindctx, 0); IPersistMoniker_Release(html_persist_mon); IMoniker_Release(mon); if(FAILED(hres)) { IStream_Release(stream); IBindCtx_Release(bindctx); return hres; }
hres = IBindCtx_GetObjectParam(bindctx, (LPOLESTR)BSCBHolderW, &unk); IBindCtx_Release(bindctx); if(FAILED(hres)) { IStream_Release(stream); return hres; } hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc_html); IUnknown_Release(unk); if(FAILED(hres)) { IStream_Release(stream); return hres; }
hres = XMLView_BindStatusCallback_Create(bsc_html, This->mon, stream, &bsc); IStream_Release(stream); if(FAILED(hres)) { IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL); IBindStatusCallback_Release(bsc_html); return hres; }
hres = RegisterBindStatusCallback(pibc, bsc, NULL, 0); IBindStatusCallback_Release(bsc); if(FAILED(hres)) { IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL); IBindStatusCallback_Release(bsc_html); return hres; }
hres = IMoniker_BindToStorage(pimkName, pibc, NULL, &IID_IStream, (void**)&stream); if(FAILED(hres)) { IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL); IBindStatusCallback_Release(bsc_html); return hres; }
if(stream) IStream_Release(stream); IBindStatusCallback_Release(bsc_html); return S_OK;}
static HRESULT WINAPI XMLView_PersistMoniker_Save(IPersistMoniker *iface, IMoniker *pimkName, LPBC pbc, BOOL fRemember){ XMLView *This = impl_from_IPersistMoniker(iface); FIXME("(%p)->(%p %p %x)\n", This, pimkName, pbc, fRemember); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistMoniker_SaveCompleted( IPersistMoniker *iface, IMoniker *pimkName, LPBC pibc){ XMLView *This = impl_from_IPersistMoniker(iface); FIXME("(%p)->(%p %p)\n", This, pimkName, pibc); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistMoniker_GetCurMoniker( IPersistMoniker *iface, IMoniker **ppimkName){ XMLView *This = impl_from_IPersistMoniker(iface); FIXME("(%p)->(%p)\n", This, ppimkName); return E_NOTIMPL;}
static IPersistMonikerVtbl XMLView_PersistMonikerVtbl = { XMLView_PersistMoniker_QueryInterface, XMLView_PersistMoniker_AddRef, XMLView_PersistMoniker_Release, XMLView_PersistMoniker_GetClassID, XMLView_PersistMoniker_IsDirty, XMLView_PersistMoniker_Load, XMLView_PersistMoniker_Save, XMLView_PersistMoniker_SaveCompleted, XMLView_PersistMoniker_GetCurMoniker};
static inline XMLView* impl_from_IPersistHistory(IPersistHistory *iface){ return CONTAINING_RECORD(iface, XMLView, IPersistHistory_iface);}
static HRESULT WINAPI XMLView_PersistHistory_QueryInterface( IPersistHistory *iface, REFIID riid, void **ppvObject){ XMLView *This = impl_from_IPersistHistory(iface); return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);}
static ULONG WINAPI XMLView_PersistHistory_AddRef(IPersistHistory *iface){ XMLView *This = impl_from_IPersistHistory(iface); return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);}
static ULONG WINAPI XMLView_PersistHistory_Release(IPersistHistory *iface){ XMLView *This = impl_from_IPersistHistory(iface); return IPersistMoniker_Release(&This->IPersistMoniker_iface);}
static HRESULT WINAPI XMLView_PersistHistory_GetClassID( IPersistHistory *iface, CLSID *pClassID){ XMLView *This = impl_from_IPersistHistory(iface); FIXME("(%p)->(%p)\n", This, pClassID); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistHistory_LoadHistory( IPersistHistory *iface, IStream *pStream, IBindCtx *pbc){ XMLView *This = impl_from_IPersistHistory(iface); FIXME("(%p)->(%p %p)\n", This, pStream, pbc); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistHistory_SaveHistory( IPersistHistory *iface, IStream *pStream){ XMLView *This = impl_from_IPersistHistory(iface); FIXME("(%p)->(%p)\n", This, pStream); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistHistory_SetPositionCookie( IPersistHistory *iface, DWORD dwPositioncookie){ FIXME("%p, %ld.\n", iface, dwPositioncookie); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_PersistHistory_GetPositionCookie( IPersistHistory *iface, DWORD *pdwPositioncookie){ XMLView *This = impl_from_IPersistHistory(iface); FIXME("(%p)->(%p)\n", This, pdwPositioncookie); return E_NOTIMPL;}
static IPersistHistoryVtbl XMLView_PersistHistoryVtbl = { XMLView_PersistHistory_QueryInterface, XMLView_PersistHistory_AddRef, XMLView_PersistHistory_Release, XMLView_PersistHistory_GetClassID, XMLView_PersistHistory_LoadHistory, XMLView_PersistHistory_SaveHistory, XMLView_PersistHistory_SetPositionCookie, XMLView_PersistHistory_GetPositionCookie};
static inline XMLView* impl_from_IOleCommandTarget(IOleCommandTarget *iface){ return CONTAINING_RECORD(iface, XMLView, IOleCommandTarget_iface);}
static HRESULT WINAPI XMLView_OleCommandTarget_QueryInterface( IOleCommandTarget *iface, REFIID riid, void **ppvObject){ XMLView *This = impl_from_IOleCommandTarget(iface); return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);}
static ULONG WINAPI XMLView_OleCommandTarget_AddRef(IOleCommandTarget *iface){ XMLView *This = impl_from_IOleCommandTarget(iface); return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);}
static ULONG WINAPI XMLView_OleCommandTarget_Release(IOleCommandTarget *iface){ XMLView *This = impl_from_IOleCommandTarget(iface); return IPersistMoniker_Release(&This->IPersistMoniker_iface);}
static HRESULT WINAPI XMLView_OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText){ FIXME("%p, %p, %lu, %p, %p.\n", iface, pguidCmdGroup, cCmds, prgCmds, pCmdText); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut){ FIXME("%p, %p, %ld, %lx, %p, %p.\n", iface, pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); return E_NOTIMPL;}
static IOleCommandTargetVtbl XMLView_OleCommandTargetVtbl = { XMLView_OleCommandTarget_QueryInterface, XMLView_OleCommandTarget_AddRef, XMLView_OleCommandTarget_Release, XMLView_OleCommandTarget_QueryStatus, XMLView_OleCommandTarget_Exec};
static inline XMLView* impl_from_IOleObject(IOleObject *iface){ return CONTAINING_RECORD(iface, XMLView, IOleObject_iface);}
static HRESULT WINAPI XMLView_OleObject_QueryInterface( IOleObject *iface, REFIID riid, void **ppvObject){ XMLView *This = impl_from_IOleObject(iface); return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject);}
static ULONG WINAPI XMLView_OleObject_AddRef(IOleObject *iface){ XMLView *This = impl_from_IOleObject(iface); return IPersistMoniker_AddRef(&This->IPersistMoniker_iface);}
static ULONG WINAPI XMLView_OleObject_Release(IOleObject *iface){ XMLView *This = impl_from_IOleObject(iface); return IPersistMoniker_Release(&This->IPersistMoniker_iface);}
static HRESULT WINAPI XMLView_OleObject_SetClientSite( IOleObject *iface, IOleClientSite *pClientSite){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->(%p)\n", This, pClientSite); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_GetClientSite( IOleObject *iface, IOleClientSite **ppClientSite){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->(%p)\n", This, ppClientSite); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj)); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_Close(IOleObject *iface, DWORD dwSaveOption){ FIXME("%p, %lx.\n", iface, dwSaveOption); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk){ FIXME("%p, %lx, %p.\n", iface, dwWhichMoniker, pmk); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk){ FIXME("%p, %lx, %lx, %p.\n", iface, dwAssign, dwWhichMoniker, ppmk); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved){ FIXME("%p, %p, %x, %lx.\n", iface, pDataObject, fCreation, dwReserved); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject){ FIXME("%p, %lx, %p.\n", iface, dwReserved, ppDataObject); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect){ FIXME("%p, %ld, %p, %p, %ld, %p, %p.\n", iface, iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_EnumVerbs( IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->{%p)\n", This, ppEnumOleVerb); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_Update(IOleObject *iface){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)\n", This); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_IsUpToDate(IOleObject *iface){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)\n", This); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->(%p)\n", This, pClsid); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType){ FIXME("%p, %lx, %p.\n", iface, dwFormOfType, pszUserType); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel){ FIXME("%p, %lx, %p.\n", iface, dwDrawAspect, psizel); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel){ FIXME("%p, %lx, %p.\n", iface, dwDrawAspect, psizel); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_Unadvise( IOleObject *iface, DWORD dwConnection){ FIXME("%p, %ld.\n", iface, dwConnection); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_EnumAdvise( IOleObject *iface, IEnumSTATDATA **ppenumAdvise){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->(%p)\n", This, ppenumAdvise); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_GetMiscStatus( IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus){ FIXME("%p, %ld, %p.\n", iface, dwAspect, pdwStatus); return E_NOTIMPL;}
static HRESULT WINAPI XMLView_OleObject_SetColorScheme( IOleObject *iface, LOGPALETTE *pLogpal){ XMLView *This = impl_from_IOleObject(iface); FIXME("(%p)->(%p)\n", This, pLogpal); return E_NOTIMPL;}
static IOleObjectVtbl XMLView_OleObjectVtbl = { XMLView_OleObject_QueryInterface, XMLView_OleObject_AddRef, XMLView_OleObject_Release, XMLView_OleObject_SetClientSite, XMLView_OleObject_GetClientSite, XMLView_OleObject_SetHostNames, XMLView_OleObject_Close, XMLView_OleObject_SetMoniker, XMLView_OleObject_GetMoniker, XMLView_OleObject_InitFromData, XMLView_OleObject_GetClipboardData, XMLView_OleObject_DoVerb, XMLView_OleObject_EnumVerbs, XMLView_OleObject_Update, XMLView_OleObject_IsUpToDate, XMLView_OleObject_GetUserClassID, XMLView_OleObject_GetUserType, XMLView_OleObject_SetExtent, XMLView_OleObject_GetExtent, XMLView_OleObject_Advise, XMLView_OleObject_Unadvise, XMLView_OleObject_EnumAdvise, XMLView_OleObject_GetMiscStatus, XMLView_OleObject_SetColorScheme};
HRESULT XMLView_create(void **ppObj){ XMLView *This; HRESULT hres;
TRACE("(%p)\n", ppObj);
This = calloc(1, sizeof(*This)); if(!This) return E_OUTOFMEMORY;
This->IPersistMoniker_iface.lpVtbl = &XMLView_PersistMonikerVtbl; This->IPersistHistory_iface.lpVtbl = &XMLView_PersistHistoryVtbl; This->IOleCommandTarget_iface.lpVtbl = &XMLView_OleCommandTargetVtbl; This->IOleObject_iface.lpVtbl = &XMLView_OleObjectVtbl; This->ref = 1;
hres = CoCreateInstance(&CLSID_HTMLDocument, (IUnknown*)&This->IPersistMoniker_iface, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->html_doc); if(FAILED(hres)) { free(This); return hres; }
*ppObj = &This->IPersistMoniker_iface; return S_OK;}