Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011/* * 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 = ARRAY_SIZE(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);
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);
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;}