| /* |
| * Implementation of IShellBrowser interface |
| * |
| * Copyright 2011 Piotr Caban for CodeWeavers |
| * Copyright 2012 Jacek 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 <assert.h> |
| |
| #include "ieframe.h" |
| #include "exdispid.h" |
| #include "shlwapi.h" |
| |
| #include "wine/debug.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(ieframe); |
| |
| static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface) |
| { |
| return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface); |
| } |
| |
| static HRESULT WINAPI ShellBrowser_QueryInterface(IShellBrowser* iface, REFIID riid, void **ppv) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| |
| if(IsEqualGUID(&IID_IUnknown, riid)) { |
| TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); |
| *ppv = &This->IShellBrowser_iface; |
| }else if(IsEqualGUID(&IID_IOleWindow, riid)) { |
| TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv); |
| *ppv = &This->IShellBrowser_iface; |
| }else if(IsEqualGUID(&IID_IShellBrowser, riid)) { |
| TRACE("(%p)->(IID_IShellBrowser %p)\n", This, ppv); |
| *ppv = &This->IShellBrowser_iface; |
| }else if(IsEqualGUID(&IID_IBrowserService, riid)) { |
| TRACE("(%p)->(IID_IBrowserService %p)\n", This, ppv); |
| *ppv = &This->IBrowserService_iface; |
| }else if(IsEqualGUID(&IID_IDocObjectService, riid)) { |
| TRACE("(%p)->(IID_IDocObjectService %p)\n", This, ppv); |
| *ppv = &This->IDocObjectService_iface; |
| }else { |
| FIXME("%p %s %p\n", This, debugstr_guid(riid), ppv); |
| *ppv = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI ShellBrowser_AddRef( |
| IShellBrowser* iface) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| LONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) ref=%d\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI ShellBrowser_Release(IShellBrowser* iface) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| LONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) ref=%d\n", This, ref); |
| |
| if(!ref) { |
| assert(!This->doc_host); |
| heap_free(This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_GetWindow( |
| IShellBrowser* iface, |
| HWND *phwnd) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p\n", This, phwnd); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_ContextSensitiveHelp( |
| IShellBrowser* iface, |
| BOOL fEnterMode) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %d\n", This, fEnterMode); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_InsertMenusSB( |
| IShellBrowser* iface, |
| HMENU hmenuShared, |
| LPOLEMENUGROUPWIDTHS lpMenuWidths) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p %p\n", This, hmenuShared, lpMenuWidths); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_SetMenuSB( |
| IShellBrowser* iface, |
| HMENU hmenuShared, |
| HOLEMENU holemenuReserved, |
| HWND hwndActiveObject) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p %p %p\n", This, hmenuShared, holemenuReserved, hwndActiveObject); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_RemoveMenusSB( |
| IShellBrowser* iface, |
| HMENU hmenuShared) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p\n", This, hmenuShared); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_SetStatusTextSB( |
| IShellBrowser* iface, |
| LPCOLESTR pszStatusText) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %s\n", This, debugstr_w(pszStatusText)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_EnableModelessSB( |
| IShellBrowser* iface, |
| BOOL fEnable) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %d\n", This, fEnable); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_TranslateAcceleratorSB( |
| IShellBrowser* iface, |
| MSG *pmsg, |
| WORD wID) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p %d\n", This, pmsg, (int)wID); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_BrowseObject( |
| IShellBrowser* iface, |
| LPCITEMIDLIST pidl, |
| UINT wFlags) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p %u\n", This, pidl, wFlags); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_GetViewStateStream( |
| IShellBrowser* iface, |
| DWORD grfMode, |
| IStream **ppStrm) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %x %p\n", This, grfMode, ppStrm); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_GetControlWindow( |
| IShellBrowser* iface, |
| UINT id, |
| HWND *phwnd) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %u %p\n", This, id, phwnd); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_SendControlMsg( |
| IShellBrowser* iface, |
| UINT id, |
| UINT uMsg, |
| WPARAM wParam, |
| LPARAM lParam, |
| LRESULT *pret) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %u %u %p\n", This, id, uMsg, pret); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_QueryActiveShellView( |
| IShellBrowser* iface, |
| IShellView **ppshv) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p\n", This, ppshv); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_OnViewWindowActive( |
| IShellBrowser* iface, |
| IShellView *pshv) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p\n", This, pshv); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI ShellBrowser_SetToolbarItems( |
| IShellBrowser* iface, |
| LPTBBUTTONSB lpButtons, |
| UINT nButtons, |
| UINT uFlags) |
| { |
| ShellBrowser *This = impl_from_IShellBrowser(iface); |
| FIXME("%p %p %u %u\n", This, lpButtons, nButtons, uFlags); |
| return E_NOTIMPL; |
| } |
| |
| static const IShellBrowserVtbl ShellBrowserVtbl = { |
| ShellBrowser_QueryInterface, |
| ShellBrowser_AddRef, |
| ShellBrowser_Release, |
| ShellBrowser_GetWindow, |
| ShellBrowser_ContextSensitiveHelp, |
| ShellBrowser_InsertMenusSB, |
| ShellBrowser_SetMenuSB, |
| ShellBrowser_RemoveMenusSB, |
| ShellBrowser_SetStatusTextSB, |
| ShellBrowser_EnableModelessSB, |
| ShellBrowser_TranslateAcceleratorSB, |
| ShellBrowser_BrowseObject, |
| ShellBrowser_GetViewStateStream, |
| ShellBrowser_GetControlWindow, |
| ShellBrowser_SendControlMsg, |
| ShellBrowser_QueryActiveShellView, |
| ShellBrowser_OnViewWindowActive, |
| ShellBrowser_SetToolbarItems |
| }; |
| |
| static inline ShellBrowser *impl_from_IBrowserService(IBrowserService *iface) |
| { |
| return CONTAINING_RECORD(iface, ShellBrowser, IBrowserService_iface); |
| } |
| |
| static HRESULT WINAPI BrowserService_QueryInterface( |
| IBrowserService* iface, |
| REFIID riid, |
| void **ppvObject) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject); |
| } |
| |
| static ULONG WINAPI BrowserService_AddRef( |
| IBrowserService *iface) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| return IShellBrowser_AddRef(&This->IShellBrowser_iface); |
| } |
| |
| static ULONG WINAPI BrowserService_Release( |
| IBrowserService* iface) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| return IShellBrowser_Release(&This->IShellBrowser_iface); |
| } |
| |
| static HRESULT WINAPI BrowserService_GetParentSite( |
| IBrowserService* iface, |
| IOleInPlaceSite **ppipsite) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, ppipsite); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_SetTitle( |
| IBrowserService* iface, |
| IShellView *psv, |
| LPCWSTR pszName) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %s\n", This, psv, debugstr_w(pszName)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetTitle( |
| IBrowserService* iface, |
| IShellView *psv, |
| LPWSTR pszName, |
| DWORD cchName) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %p %d\n", This, psv, pszName, cchName); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetOleObject( |
| IBrowserService* iface, |
| IOleObject **ppobjv) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, ppobjv); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetTravelLog( |
| IBrowserService* iface, |
| ITravelLog **pptl) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, pptl); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_ShowControlWindow( |
| IBrowserService* iface, |
| UINT id, |
| BOOL fShow) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %u %d\n", This, id, fShow); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_IsControlWindowShown( |
| IBrowserService* iface, |
| UINT id, |
| BOOL *pfShown) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %u %p\n", This, id, pfShown); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_IEGetDisplayName( |
| IBrowserService* iface, |
| PCIDLIST_ABSOLUTE pidl, |
| LPWSTR pwszName, |
| UINT uFlags) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %p %u\n", This, pidl, pwszName, uFlags); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_IEParseDisplayName( |
| IBrowserService* iface, |
| UINT uiCP, |
| LPCWSTR pwszPath, |
| PIDLIST_ABSOLUTE *ppidlOut) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %u %s %p\n", This, uiCP, debugstr_w(pwszPath), ppidlOut); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_DisplayParseError( |
| IBrowserService* iface, |
| HRESULT hres, |
| LPCWSTR pwszPath) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %x %s\n", This, hres, debugstr_w(pwszPath)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_NavigateToPidl( |
| IBrowserService* iface, |
| PCIDLIST_ABSOLUTE pidl, |
| DWORD grfHLNF) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %d\n", This, pidl, grfHLNF); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_SetNavigateState( |
| IBrowserService* iface, |
| BNSTATE bnstate) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %d\n", This, bnstate); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetNavigateState( |
| IBrowserService* iface, |
| BNSTATE *pbnstate) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, pbnstate); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_NotifyRedirect( |
| IBrowserService* iface, |
| IShellView *psv, |
| PCIDLIST_ABSOLUTE pidl, |
| BOOL *pfDidBrowse) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %p %p\n", This, psv, pidl, pfDidBrowse); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_UpdateWindowList( |
| IBrowserService* iface) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p\n", This); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_UpdateBackForwardState( |
| IBrowserService* iface) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p\n", This); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_SetFlags( |
| IBrowserService* iface, |
| DWORD dwFlags, |
| DWORD dwFlagMask) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %x %x\n", This, dwFlags, dwFlagMask); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetFlags( |
| IBrowserService* iface, |
| DWORD *pdwFlags) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, pdwFlags); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_CanNavigateNow( |
| IBrowserService* iface) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p\n", This); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetPidl( |
| IBrowserService* iface, |
| PIDLIST_ABSOLUTE *ppidl) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, ppidl); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_SetReferrer( |
| IBrowserService* iface, |
| PCIDLIST_ABSOLUTE pidl) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, pidl); |
| return E_NOTIMPL; |
| } |
| |
| static DWORD WINAPI BrowserService_GetBrowserIndex( |
| IBrowserService* iface) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p\n", This); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetBrowserByIndex( |
| IBrowserService* iface, |
| DWORD dwID, |
| IUnknown **ppunk) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %x %p\n", This, dwID, ppunk); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetHistoryObject( |
| IBrowserService* iface, |
| IOleObject **ppole, |
| IStream **pstm, |
| IBindCtx **ppbc) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %p %p\n", This, ppole, pstm, ppbc); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_SetHistoryObject( |
| IBrowserService* iface, |
| IOleObject *pole, |
| BOOL fIsLocalAnchor) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %d\n", This, pole, fIsLocalAnchor); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_CacheOLEServer( |
| IBrowserService* iface, |
| IOleObject *pole) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, pole); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetSetCodePage( |
| IBrowserService* iface, |
| VARIANT *pvarIn, |
| VARIANT *pvarOut) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %s %p\n", This, debugstr_variant(pvarIn), pvarOut); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_OnHttpEquiv( |
| IBrowserService* iface, |
| IShellView *psv, |
| BOOL fDone, |
| VARIANT *pvarargIn, |
| VARIANT *pvarargOut) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p %d %s %p\n", This, psv, fDone, debugstr_variant(pvarargIn), pvarargOut); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_GetPalette( |
| IBrowserService* iface, |
| HPALETTE *hpal) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %p\n", This, hpal); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI BrowserService_RegisterWindow( |
| IBrowserService* iface, |
| BOOL fForceRegister, |
| int swc) |
| { |
| ShellBrowser *This = impl_from_IBrowserService(iface); |
| FIXME("%p %d %d\n", This, fForceRegister, swc); |
| return E_NOTIMPL; |
| } |
| |
| static const IBrowserServiceVtbl BrowserServiceVtbl = { |
| BrowserService_QueryInterface, |
| BrowserService_AddRef, |
| BrowserService_Release, |
| BrowserService_GetParentSite, |
| BrowserService_SetTitle, |
| BrowserService_GetTitle, |
| BrowserService_GetOleObject, |
| BrowserService_GetTravelLog, |
| BrowserService_ShowControlWindow, |
| BrowserService_IsControlWindowShown, |
| BrowserService_IEGetDisplayName, |
| BrowserService_IEParseDisplayName, |
| BrowserService_DisplayParseError, |
| BrowserService_NavigateToPidl, |
| BrowserService_SetNavigateState, |
| BrowserService_GetNavigateState, |
| BrowserService_NotifyRedirect, |
| BrowserService_UpdateWindowList, |
| BrowserService_UpdateBackForwardState, |
| BrowserService_SetFlags, |
| BrowserService_GetFlags, |
| BrowserService_CanNavigateNow, |
| BrowserService_GetPidl, |
| BrowserService_SetReferrer, |
| BrowserService_GetBrowserIndex, |
| BrowserService_GetBrowserByIndex, |
| BrowserService_GetHistoryObject, |
| BrowserService_SetHistoryObject, |
| BrowserService_CacheOLEServer, |
| BrowserService_GetSetCodePage, |
| BrowserService_OnHttpEquiv, |
| BrowserService_GetPalette, |
| BrowserService_RegisterWindow |
| }; |
| |
| static inline ShellBrowser *impl_from_IDocObjectService(IDocObjectService *iface) |
| { |
| return CONTAINING_RECORD(iface, ShellBrowser, IDocObjectService_iface); |
| } |
| |
| static HRESULT WINAPI DocObjectService_QueryInterface( |
| IDocObjectService* iface, |
| REFIID riid, |
| void **ppvObject) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject); |
| } |
| |
| static ULONG WINAPI DocObjectService_AddRef( |
| IDocObjectService* iface) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| return IShellBrowser_AddRef(&This->IShellBrowser_iface); |
| } |
| |
| static ULONG WINAPI DocObjectService_Release( |
| IDocObjectService* iface) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| return IShellBrowser_Release(&This->IShellBrowser_iface); |
| } |
| |
| static HRESULT WINAPI DocObjectService_FireBeforeNavigate2( |
| IDocObjectService* iface, |
| IDispatch *pDispatch, |
| LPCWSTR lpszUrl, |
| DWORD dwFlags, |
| LPCWSTR lpszFrameName, |
| BYTE *pPostData, |
| DWORD cbPostData, |
| LPCWSTR lpszHeaders, |
| BOOL fPlayNavSound, |
| BOOL *pfCancel) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers; |
| VARIANTARG params[7]; |
| DISPPARAMS dp = {params, NULL, 7, 0}; |
| VARIANT_BOOL cancel = VARIANT_FALSE; |
| SAFEARRAY *post_data; |
| WCHAR file_path[MAX_PATH]; |
| DWORD file_path_len = sizeof(file_path) / sizeof(*file_path); |
| |
| TRACE("%p %p %s %x %s %p %d %s %d %p\n", This, pDispatch, debugstr_w(lpszUrl), |
| dwFlags, debugstr_w(lpszFrameName), pPostData, cbPostData, |
| debugstr_w(lpszHeaders), fPlayNavSound, pfCancel); |
| |
| if(cbPostData) { |
| post_data = SafeArrayCreateVector(VT_UI1, 0, cbPostData); |
| if(!post_data) |
| return E_OUTOFMEMORY; |
| memcpy(post_data->pvData, pPostData, cbPostData); |
| }else { |
| post_data = NULL; |
| } |
| |
| V_VT(params) = VT_BOOL|VT_BYREF; |
| V_BOOLREF(params) = &cancel; |
| |
| V_VT(params+1) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(params+1) = &var_headers; |
| V_VT(&var_headers) = VT_BSTR; |
| V_BSTR(&var_headers) = lpszHeaders ? SysAllocString(lpszHeaders) : NULL; |
| |
| V_VT(params+2) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(params+2) = &var_post_data2; |
| V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(&var_post_data2) = &var_post_data; |
| |
| if(post_data) { |
| V_VT(&var_post_data) = VT_UI1|VT_ARRAY; |
| V_ARRAY(&var_post_data) = post_data; |
| }else { |
| V_VT(&var_post_data) = VT_EMPTY; |
| } |
| |
| V_VT(params+3) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(params+3) = &var_frame_name; |
| V_VT(&var_frame_name) = VT_BSTR; |
| V_BSTR(&var_frame_name) = lpszFrameName ? SysAllocString(lpszFrameName) : NULL; |
| |
| V_VT(params+4) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(params+4) = &var_flags; |
| V_VT(&var_flags) = VT_I4; |
| V_I4(&var_flags) = 0; |
| |
| V_VT(params+5) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(params+5) = &var_url; |
| V_VT(&var_url) = VT_BSTR; |
| if(PathCreateFromUrlW(lpszUrl, file_path, &file_path_len, 0) == S_OK) |
| V_BSTR(&var_url) = SysAllocString(file_path); |
| else |
| V_BSTR(&var_url) = SysAllocString(lpszUrl); |
| |
| V_VT(params+6) = (VT_DISPATCH); |
| V_DISPATCH(params+6) = (IDispatch*)This->doc_host->wb; |
| |
| /* Keep reference to This. It may be released in event handler. */ |
| IShellBrowser_AddRef(&This->IShellBrowser_iface); |
| |
| TRACE(">>>\n"); |
| call_sink(This->doc_host->cps.wbe2, DISPID_BEFORENAVIGATE2, &dp); |
| TRACE("<<<\n"); |
| |
| IShellBrowser_Release(&This->IShellBrowser_iface); |
| |
| SysFreeString(V_BSTR(&var_url)); |
| SysFreeString(V_BSTR(&var_headers)); |
| SysFreeString(V_BSTR(&var_frame_name)); |
| SafeArrayDestroy(post_data); |
| |
| *pfCancel = !!cancel; |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI DocObjectService_FireNavigateComplete2( |
| IDocObjectService* iface, |
| IHTMLWindow2 *pHTMLWindow2, |
| DWORD dwFlags) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| DocHost *doc_host = This->doc_host; |
| IHTMLPrivateWindow *priv_window; |
| VARIANTARG params[2]; |
| DISPPARAMS dp = {params, NULL, 2, 0}; |
| VARIANT url_var; |
| BSTR url; |
| HRESULT hres; |
| |
| TRACE("%p %p %x\n", This, pHTMLWindow2, dwFlags); |
| |
| update_navigation_commands(This->doc_host); |
| |
| if(doc_host->travellog.loading_pos != -1) { |
| WARN("histupdate not notified\n"); |
| doc_host->travellog.position = doc_host->travellog.loading_pos; |
| doc_host->travellog.loading_pos = -1; |
| } |
| |
| hres = IHTMLWindow2_QueryInterface(pHTMLWindow2, &IID_IHTMLPrivateWindow, (void**)&priv_window); |
| if(FAILED(hres)) |
| return hres; |
| |
| hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url); |
| IHTMLPrivateWindow_Release(priv_window); |
| if(FAILED(hres)) |
| return hres; |
| |
| TRACE("got URL %s\n", debugstr_w(url)); |
| set_dochost_url(This->doc_host, url); |
| |
| V_VT(params) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(params) = &url_var; |
| |
| V_VT(params+1) = VT_DISPATCH; |
| V_DISPATCH(params+1) = (IDispatch*)doc_host->wb; |
| |
| V_VT(&url_var) = VT_BSTR; |
| V_BSTR(&url_var) = url; |
| |
| /* Keep reference to This. It may be released in event handler. */ |
| IShellBrowser_AddRef(&This->IShellBrowser_iface); |
| |
| TRACE(">>>\n"); |
| call_sink(This->doc_host->cps.wbe2, DISPID_NAVIGATECOMPLETE2, &dp); |
| TRACE("<<<\n"); |
| |
| SysFreeString(url); |
| |
| This->doc_host->busy = VARIANT_FALSE; |
| IShellBrowser_Release(&This->IShellBrowser_iface); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI DocObjectService_FireDownloadBegin( |
| IDocObjectService* iface) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| FIXME("%p\n", This); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI DocObjectService_FireDownloadComplete( |
| IDocObjectService* iface) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| FIXME("%p\n", This); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI DocObjectService_FireDocumentComplete( |
| IDocObjectService* iface, |
| IHTMLWindow2 *pHTMLWindow, |
| DWORD dwFlags) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| IHTMLPrivateWindow *priv_window; |
| VARIANTARG params[2]; |
| DISPPARAMS dp = {params, NULL, 2, 0}; |
| VARIANT url_var; |
| BSTR url; |
| HRESULT hres; |
| |
| TRACE("%p %p %x\n", This, pHTMLWindow, dwFlags); |
| |
| hres = IHTMLWindow2_QueryInterface(pHTMLWindow, &IID_IHTMLPrivateWindow, (void**)&priv_window); |
| if(FAILED(hres)) |
| return hres; |
| |
| hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url); |
| IHTMLPrivateWindow_Release(priv_window); |
| if(FAILED(hres)) |
| return hres; |
| |
| TRACE("got URL %s\n", debugstr_w(url)); |
| |
| V_VT(params) = (VT_BYREF|VT_VARIANT); |
| V_VARIANTREF(params) = &url_var; |
| |
| V_VT(params+1) = VT_DISPATCH; |
| V_DISPATCH(params+1) = (IDispatch*)This->doc_host->wb; |
| |
| V_VT(&url_var) = VT_BSTR; |
| V_BSTR(&url_var) = url; |
| |
| /* Keep reference to This. It may be released in event handler. */ |
| IShellBrowser_AddRef(&This->IShellBrowser_iface); |
| |
| TRACE(">>>\n"); |
| call_sink(This->doc_host->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dp); |
| TRACE("<<<\n"); |
| |
| SysFreeString(url); |
| if(This->doc_host) |
| This->doc_host->busy = VARIANT_FALSE; |
| |
| IShellBrowser_Release(&This->IShellBrowser_iface); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI DocObjectService_UpdateDesktopComponent( |
| IDocObjectService* iface, |
| IHTMLWindow2 *pHTMLWindow) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| FIXME("%p %p\n", This, pHTMLWindow); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI DocObjectService_GetPendingUrl( |
| IDocObjectService* iface, |
| BSTR *pbstrPendingUrl) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| FIXME("%p %p\n", This, pbstrPendingUrl); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI DocObjectService_ActiveElementChanged( |
| IDocObjectService* iface, |
| IHTMLElement *pHTMLElement) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| FIXME("%p %p\n", This, pHTMLElement); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI DocObjectService_GetUrlSearchComponent( |
| IDocObjectService* iface, |
| BSTR *pbstrSearch) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| FIXME("%p %p\n", This, pbstrSearch); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI DocObjectService_IsErrorUrl( |
| IDocObjectService* iface, |
| LPCWSTR lpszUrl, |
| BOOL *pfIsError) |
| { |
| ShellBrowser *This = impl_from_IDocObjectService(iface); |
| FIXME("%p %s %p\n", This, debugstr_w(lpszUrl), pfIsError); |
| |
| *pfIsError = FALSE; |
| return S_OK; |
| } |
| |
| static const IDocObjectServiceVtbl DocObjectServiceVtbl = { |
| DocObjectService_QueryInterface, |
| DocObjectService_AddRef, |
| DocObjectService_Release, |
| DocObjectService_FireBeforeNavigate2, |
| DocObjectService_FireNavigateComplete2, |
| DocObjectService_FireDownloadBegin, |
| DocObjectService_FireDownloadComplete, |
| DocObjectService_FireDocumentComplete, |
| DocObjectService_UpdateDesktopComponent, |
| DocObjectService_GetPendingUrl, |
| DocObjectService_ActiveElementChanged, |
| DocObjectService_GetUrlSearchComponent, |
| DocObjectService_IsErrorUrl |
| }; |
| |
| HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret) |
| { |
| ShellBrowser *sb; |
| |
| sb = heap_alloc(sizeof(ShellBrowser)); |
| if(!sb) |
| return E_OUTOFMEMORY; |
| |
| sb->IShellBrowser_iface.lpVtbl = &ShellBrowserVtbl; |
| sb->IBrowserService_iface.lpVtbl = &BrowserServiceVtbl; |
| sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl; |
| |
| sb->ref = 1; |
| sb->doc_host = doc_host; |
| |
| *ret = sb; |
| return S_OK; |
| } |
| |
| void detach_browser_service(ShellBrowser *sb) |
| { |
| sb->doc_host = NULL; |
| IShellBrowser_Release(&sb->IShellBrowser_iface); |
| } |
| |
| static inline NewWindowManager *impl_from_INewWindowManager(INewWindowManager *iface) |
| { |
| return CONTAINING_RECORD(iface, NewWindowManager, INewWindowManager_iface); |
| } |
| |
| static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv) |
| { |
| NewWindowManager *This = impl_from_INewWindowManager(iface); |
| |
| if(IsEqualGUID(&IID_IUnknown, riid)) { |
| TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); |
| *ppv = &This->INewWindowManager_iface; |
| }else if(IsEqualGUID(&IID_INewWindowManager, riid)) { |
| TRACE("(%p)->(IID_INewWindowManager %p)\n", This, ppv); |
| *ppv = &This->INewWindowManager_iface; |
| }else { |
| WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); |
| *ppv = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface) |
| { |
| NewWindowManager *This = impl_from_INewWindowManager(iface); |
| |
| TRACE("(%p)\n", This); |
| |
| return IOleClientSite_AddRef(&This->doc_host->IOleClientSite_iface); |
| } |
| |
| static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface) |
| { |
| NewWindowManager *This = impl_from_INewWindowManager(iface); |
| |
| TRACE("(%p)\n", This); |
| |
| return IOleClientSite_Release(&This->doc_host->IOleClientSite_iface); |
| } |
| |
| static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl, |
| LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags, |
| DWORD dwUserActionTime) |
| { |
| NewWindowManager *This = impl_from_INewWindowManager(iface); |
| FIXME("(%p)->(%s %s %s %s %x %x %d)\n", This, debugstr_w(pszUrl), debugstr_w(pszName), debugstr_w(pszUrlContext), |
| debugstr_w(pszFeatures), fReplace, dwFlags, dwUserActionTime); |
| return S_OK; |
| } |
| |
| static const INewWindowManagerVtbl NewWindowManagerVtbl = { |
| NewWindowManager_QueryInterface, |
| NewWindowManager_AddRef, |
| NewWindowManager_Release, |
| NewWindowManager_EvaluateNewWindow |
| }; |
| |
| void NewWindowManager_Init(DocHost *doc_host) |
| { |
| doc_host->nwm.INewWindowManager_iface.lpVtbl = &NewWindowManagerVtbl; |
| doc_host->nwm.doc_host = doc_host; |
| } |