shell32: Avoid leaks and add parameter checks in SHCreateShellFolderView[Ex].
[wine.git] / dlls / ieframe / shellbrowser.c
blob216d3f4d56ef05390ebcddaa1bc31151bb9a256c
1 /*
2 * Implementation of IShellBrowser interface
4 * Copyright 2011 Piotr Caban for CodeWeavers
5 * Copyright 2012 Jacek Caban for CodeWeavers
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include <assert.h>
24 #include "ieframe.h"
25 #include "exdispid.h"
27 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
31 static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface)
33 return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface);
36 static HRESULT WINAPI ShellBrowser_QueryInterface(IShellBrowser* iface, REFIID riid, void **ppv)
38 ShellBrowser *This = impl_from_IShellBrowser(iface);
40 if(IsEqualGUID(&IID_IUnknown, riid)) {
41 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
42 *ppv = &This->IShellBrowser_iface;
43 }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
44 TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
45 *ppv = &This->IShellBrowser_iface;
46 }else if(IsEqualGUID(&IID_IShellBrowser, riid)) {
47 TRACE("(%p)->(IID_IShellBrowser %p)\n", This, ppv);
48 *ppv = &This->IShellBrowser_iface;
49 }else if(IsEqualGUID(&IID_IBrowserService, riid)) {
50 TRACE("(%p)->(IID_IBrowserService %p)\n", This, ppv);
51 *ppv = &This->IBrowserService_iface;
52 }else if(IsEqualGUID(&IID_IDocObjectService, riid)) {
53 TRACE("(%p)->(IID_IDocObjectService %p)\n", This, ppv);
54 *ppv = &This->IDocObjectService_iface;
55 }else {
56 FIXME("%p %s %p\n", This, debugstr_guid(riid), ppv);
57 *ppv = NULL;
58 return E_NOINTERFACE;
61 IUnknown_AddRef((IUnknown*)*ppv);
62 return S_OK;
65 static ULONG WINAPI ShellBrowser_AddRef(
66 IShellBrowser* iface)
68 ShellBrowser *This = impl_from_IShellBrowser(iface);
69 LONG ref = InterlockedIncrement(&This->ref);
71 TRACE("(%p) ref=%d\n", This, ref);
73 return ref;
76 static ULONG WINAPI ShellBrowser_Release(IShellBrowser* iface)
78 ShellBrowser *This = impl_from_IShellBrowser(iface);
79 LONG ref = InterlockedDecrement(&This->ref);
81 TRACE("(%p) ref=%d\n", This, ref);
83 if(!ref) {
84 assert(!This->doc_host);
85 heap_free(This);
88 return ref;
91 static HRESULT WINAPI ShellBrowser_GetWindow(
92 IShellBrowser* iface,
93 HWND *phwnd)
95 ShellBrowser *This = impl_from_IShellBrowser(iface);
96 FIXME("%p %p\n", This, phwnd);
97 return E_NOTIMPL;
100 static HRESULT WINAPI ShellBrowser_ContextSensitiveHelp(
101 IShellBrowser* iface,
102 BOOL fEnterMode)
104 ShellBrowser *This = impl_from_IShellBrowser(iface);
105 FIXME("%p %d\n", This, fEnterMode);
106 return E_NOTIMPL;
109 static HRESULT WINAPI ShellBrowser_InsertMenusSB(
110 IShellBrowser* iface,
111 HMENU hmenuShared,
112 LPOLEMENUGROUPWIDTHS lpMenuWidths)
114 ShellBrowser *This = impl_from_IShellBrowser(iface);
115 FIXME("%p %p %p\n", This, hmenuShared, lpMenuWidths);
116 return E_NOTIMPL;
119 static HRESULT WINAPI ShellBrowser_SetMenuSB(
120 IShellBrowser* iface,
121 HMENU hmenuShared,
122 HOLEMENU holemenuReserved,
123 HWND hwndActiveObject)
125 ShellBrowser *This = impl_from_IShellBrowser(iface);
126 FIXME("%p %p %p %p\n", This, hmenuShared, holemenuReserved, hwndActiveObject);
127 return E_NOTIMPL;
130 static HRESULT WINAPI ShellBrowser_RemoveMenusSB(
131 IShellBrowser* iface,
132 HMENU hmenuShared)
134 ShellBrowser *This = impl_from_IShellBrowser(iface);
135 FIXME("%p %p\n", This, hmenuShared);
136 return E_NOTIMPL;
139 static HRESULT WINAPI ShellBrowser_SetStatusTextSB(
140 IShellBrowser* iface,
141 LPCOLESTR pszStatusText)
143 ShellBrowser *This = impl_from_IShellBrowser(iface);
144 FIXME("%p %s\n", This, debugstr_w(pszStatusText));
145 return E_NOTIMPL;
148 static HRESULT WINAPI ShellBrowser_EnableModelessSB(
149 IShellBrowser* iface,
150 BOOL fEnable)
152 ShellBrowser *This = impl_from_IShellBrowser(iface);
153 FIXME("%p %d\n", This, fEnable);
154 return E_NOTIMPL;
157 static HRESULT WINAPI ShellBrowser_TranslateAcceleratorSB(
158 IShellBrowser* iface,
159 MSG *pmsg,
160 WORD wID)
162 ShellBrowser *This = impl_from_IShellBrowser(iface);
163 FIXME("%p %p %d\n", This, pmsg, (int)wID);
164 return E_NOTIMPL;
167 static HRESULT WINAPI ShellBrowser_BrowseObject(
168 IShellBrowser* iface,
169 LPCITEMIDLIST pidl,
170 UINT wFlags)
172 ShellBrowser *This = impl_from_IShellBrowser(iface);
173 FIXME("%p %p %u\n", This, pidl, wFlags);
174 return E_NOTIMPL;
177 static HRESULT WINAPI ShellBrowser_GetViewStateStream(
178 IShellBrowser* iface,
179 DWORD grfMode,
180 IStream **ppStrm)
182 ShellBrowser *This = impl_from_IShellBrowser(iface);
183 FIXME("%p %x %p\n", This, grfMode, ppStrm);
184 return E_NOTIMPL;
187 static HRESULT WINAPI ShellBrowser_GetControlWindow(
188 IShellBrowser* iface,
189 UINT id,
190 HWND *phwnd)
192 ShellBrowser *This = impl_from_IShellBrowser(iface);
193 FIXME("%p %u %p\n", This, id, phwnd);
194 return E_NOTIMPL;
197 static HRESULT WINAPI ShellBrowser_SendControlMsg(
198 IShellBrowser* iface,
199 UINT id,
200 UINT uMsg,
201 WPARAM wParam,
202 LPARAM lParam,
203 LRESULT *pret)
205 ShellBrowser *This = impl_from_IShellBrowser(iface);
206 FIXME("%p %u %u %p\n", This, id, uMsg, pret);
207 return E_NOTIMPL;
210 static HRESULT WINAPI ShellBrowser_QueryActiveShellView(
211 IShellBrowser* iface,
212 IShellView **ppshv)
214 ShellBrowser *This = impl_from_IShellBrowser(iface);
215 FIXME("%p %p\n", This, ppshv);
216 return E_NOTIMPL;
219 static HRESULT WINAPI ShellBrowser_OnViewWindowActive(
220 IShellBrowser* iface,
221 IShellView *pshv)
223 ShellBrowser *This = impl_from_IShellBrowser(iface);
224 FIXME("%p %p\n", This, pshv);
225 return E_NOTIMPL;
228 static HRESULT WINAPI ShellBrowser_SetToolbarItems(
229 IShellBrowser* iface,
230 LPTBBUTTONSB lpButtons,
231 UINT nButtons,
232 UINT uFlags)
234 ShellBrowser *This = impl_from_IShellBrowser(iface);
235 FIXME("%p %p %u %u\n", This, lpButtons, nButtons, uFlags);
236 return E_NOTIMPL;
239 static const IShellBrowserVtbl ShellBrowserVtbl = {
240 ShellBrowser_QueryInterface,
241 ShellBrowser_AddRef,
242 ShellBrowser_Release,
243 ShellBrowser_GetWindow,
244 ShellBrowser_ContextSensitiveHelp,
245 ShellBrowser_InsertMenusSB,
246 ShellBrowser_SetMenuSB,
247 ShellBrowser_RemoveMenusSB,
248 ShellBrowser_SetStatusTextSB,
249 ShellBrowser_EnableModelessSB,
250 ShellBrowser_TranslateAcceleratorSB,
251 ShellBrowser_BrowseObject,
252 ShellBrowser_GetViewStateStream,
253 ShellBrowser_GetControlWindow,
254 ShellBrowser_SendControlMsg,
255 ShellBrowser_QueryActiveShellView,
256 ShellBrowser_OnViewWindowActive,
257 ShellBrowser_SetToolbarItems
260 static inline ShellBrowser *impl_from_IBrowserService(IBrowserService *iface)
262 return CONTAINING_RECORD(iface, ShellBrowser, IBrowserService_iface);
265 static HRESULT WINAPI BrowserService_QueryInterface(
266 IBrowserService* iface,
267 REFIID riid,
268 void **ppvObject)
270 ShellBrowser *This = impl_from_IBrowserService(iface);
271 return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject);
274 static ULONG WINAPI BrowserService_AddRef(
275 IBrowserService *iface)
277 ShellBrowser *This = impl_from_IBrowserService(iface);
278 return IShellBrowser_AddRef(&This->IShellBrowser_iface);
281 static ULONG WINAPI BrowserService_Release(
282 IBrowserService* iface)
284 ShellBrowser *This = impl_from_IBrowserService(iface);
285 return IShellBrowser_Release(&This->IShellBrowser_iface);
288 static HRESULT WINAPI BrowserService_GetParentSite(
289 IBrowserService* iface,
290 IOleInPlaceSite **ppipsite)
292 ShellBrowser *This = impl_from_IBrowserService(iface);
293 FIXME("%p %p\n", This, ppipsite);
294 return E_NOTIMPL;
297 static HRESULT WINAPI BrowserService_SetTitle(
298 IBrowserService* iface,
299 IShellView *psv,
300 LPCWSTR pszName)
302 ShellBrowser *This = impl_from_IBrowserService(iface);
303 FIXME("%p %p %s\n", This, psv, debugstr_w(pszName));
304 return E_NOTIMPL;
307 static HRESULT WINAPI BrowserService_GetTitle(
308 IBrowserService* iface,
309 IShellView *psv,
310 LPWSTR pszName,
311 DWORD cchName)
313 ShellBrowser *This = impl_from_IBrowserService(iface);
314 FIXME("%p %p %p %d\n", This, psv, pszName, cchName);
315 return E_NOTIMPL;
318 static HRESULT WINAPI BrowserService_GetOleObject(
319 IBrowserService* iface,
320 IOleObject **ppobjv)
322 ShellBrowser *This = impl_from_IBrowserService(iface);
323 FIXME("%p %p\n", This, ppobjv);
324 return E_NOTIMPL;
327 static HRESULT WINAPI BrowserService_GetTravelLog(
328 IBrowserService* iface,
329 ITravelLog **pptl)
331 ShellBrowser *This = impl_from_IBrowserService(iface);
332 FIXME("%p %p\n", This, pptl);
333 return E_NOTIMPL;
336 static HRESULT WINAPI BrowserService_ShowControlWindow(
337 IBrowserService* iface,
338 UINT id,
339 BOOL fShow)
341 ShellBrowser *This = impl_from_IBrowserService(iface);
342 FIXME("%p %u %d\n", This, id, fShow);
343 return E_NOTIMPL;
346 static HRESULT WINAPI BrowserService_IsControlWindowShown(
347 IBrowserService* iface,
348 UINT id,
349 BOOL *pfShown)
351 ShellBrowser *This = impl_from_IBrowserService(iface);
352 FIXME("%p %u %p\n", This, id, pfShown);
353 return E_NOTIMPL;
356 static HRESULT WINAPI BrowserService_IEGetDisplayName(
357 IBrowserService* iface,
358 PCIDLIST_ABSOLUTE pidl,
359 LPWSTR pwszName,
360 UINT uFlags)
362 ShellBrowser *This = impl_from_IBrowserService(iface);
363 FIXME("%p %p %p %u\n", This, pidl, pwszName, uFlags);
364 return E_NOTIMPL;
367 static HRESULT WINAPI BrowserService_IEParseDisplayName(
368 IBrowserService* iface,
369 UINT uiCP,
370 LPCWSTR pwszPath,
371 PIDLIST_ABSOLUTE *ppidlOut)
373 ShellBrowser *This = impl_from_IBrowserService(iface);
374 FIXME("%p %u %s %p\n", This, uiCP, debugstr_w(pwszPath), ppidlOut);
375 return E_NOTIMPL;
378 static HRESULT WINAPI BrowserService_DisplayParseError(
379 IBrowserService* iface,
380 HRESULT hres,
381 LPCWSTR pwszPath)
383 ShellBrowser *This = impl_from_IBrowserService(iface);
384 FIXME("%p %x %s\n", This, hres, debugstr_w(pwszPath));
385 return E_NOTIMPL;
388 static HRESULT WINAPI BrowserService_NavigateToPidl(
389 IBrowserService* iface,
390 PCIDLIST_ABSOLUTE pidl,
391 DWORD grfHLNF)
393 ShellBrowser *This = impl_from_IBrowserService(iface);
394 FIXME("%p %p %d\n", This, pidl, grfHLNF);
395 return E_NOTIMPL;
398 static HRESULT WINAPI BrowserService_SetNavigateState(
399 IBrowserService* iface,
400 BNSTATE bnstate)
402 ShellBrowser *This = impl_from_IBrowserService(iface);
403 FIXME("%p %d\n", This, bnstate);
404 return E_NOTIMPL;
407 static HRESULT WINAPI BrowserService_GetNavigateState(
408 IBrowserService* iface,
409 BNSTATE *pbnstate)
411 ShellBrowser *This = impl_from_IBrowserService(iface);
412 FIXME("%p %p\n", This, pbnstate);
413 return E_NOTIMPL;
416 static HRESULT WINAPI BrowserService_NotifyRedirect(
417 IBrowserService* iface,
418 IShellView *psv,
419 PCIDLIST_ABSOLUTE pidl,
420 BOOL *pfDidBrowse)
422 ShellBrowser *This = impl_from_IBrowserService(iface);
423 FIXME("%p %p %p %p\n", This, psv, pidl, pfDidBrowse);
424 return E_NOTIMPL;
427 static HRESULT WINAPI BrowserService_UpdateWindowList(
428 IBrowserService* iface)
430 ShellBrowser *This = impl_from_IBrowserService(iface);
431 FIXME("%p\n", This);
432 return E_NOTIMPL;
435 static HRESULT WINAPI BrowserService_UpdateBackForwardState(
436 IBrowserService* iface)
438 ShellBrowser *This = impl_from_IBrowserService(iface);
439 FIXME("%p\n", This);
440 return E_NOTIMPL;
443 static HRESULT WINAPI BrowserService_SetFlags(
444 IBrowserService* iface,
445 DWORD dwFlags,
446 DWORD dwFlagMask)
448 ShellBrowser *This = impl_from_IBrowserService(iface);
449 FIXME("%p %x %x\n", This, dwFlags, dwFlagMask);
450 return E_NOTIMPL;
453 static HRESULT WINAPI BrowserService_GetFlags(
454 IBrowserService* iface,
455 DWORD *pdwFlags)
457 ShellBrowser *This = impl_from_IBrowserService(iface);
458 FIXME("%p %p\n", This, pdwFlags);
459 return E_NOTIMPL;
462 static HRESULT WINAPI BrowserService_CanNavigateNow(
463 IBrowserService* iface)
465 ShellBrowser *This = impl_from_IBrowserService(iface);
466 FIXME("%p\n", This);
467 return E_NOTIMPL;
470 static HRESULT WINAPI BrowserService_GetPidl(
471 IBrowserService* iface,
472 PIDLIST_ABSOLUTE *ppidl)
474 ShellBrowser *This = impl_from_IBrowserService(iface);
475 FIXME("%p %p\n", This, ppidl);
476 return E_NOTIMPL;
479 static HRESULT WINAPI BrowserService_SetReferrer(
480 IBrowserService* iface,
481 PCIDLIST_ABSOLUTE pidl)
483 ShellBrowser *This = impl_from_IBrowserService(iface);
484 FIXME("%p %p\n", This, pidl);
485 return E_NOTIMPL;
488 static DWORD WINAPI BrowserService_GetBrowserIndex(
489 IBrowserService* iface)
491 ShellBrowser *This = impl_from_IBrowserService(iface);
492 FIXME("%p\n", This);
493 return E_NOTIMPL;
496 static HRESULT WINAPI BrowserService_GetBrowserByIndex(
497 IBrowserService* iface,
498 DWORD dwID,
499 IUnknown **ppunk)
501 ShellBrowser *This = impl_from_IBrowserService(iface);
502 FIXME("%p %x %p\n", This, dwID, ppunk);
503 return E_NOTIMPL;
506 static HRESULT WINAPI BrowserService_GetHistoryObject(
507 IBrowserService* iface,
508 IOleObject **ppole,
509 IStream **pstm,
510 IBindCtx **ppbc)
512 ShellBrowser *This = impl_from_IBrowserService(iface);
513 FIXME("%p %p %p %p\n", This, ppole, pstm, ppbc);
514 return E_NOTIMPL;
517 static HRESULT WINAPI BrowserService_SetHistoryObject(
518 IBrowserService* iface,
519 IOleObject *pole,
520 BOOL fIsLocalAnchor)
522 ShellBrowser *This = impl_from_IBrowserService(iface);
523 FIXME("%p %p %d\n", This, pole, fIsLocalAnchor);
524 return E_NOTIMPL;
527 static HRESULT WINAPI BrowserService_CacheOLEServer(
528 IBrowserService* iface,
529 IOleObject *pole)
531 ShellBrowser *This = impl_from_IBrowserService(iface);
532 FIXME("%p %p\n", This, pole);
533 return E_NOTIMPL;
536 static HRESULT WINAPI BrowserService_GetSetCodePage(
537 IBrowserService* iface,
538 VARIANT *pvarIn,
539 VARIANT *pvarOut)
541 ShellBrowser *This = impl_from_IBrowserService(iface);
542 FIXME("%p %p %p\n", This, pvarIn, pvarOut);
543 return E_NOTIMPL;
546 static HRESULT WINAPI BrowserService_OnHttpEquiv(
547 IBrowserService* iface,
548 IShellView *psv,
549 BOOL fDone,
550 VARIANT *pvarargIn,
551 VARIANT *pvarargOut)
553 ShellBrowser *This = impl_from_IBrowserService(iface);
554 FIXME("%p %p %d %p %p\n", This, psv, fDone, pvarargIn, pvarargOut);
555 return E_NOTIMPL;
558 static HRESULT WINAPI BrowserService_GetPalette(
559 IBrowserService* iface,
560 HPALETTE *hpal)
562 ShellBrowser *This = impl_from_IBrowserService(iface);
563 FIXME("%p %p\n", This, hpal);
564 return E_NOTIMPL;
567 static HRESULT WINAPI BrowserService_RegisterWindow(
568 IBrowserService* iface,
569 BOOL fForceRegister,
570 int swc)
572 ShellBrowser *This = impl_from_IBrowserService(iface);
573 FIXME("%p %d %d\n", This, fForceRegister, swc);
574 return E_NOTIMPL;
577 static const IBrowserServiceVtbl BrowserServiceVtbl = {
578 BrowserService_QueryInterface,
579 BrowserService_AddRef,
580 BrowserService_Release,
581 BrowserService_GetParentSite,
582 BrowserService_SetTitle,
583 BrowserService_GetTitle,
584 BrowserService_GetOleObject,
585 BrowserService_GetTravelLog,
586 BrowserService_ShowControlWindow,
587 BrowserService_IsControlWindowShown,
588 BrowserService_IEGetDisplayName,
589 BrowserService_IEParseDisplayName,
590 BrowserService_DisplayParseError,
591 BrowserService_NavigateToPidl,
592 BrowserService_SetNavigateState,
593 BrowserService_GetNavigateState,
594 BrowserService_NotifyRedirect,
595 BrowserService_UpdateWindowList,
596 BrowserService_UpdateBackForwardState,
597 BrowserService_SetFlags,
598 BrowserService_GetFlags,
599 BrowserService_CanNavigateNow,
600 BrowserService_GetPidl,
601 BrowserService_SetReferrer,
602 BrowserService_GetBrowserIndex,
603 BrowserService_GetBrowserByIndex,
604 BrowserService_GetHistoryObject,
605 BrowserService_SetHistoryObject,
606 BrowserService_CacheOLEServer,
607 BrowserService_GetSetCodePage,
608 BrowserService_OnHttpEquiv,
609 BrowserService_GetPalette,
610 BrowserService_RegisterWindow
613 static inline ShellBrowser *impl_from_IDocObjectService(IDocObjectService *iface)
615 return CONTAINING_RECORD(iface, ShellBrowser, IDocObjectService_iface);
618 static HRESULT WINAPI DocObjectService_QueryInterface(
619 IDocObjectService* iface,
620 REFIID riid,
621 void **ppvObject)
623 ShellBrowser *This = impl_from_IDocObjectService(iface);
624 return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject);
627 static ULONG WINAPI DocObjectService_AddRef(
628 IDocObjectService* iface)
630 ShellBrowser *This = impl_from_IDocObjectService(iface);
631 return IShellBrowser_AddRef(&This->IShellBrowser_iface);
634 static ULONG WINAPI DocObjectService_Release(
635 IDocObjectService* iface)
637 ShellBrowser *This = impl_from_IDocObjectService(iface);
638 return IShellBrowser_Release(&This->IShellBrowser_iface);
641 static HRESULT WINAPI DocObjectService_FireBeforeNavigate2(
642 IDocObjectService* iface,
643 IDispatch *pDispatch,
644 LPCWSTR lpszUrl,
645 DWORD dwFlags,
646 LPCWSTR lpszFrameName,
647 BYTE *pPostData,
648 DWORD cbPostData,
649 LPCWSTR lpszHeaders,
650 BOOL fPlayNavSound,
651 BOOL *pfCancel)
653 ShellBrowser *This = impl_from_IDocObjectService(iface);
654 VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers;
655 VARIANTARG params[7];
656 DISPPARAMS dp = {params, NULL, 7, 0};
657 VARIANT_BOOL cancel = VARIANT_FALSE;
658 SAFEARRAY *post_data;
660 TRACE("%p %p %s %x %s %p %d %s %d %p\n", This, pDispatch, debugstr_w(lpszUrl),
661 dwFlags, debugstr_w(lpszFrameName), pPostData, cbPostData,
662 debugstr_w(lpszHeaders), fPlayNavSound, pfCancel);
664 if(cbPostData) {
665 post_data = SafeArrayCreateVector(VT_UI1, 0, cbPostData);
666 if(!post_data)
667 return E_OUTOFMEMORY;
668 memcpy(post_data->pvData, pPostData, cbPostData);
669 }else {
670 post_data = NULL;
673 V_VT(params) = VT_BOOL|VT_BYREF;
674 V_BOOLREF(params) = &cancel;
676 V_VT(params+1) = (VT_BYREF|VT_VARIANT);
677 V_VARIANTREF(params+1) = &var_headers;
678 V_VT(&var_headers) = VT_BSTR;
679 V_BSTR(&var_headers) = lpszHeaders ? SysAllocString(lpszHeaders) : NULL;
681 V_VT(params+2) = (VT_BYREF|VT_VARIANT);
682 V_VARIANTREF(params+2) = &var_post_data2;
683 V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT);
684 V_VARIANTREF(&var_post_data2) = &var_post_data;
686 if(post_data) {
687 V_VT(&var_post_data) = VT_UI1|VT_ARRAY;
688 V_ARRAY(&var_post_data) = post_data;
689 }else {
690 V_VT(&var_post_data) = VT_EMPTY;
693 V_VT(params+3) = (VT_BYREF|VT_VARIANT);
694 V_VARIANTREF(params+3) = &var_frame_name;
695 V_VT(&var_frame_name) = VT_BSTR;
696 V_BSTR(&var_frame_name) = lpszFrameName ? SysAllocString(lpszFrameName) : NULL;
698 V_VT(params+4) = (VT_BYREF|VT_VARIANT);
699 V_VARIANTREF(params+4) = &var_flags;
700 V_VT(&var_flags) = VT_I4;
701 V_I4(&var_flags) = 0;
703 V_VT(params+5) = (VT_BYREF|VT_VARIANT);
704 V_VARIANTREF(params+5) = &var_url;
705 V_VT(&var_url) = VT_BSTR;
706 V_BSTR(&var_url) = SysAllocString(lpszUrl);
708 V_VT(params+6) = (VT_DISPATCH);
709 V_DISPATCH(params+6) = (IDispatch*)This->doc_host->wb;
711 TRACE(">>>\n");
712 call_sink(This->doc_host->cps.wbe2, DISPID_BEFORENAVIGATE2, &dp);
713 TRACE("<<<\n");
715 SysFreeString(V_BSTR(&var_url));
716 SysFreeString(V_BSTR(&var_headers));
717 SysFreeString(V_BSTR(&var_frame_name));
718 SafeArrayDestroy(post_data);
720 *pfCancel = !!cancel;
721 return S_OK;
724 static HRESULT WINAPI DocObjectService_FireNavigateComplete2(
725 IDocObjectService* iface,
726 IHTMLWindow2 *pHTMLWindow2,
727 DWORD dwFlags)
729 ShellBrowser *This = impl_from_IDocObjectService(iface);
730 DocHost *doc_host = This->doc_host;
731 IHTMLPrivateWindow *priv_window;
732 VARIANTARG params[2];
733 DISPPARAMS dp = {params, NULL, 2, 0};
734 VARIANT url_var;
735 BSTR url;
736 HRESULT hres;
738 TRACE("%p %p %x\n", This, pHTMLWindow2, dwFlags);
740 if(doc_host->travellog.loading_pos != -1) {
741 WARN("histupdate not notified\n");
742 doc_host->travellog.position = doc_host->travellog.loading_pos;
743 doc_host->travellog.loading_pos = -1;
746 hres = IHTMLWindow2_QueryInterface(pHTMLWindow2, &IID_IHTMLPrivateWindow, (void**)&priv_window);
747 if(FAILED(hres))
748 return hres;
750 hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url);
751 IHTMLPrivateWindow_Release(priv_window);
752 if(FAILED(hres))
753 return hres;
755 TRACE("got URL %s\n", debugstr_w(url));
756 set_dochost_url(This->doc_host, url);
758 V_VT(params) = (VT_BYREF|VT_VARIANT);
759 V_VARIANTREF(params) = &url_var;
761 V_VT(params+1) = VT_DISPATCH;
762 V_DISPATCH(params+1) = (IDispatch*)doc_host->wb;
764 V_VT(&url_var) = VT_BSTR;
765 V_BSTR(&url_var) = url;
767 TRACE(">>>\n");
768 call_sink(This->doc_host->cps.wbe2, DISPID_NAVIGATECOMPLETE2, &dp);
769 TRACE("<<<\n");
771 SysFreeString(url);
773 This->doc_host->busy = VARIANT_FALSE;
774 return S_OK;
777 static HRESULT WINAPI DocObjectService_FireDownloadBegin(
778 IDocObjectService* iface)
780 ShellBrowser *This = impl_from_IDocObjectService(iface);
781 FIXME("%p\n", This);
782 return E_NOTIMPL;
785 static HRESULT WINAPI DocObjectService_FireDownloadComplete(
786 IDocObjectService* iface)
788 ShellBrowser *This = impl_from_IDocObjectService(iface);
789 FIXME("%p\n", This);
790 return E_NOTIMPL;
793 static HRESULT WINAPI DocObjectService_FireDocumentComplete(
794 IDocObjectService* iface,
795 IHTMLWindow2 *pHTMLWindow,
796 DWORD dwFlags)
798 ShellBrowser *This = impl_from_IDocObjectService(iface);
799 IHTMLPrivateWindow *priv_window;
800 VARIANTARG params[2];
801 DISPPARAMS dp = {params, NULL, 2, 0};
802 VARIANT url_var;
803 BSTR url;
804 HRESULT hres;
806 TRACE("%p %p %x\n", This, pHTMLWindow, dwFlags);
808 hres = IHTMLWindow2_QueryInterface(pHTMLWindow, &IID_IHTMLPrivateWindow, (void**)&priv_window);
809 if(FAILED(hres))
810 return hres;
812 hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url);
813 IHTMLPrivateWindow_Release(priv_window);
814 if(FAILED(hres))
815 return hres;
817 TRACE("got URL %s\n", debugstr_w(url));
819 V_VT(params) = (VT_BYREF|VT_VARIANT);
820 V_VARIANTREF(params) = &url_var;
822 V_VT(params+1) = VT_DISPATCH;
823 V_DISPATCH(params+1) = (IDispatch*)This->doc_host->wb;
825 V_VT(&url_var) = VT_BSTR;
826 V_BSTR(&url_var) = url;
828 /* Keep reference to This. It may be released in event handler. */
829 IShellBrowser_AddRef(&This->IShellBrowser_iface);
831 TRACE(">>>\n");
832 call_sink(This->doc_host->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dp);
833 TRACE("<<<\n");
835 SysFreeString(url);
836 if(This->doc_host)
837 This->doc_host->busy = VARIANT_FALSE;
839 IShellBrowser_Release(&This->IShellBrowser_iface);
840 return S_OK;
843 static HRESULT WINAPI DocObjectService_UpdateDesktopComponent(
844 IDocObjectService* iface,
845 IHTMLWindow2 *pHTMLWindow)
847 ShellBrowser *This = impl_from_IDocObjectService(iface);
848 FIXME("%p %p\n", This, pHTMLWindow);
849 return E_NOTIMPL;
852 static HRESULT WINAPI DocObjectService_GetPendingUrl(
853 IDocObjectService* iface,
854 BSTR *pbstrPendingUrl)
856 ShellBrowser *This = impl_from_IDocObjectService(iface);
857 FIXME("%p %p\n", This, pbstrPendingUrl);
858 return E_NOTIMPL;
861 static HRESULT WINAPI DocObjectService_ActiveElementChanged(
862 IDocObjectService* iface,
863 IHTMLElement *pHTMLElement)
865 ShellBrowser *This = impl_from_IDocObjectService(iface);
866 FIXME("%p %p\n", This, pHTMLElement);
867 return E_NOTIMPL;
870 static HRESULT WINAPI DocObjectService_GetUrlSearchComponent(
871 IDocObjectService* iface,
872 BSTR *pbstrSearch)
874 ShellBrowser *This = impl_from_IDocObjectService(iface);
875 FIXME("%p %p\n", This, pbstrSearch);
876 return E_NOTIMPL;
879 static HRESULT WINAPI DocObjectService_IsErrorUrl(
880 IDocObjectService* iface,
881 LPCWSTR lpszUrl,
882 BOOL *pfIsError)
884 ShellBrowser *This = impl_from_IDocObjectService(iface);
885 FIXME("%p %s %p\n", This, debugstr_w(lpszUrl), pfIsError);
887 *pfIsError = FALSE;
888 return S_OK;
891 static const IDocObjectServiceVtbl DocObjectServiceVtbl = {
892 DocObjectService_QueryInterface,
893 DocObjectService_AddRef,
894 DocObjectService_Release,
895 DocObjectService_FireBeforeNavigate2,
896 DocObjectService_FireNavigateComplete2,
897 DocObjectService_FireDownloadBegin,
898 DocObjectService_FireDownloadComplete,
899 DocObjectService_FireDocumentComplete,
900 DocObjectService_UpdateDesktopComponent,
901 DocObjectService_GetPendingUrl,
902 DocObjectService_ActiveElementChanged,
903 DocObjectService_GetUrlSearchComponent,
904 DocObjectService_IsErrorUrl
907 HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret)
909 ShellBrowser *sb;
911 sb = heap_alloc(sizeof(ShellBrowser));
912 if(!sb)
913 return E_OUTOFMEMORY;
915 sb->IShellBrowser_iface.lpVtbl = &ShellBrowserVtbl;
916 sb->IBrowserService_iface.lpVtbl = &BrowserServiceVtbl;
917 sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl;
919 sb->ref = 1;
920 sb->doc_host = doc_host;
922 *ret = sb;
923 return S_OK;
926 void detach_browser_service(ShellBrowser *sb)
928 sb->doc_host = NULL;
929 IShellBrowser_Release(&sb->IShellBrowser_iface);
932 static inline NewWindowManager *impl_from_INewWindowManager(INewWindowManager *iface)
934 return CONTAINING_RECORD(iface, NewWindowManager, INewWindowManager_iface);
937 static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv)
939 NewWindowManager *This = impl_from_INewWindowManager(iface);
941 if(IsEqualGUID(&IID_IUnknown, riid)) {
942 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
943 *ppv = &This->INewWindowManager_iface;
944 }else if(IsEqualGUID(&IID_INewWindowManager, riid)) {
945 TRACE("(%p)->(IID_INewWindowManager %p)\n", This, ppv);
946 *ppv = &This->INewWindowManager_iface;
947 }else {
948 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
949 *ppv = NULL;
950 return E_NOINTERFACE;
953 IUnknown_AddRef((IUnknown*)*ppv);
954 return S_OK;
957 static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface)
959 NewWindowManager *This = impl_from_INewWindowManager(iface);
961 TRACE("(%p)\n", This);
963 return IOleClientSite_AddRef(&This->doc_host->IOleClientSite_iface);
966 static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface)
968 NewWindowManager *This = impl_from_INewWindowManager(iface);
970 TRACE("(%p)\n", This);
972 return IOleClientSite_Release(&This->doc_host->IOleClientSite_iface);
975 static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl,
976 LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags,
977 DWORD dwUserActionTime)
979 NewWindowManager *This = impl_from_INewWindowManager(iface);
980 FIXME("(%p)->(%s %s %s %s %x %x %d)\n", This, debugstr_w(pszUrl), debugstr_w(pszName), debugstr_w(pszUrlContext),
981 debugstr_w(pszFeatures), fReplace, dwFlags, dwUserActionTime);
982 return S_OK;
985 static const INewWindowManagerVtbl NewWindowManagerVtbl = {
986 NewWindowManager_QueryInterface,
987 NewWindowManager_AddRef,
988 NewWindowManager_Release,
989 NewWindowManager_EvaluateNewWindow
992 void NewWindowManager_Init(DocHost *doc_host)
994 doc_host->nwm.INewWindowManager_iface.lpVtbl = &NewWindowManagerVtbl;
995 doc_host->nwm.doc_host = doc_host;