| /* |
| * 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 "config.h" |
| |
| #include <stdarg.h> |
| |
| #define COBJMACROS |
| #define NONAMELESSUNION |
| |
| #ifdef HAVE_LIBXML2 |
| #include <libxml/parser.h> |
| #endif |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "ole2.h" |
| #include "msxml6.h" |
| #include "mshtml.h" |
| #include "mshtmhst.h" |
| #include "perhist.h" |
| #include "docobj.h" |
| |
| #include "wine/debug.h" |
| |
| #include "msxml_private.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(msxml); |
| |
| #ifdef HAVE_LIBXML2 |
| |
| 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); |
| LONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p)->(%d)\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI XMLView_Binding_Release(IBinding *iface) |
| { |
| Binding *This = impl_from_IBinding(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p)->(%d)\n", This, ref); |
| |
| if(!ref) { |
| IBinding_Release(This->binding); |
| heap_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)->(%d)\n", This, 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 = heap_alloc_zero(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); |
| LONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p)->(%d)\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI XMLView_BindStatusCallback_Release( |
| IBindStatusCallback *iface) |
| { |
| BindStatusCallback *This = impl_from_IBindStatusCallback(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p)->(%d)\n", This, ref); |
| |
| if(!ref) { |
| if(This->stream) |
| IStream_Release(This->stream); |
| IBindStatusCallback_Release(This->bsc); |
| IMoniker_Release(This->mon); |
| heap_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)->(%x %p)\n", This, 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) |
| { |
| BindStatusCallback *This = impl_from_IBindStatusCallback(iface); |
| FIXME("(%p)->(%x)\n", This, 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)->(%d %d %x %s)\n", This, 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: %d\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)->(%x %s)\n", This, 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; |
| |
| hres = IStream_Seek(This->stream, off, STREAM_SEEK_CUR, &size); |
| if(FAILED(hres)) |
| return hres; |
| |
| off.QuadPart = 0; |
| hres = IStream_Seek(This->stream, off, STREAM_SEEK_SET, NULL); |
| if(FAILED(hres)) |
| return hres; |
| |
| stgmedium.tymed = TYMED_ISTREAM; |
| stgmedium.u.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 = DOMDocument_create(MSXML_DEFAULT, NULL, (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 = strstrW(V_BSTR(&var), hrefW))) { |
| p += sizeof(hrefW)/sizeof(WCHAR)-1; |
| if(*p!='\'' && *p!='\"') p = NULL; |
| else { |
| href = p+1; |
| p = strchrW(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 = DOMDocument_create(MSXML_DEFAULT, NULL, (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 = IXMLDOMDocument_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)->(%x %d %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed); |
| |
| if(!This->stream) |
| return E_FAIL; |
| |
| do { |
| hres = IStream_Read(pstgmed->u.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 = heap_alloc_zero(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)->(%d)\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI XMLView_Moniker_Release(IMoniker *iface) |
| { |
| Moniker *This = impl_from_IMoniker(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p)->(%d)\n", This, ref); |
| |
| if(!ref) { |
| IMoniker_Release(This->mon); |
| heap_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) |
| { |
| Moniker *This = impl_from_IMoniker(iface); |
| FIXME("(%p)->(%p %d %p %p)\n", This, 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 = heap_alloc_zero(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); |
| LONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p)->(%d)\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI XMLView_PersistMoniker_Release(IPersistMoniker *iface) |
| { |
| XMLView *This = impl_from_IPersistMoniker(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p)->(%d)\n", This, ref); |
| |
| if(!ref) { |
| if(This->mon) |
| IMoniker_Release(This->mon); |
| IUnknown_Release(This->html_doc); |
| heap_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 %x)\n", This, 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) |
| { |
| XMLView *This = impl_from_IPersistHistory(iface); |
| FIXME("(%p)->(%d)\n", This, 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) |
| { |
| XMLView *This = impl_from_IOleCommandTarget(iface); |
| FIXME("(%p)->(%p %x %p %p)\n", This, 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) |
| { |
| XMLView *This = impl_from_IOleCommandTarget(iface); |
| FIXME("(%p)->(%p %d %x %p %p)\n", This, 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) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%x)\n", This, dwSaveOption); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI XMLView_OleObject_SetMoniker(IOleObject *iface, |
| DWORD dwWhichMoniker, IMoniker *pmk) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%x %p)\n", This, dwWhichMoniker, pmk); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI XMLView_OleObject_GetMoniker(IOleObject *iface, |
| DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%x %x %p)\n", This, dwAssign, dwWhichMoniker, ppmk); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI XMLView_OleObject_InitFromData(IOleObject *iface, |
| IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%p %x %x)\n", This, pDataObject, fCreation, dwReserved); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI XMLView_OleObject_GetClipboardData(IOleObject *iface, |
| DWORD dwReserved, IDataObject **ppDataObject) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%x %p)\n", This, 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) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%d %p %p %d %p %p)\n", This, 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) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%x %p)\n", This, dwFormOfType, pszUserType); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI XMLView_OleObject_SetExtent(IOleObject *iface, |
| DWORD dwDrawAspect, SIZEL *psizel) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%x %p)\n", This, dwDrawAspect, psizel); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI XMLView_OleObject_GetExtent(IOleObject *iface, |
| DWORD dwDrawAspect, SIZEL *psizel) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%x %p)\n", This, 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) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%d)\n", This, 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) |
| { |
| XMLView *This = impl_from_IOleObject(iface); |
| FIXME("(%p)->(%d %p)\n", This, 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(IUnknown *outer, void **ppObj) |
| { |
| XMLView *This; |
| HRESULT hres; |
| |
| TRACE("(%p %p)\n", outer, ppObj); |
| |
| if(outer) |
| return E_FAIL; |
| |
| This = heap_alloc_zero(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)) { |
| heap_free(This); |
| return hres; |
| } |
| |
| *ppObj = &This->IPersistMoniker_iface; |
| return S_OK; |
| } |
| |
| #else |
| |
| HRESULT XMLView_create(IUnknown *outer, void **ppObj) |
| { |
| MESSAGE("This program tried to use a XMLView object, but\n" |
| "libxml2 support was not present at compile time.\n"); |
| return E_NOTIMPL; |
| } |
| |
| #endif /* HAVE_LIBXML2 */ |