/* * 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 */ #define COBJMACROS #include "config.h" #include #ifdef HAVE_LIBXML2 #include #endif #include "windef.h" #include "winbase.h" #include "ole2.h" #include "msxml6.h" #include "mshtml.h" #include "perhist.h" #include "docobj.h" #include "wine/debug.h" #include "msxml_private.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; } XMLView; 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) { 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) { XMLView *This = impl_from_IPersistMoniker(iface); FIXME("(%p)->(%x %p %p %x)\n", This, fFullyAvailable, pimkName, pibc, grfMode); return E_NOTIMPL; } 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(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; }