Release 1.5.29.
[wine] / dlls / ieframe / shellbrowser.c
1 /*
2  * Implementation of IShellBrowser interface
3  *
4  * Copyright 2011 Piotr Caban for CodeWeavers
5  * Copyright 2012 Jacek Caban for CodeWeavers
6  *
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.
11  *
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.
16  *
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
20  */
21
22 #include <assert.h>
23
24 #include "ieframe.h"
25 #include "exdispid.h"
26
27 #include "wine/debug.h"
28
29 WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
30
31 static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface)
32 {
33     return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface);
34 }
35
36 static HRESULT WINAPI ShellBrowser_QueryInterface(IShellBrowser* iface, REFIID riid, void **ppv)
37 {
38     ShellBrowser *This = impl_from_IShellBrowser(iface);
39
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;
59     }
60
61     IUnknown_AddRef((IUnknown*)*ppv);
62     return S_OK;
63 }
64
65 static ULONG WINAPI ShellBrowser_AddRef(
66         IShellBrowser* iface)
67 {
68     ShellBrowser *This = impl_from_IShellBrowser(iface);
69     LONG ref = InterlockedIncrement(&This->ref);
70
71     TRACE("(%p) ref=%d\n", This, ref);
72
73     return ref;
74 }
75
76 static ULONG WINAPI ShellBrowser_Release(IShellBrowser* iface)
77 {
78     ShellBrowser *This = impl_from_IShellBrowser(iface);
79     LONG ref = InterlockedDecrement(&This->ref);
80
81     TRACE("(%p) ref=%d\n", This, ref);
82
83     if(!ref) {
84         assert(!This->doc_host);
85         heap_free(This);
86     }
87
88     return ref;
89 }
90
91 static HRESULT WINAPI ShellBrowser_GetWindow(
92         IShellBrowser* iface,
93         HWND *phwnd)
94 {
95     ShellBrowser *This = impl_from_IShellBrowser(iface);
96     FIXME("%p %p\n", This, phwnd);
97     return E_NOTIMPL;
98 }
99
100 static HRESULT WINAPI ShellBrowser_ContextSensitiveHelp(
101         IShellBrowser* iface,
102         BOOL fEnterMode)
103 {
104     ShellBrowser *This = impl_from_IShellBrowser(iface);
105     FIXME("%p %d\n", This, fEnterMode);
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI ShellBrowser_InsertMenusSB(
110         IShellBrowser* iface,
111         HMENU hmenuShared,
112         LPOLEMENUGROUPWIDTHS lpMenuWidths)
113 {
114     ShellBrowser *This = impl_from_IShellBrowser(iface);
115     FIXME("%p %p %p\n", This, hmenuShared, lpMenuWidths);
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI ShellBrowser_SetMenuSB(
120         IShellBrowser* iface,
121         HMENU hmenuShared,
122         HOLEMENU holemenuReserved,
123         HWND hwndActiveObject)
124 {
125     ShellBrowser *This = impl_from_IShellBrowser(iface);
126     FIXME("%p %p %p %p\n", This, hmenuShared, holemenuReserved, hwndActiveObject);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI ShellBrowser_RemoveMenusSB(
131         IShellBrowser* iface,
132         HMENU hmenuShared)
133 {
134     ShellBrowser *This = impl_from_IShellBrowser(iface);
135     FIXME("%p %p\n", This, hmenuShared);
136     return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI ShellBrowser_SetStatusTextSB(
140         IShellBrowser* iface,
141         LPCOLESTR pszStatusText)
142 {
143     ShellBrowser *This = impl_from_IShellBrowser(iface);
144     FIXME("%p %s\n", This, debugstr_w(pszStatusText));
145     return E_NOTIMPL;
146 }
147
148 static HRESULT WINAPI ShellBrowser_EnableModelessSB(
149         IShellBrowser* iface,
150         BOOL fEnable)
151 {
152     ShellBrowser *This = impl_from_IShellBrowser(iface);
153     FIXME("%p %d\n", This, fEnable);
154     return E_NOTIMPL;
155 }
156
157 static HRESULT WINAPI ShellBrowser_TranslateAcceleratorSB(
158         IShellBrowser* iface,
159         MSG *pmsg,
160         WORD wID)
161 {
162     ShellBrowser *This = impl_from_IShellBrowser(iface);
163     FIXME("%p %p %d\n", This, pmsg, (int)wID);
164     return E_NOTIMPL;
165 }
166
167 static HRESULT WINAPI ShellBrowser_BrowseObject(
168         IShellBrowser* iface,
169         LPCITEMIDLIST pidl,
170         UINT wFlags)
171 {
172     ShellBrowser *This = impl_from_IShellBrowser(iface);
173     FIXME("%p %p %u\n", This, pidl, wFlags);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI ShellBrowser_GetViewStateStream(
178         IShellBrowser* iface,
179         DWORD grfMode,
180         IStream **ppStrm)
181 {
182     ShellBrowser *This = impl_from_IShellBrowser(iface);
183     FIXME("%p %x %p\n", This, grfMode, ppStrm);
184     return E_NOTIMPL;
185 }
186
187 static HRESULT WINAPI ShellBrowser_GetControlWindow(
188         IShellBrowser* iface,
189         UINT id,
190         HWND *phwnd)
191 {
192     ShellBrowser *This = impl_from_IShellBrowser(iface);
193     FIXME("%p %u %p\n", This, id, phwnd);
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI ShellBrowser_SendControlMsg(
198         IShellBrowser* iface,
199         UINT id,
200         UINT uMsg,
201         WPARAM wParam,
202         LPARAM lParam,
203         LRESULT *pret)
204 {
205     ShellBrowser *This = impl_from_IShellBrowser(iface);
206     FIXME("%p %u %u %p\n", This, id, uMsg, pret);
207     return E_NOTIMPL;
208 }
209
210 static HRESULT WINAPI ShellBrowser_QueryActiveShellView(
211         IShellBrowser* iface,
212         IShellView **ppshv)
213 {
214     ShellBrowser *This = impl_from_IShellBrowser(iface);
215     FIXME("%p %p\n", This, ppshv);
216     return E_NOTIMPL;
217 }
218
219 static HRESULT WINAPI ShellBrowser_OnViewWindowActive(
220         IShellBrowser* iface,
221         IShellView *pshv)
222 {
223     ShellBrowser *This = impl_from_IShellBrowser(iface);
224     FIXME("%p %p\n", This, pshv);
225     return E_NOTIMPL;
226 }
227
228 static HRESULT WINAPI ShellBrowser_SetToolbarItems(
229         IShellBrowser* iface,
230         LPTBBUTTONSB lpButtons,
231         UINT nButtons,
232         UINT uFlags)
233 {
234     ShellBrowser *This = impl_from_IShellBrowser(iface);
235     FIXME("%p %p %u %u\n", This, lpButtons, nButtons, uFlags);
236     return E_NOTIMPL;
237 }
238
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
258 };
259
260 static inline ShellBrowser *impl_from_IBrowserService(IBrowserService *iface)
261 {
262     return CONTAINING_RECORD(iface, ShellBrowser, IBrowserService_iface);
263 }
264
265 static HRESULT WINAPI BrowserService_QueryInterface(
266         IBrowserService* iface,
267         REFIID riid,
268         void **ppvObject)
269 {
270     ShellBrowser *This = impl_from_IBrowserService(iface);
271     return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject);
272 }
273
274 static ULONG WINAPI BrowserService_AddRef(
275         IBrowserService *iface)
276 {
277     ShellBrowser *This = impl_from_IBrowserService(iface);
278     return IShellBrowser_AddRef(&This->IShellBrowser_iface);
279 }
280
281 static ULONG WINAPI BrowserService_Release(
282         IBrowserService* iface)
283 {
284     ShellBrowser *This = impl_from_IBrowserService(iface);
285     return IShellBrowser_Release(&This->IShellBrowser_iface);
286 }
287
288 static HRESULT WINAPI BrowserService_GetParentSite(
289         IBrowserService* iface,
290         IOleInPlaceSite **ppipsite)
291 {
292     ShellBrowser *This = impl_from_IBrowserService(iface);
293     FIXME("%p %p\n", This, ppipsite);
294     return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI BrowserService_SetTitle(
298         IBrowserService* iface,
299         IShellView *psv,
300         LPCWSTR pszName)
301 {
302     ShellBrowser *This = impl_from_IBrowserService(iface);
303     FIXME("%p %p %s\n", This, psv, debugstr_w(pszName));
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI BrowserService_GetTitle(
308         IBrowserService* iface,
309         IShellView *psv,
310         LPWSTR pszName,
311         DWORD cchName)
312 {
313     ShellBrowser *This = impl_from_IBrowserService(iface);
314     FIXME("%p %p %p %d\n", This, psv, pszName, cchName);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI BrowserService_GetOleObject(
319         IBrowserService* iface,
320         IOleObject **ppobjv)
321 {
322     ShellBrowser *This = impl_from_IBrowserService(iface);
323     FIXME("%p %p\n", This, ppobjv);
324     return E_NOTIMPL;
325 }
326
327 static HRESULT WINAPI BrowserService_GetTravelLog(
328         IBrowserService* iface,
329         ITravelLog **pptl)
330 {
331     ShellBrowser *This = impl_from_IBrowserService(iface);
332     FIXME("%p %p\n", This, pptl);
333     return E_NOTIMPL;
334 }
335
336 static HRESULT WINAPI BrowserService_ShowControlWindow(
337         IBrowserService* iface,
338         UINT id,
339         BOOL fShow)
340 {
341     ShellBrowser *This = impl_from_IBrowserService(iface);
342     FIXME("%p %u %d\n", This, id, fShow);
343     return E_NOTIMPL;
344 }
345
346 static HRESULT WINAPI BrowserService_IsControlWindowShown(
347         IBrowserService* iface,
348         UINT id,
349         BOOL *pfShown)
350 {
351     ShellBrowser *This = impl_from_IBrowserService(iface);
352     FIXME("%p %u %p\n", This, id, pfShown);
353     return E_NOTIMPL;
354 }
355
356 static HRESULT WINAPI BrowserService_IEGetDisplayName(
357         IBrowserService* iface,
358         PCIDLIST_ABSOLUTE pidl,
359         LPWSTR pwszName,
360         UINT uFlags)
361 {
362     ShellBrowser *This = impl_from_IBrowserService(iface);
363     FIXME("%p %p %p %u\n", This, pidl, pwszName, uFlags);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI BrowserService_IEParseDisplayName(
368         IBrowserService* iface,
369         UINT uiCP,
370         LPCWSTR pwszPath,
371         PIDLIST_ABSOLUTE *ppidlOut)
372 {
373     ShellBrowser *This = impl_from_IBrowserService(iface);
374     FIXME("%p %u %s %p\n", This, uiCP, debugstr_w(pwszPath), ppidlOut);
375     return E_NOTIMPL;
376 }
377
378 static HRESULT WINAPI BrowserService_DisplayParseError(
379         IBrowserService* iface,
380         HRESULT hres,
381         LPCWSTR pwszPath)
382 {
383     ShellBrowser *This = impl_from_IBrowserService(iface);
384     FIXME("%p %x %s\n", This, hres, debugstr_w(pwszPath));
385     return E_NOTIMPL;
386 }
387
388 static HRESULT WINAPI BrowserService_NavigateToPidl(
389         IBrowserService* iface,
390         PCIDLIST_ABSOLUTE pidl,
391         DWORD grfHLNF)
392 {
393     ShellBrowser *This = impl_from_IBrowserService(iface);
394     FIXME("%p %p %d\n", This, pidl, grfHLNF);
395     return E_NOTIMPL;
396 }
397
398 static HRESULT WINAPI BrowserService_SetNavigateState(
399         IBrowserService* iface,
400         BNSTATE bnstate)
401 {
402     ShellBrowser *This = impl_from_IBrowserService(iface);
403     FIXME("%p %d\n", This, bnstate);
404     return E_NOTIMPL;
405 }
406
407 static HRESULT WINAPI BrowserService_GetNavigateState(
408         IBrowserService* iface,
409         BNSTATE *pbnstate)
410 {
411     ShellBrowser *This = impl_from_IBrowserService(iface);
412     FIXME("%p %p\n", This, pbnstate);
413     return E_NOTIMPL;
414 }
415
416 static HRESULT WINAPI BrowserService_NotifyRedirect(
417         IBrowserService* iface,
418         IShellView *psv,
419         PCIDLIST_ABSOLUTE pidl,
420         BOOL *pfDidBrowse)
421 {
422     ShellBrowser *This = impl_from_IBrowserService(iface);
423     FIXME("%p %p %p %p\n", This, psv, pidl, pfDidBrowse);
424     return E_NOTIMPL;
425 }
426
427 static HRESULT WINAPI BrowserService_UpdateWindowList(
428         IBrowserService* iface)
429 {
430     ShellBrowser *This = impl_from_IBrowserService(iface);
431     FIXME("%p\n", This);
432     return E_NOTIMPL;
433 }
434
435 static HRESULT WINAPI BrowserService_UpdateBackForwardState(
436         IBrowserService* iface)
437 {
438     ShellBrowser *This = impl_from_IBrowserService(iface);
439     FIXME("%p\n", This);
440     return E_NOTIMPL;
441 }
442
443 static HRESULT WINAPI BrowserService_SetFlags(
444         IBrowserService* iface,
445         DWORD dwFlags,
446         DWORD dwFlagMask)
447 {
448     ShellBrowser *This = impl_from_IBrowserService(iface);
449     FIXME("%p %x %x\n", This, dwFlags, dwFlagMask);
450     return E_NOTIMPL;
451 }
452
453 static HRESULT WINAPI BrowserService_GetFlags(
454         IBrowserService* iface,
455         DWORD *pdwFlags)
456 {
457     ShellBrowser *This = impl_from_IBrowserService(iface);
458     FIXME("%p %p\n", This, pdwFlags);
459     return E_NOTIMPL;
460 }
461
462 static HRESULT WINAPI BrowserService_CanNavigateNow(
463         IBrowserService* iface)
464 {
465     ShellBrowser *This = impl_from_IBrowserService(iface);
466     FIXME("%p\n", This);
467     return E_NOTIMPL;
468 }
469
470 static HRESULT WINAPI BrowserService_GetPidl(
471         IBrowserService* iface,
472         PIDLIST_ABSOLUTE *ppidl)
473 {
474     ShellBrowser *This = impl_from_IBrowserService(iface);
475     FIXME("%p %p\n", This, ppidl);
476     return E_NOTIMPL;
477 }
478
479 static HRESULT WINAPI BrowserService_SetReferrer(
480         IBrowserService* iface,
481         PCIDLIST_ABSOLUTE pidl)
482 {
483     ShellBrowser *This = impl_from_IBrowserService(iface);
484     FIXME("%p %p\n", This, pidl);
485     return E_NOTIMPL;
486 }
487
488 static DWORD WINAPI BrowserService_GetBrowserIndex(
489         IBrowserService* iface)
490 {
491     ShellBrowser *This = impl_from_IBrowserService(iface);
492     FIXME("%p\n", This);
493     return E_NOTIMPL;
494 }
495
496 static HRESULT WINAPI BrowserService_GetBrowserByIndex(
497         IBrowserService* iface,
498         DWORD dwID,
499         IUnknown **ppunk)
500 {
501     ShellBrowser *This = impl_from_IBrowserService(iface);
502     FIXME("%p %x %p\n", This, dwID, ppunk);
503     return E_NOTIMPL;
504 }
505
506 static HRESULT WINAPI BrowserService_GetHistoryObject(
507         IBrowserService* iface,
508         IOleObject **ppole,
509         IStream **pstm,
510         IBindCtx **ppbc)
511 {
512     ShellBrowser *This = impl_from_IBrowserService(iface);
513     FIXME("%p %p %p %p\n", This, ppole, pstm, ppbc);
514     return E_NOTIMPL;
515 }
516
517 static HRESULT WINAPI BrowserService_SetHistoryObject(
518         IBrowserService* iface,
519         IOleObject *pole,
520         BOOL fIsLocalAnchor)
521 {
522     ShellBrowser *This = impl_from_IBrowserService(iface);
523     FIXME("%p %p %d\n", This, pole, fIsLocalAnchor);
524     return E_NOTIMPL;
525 }
526
527 static HRESULT WINAPI BrowserService_CacheOLEServer(
528         IBrowserService* iface,
529         IOleObject *pole)
530 {
531     ShellBrowser *This = impl_from_IBrowserService(iface);
532     FIXME("%p %p\n", This, pole);
533     return E_NOTIMPL;
534 }
535
536 static HRESULT WINAPI BrowserService_GetSetCodePage(
537         IBrowserService* iface,
538         VARIANT *pvarIn,
539         VARIANT *pvarOut)
540 {
541     ShellBrowser *This = impl_from_IBrowserService(iface);
542     FIXME("%p %p %p\n", This, pvarIn, pvarOut);
543     return E_NOTIMPL;
544 }
545
546 static HRESULT WINAPI BrowserService_OnHttpEquiv(
547         IBrowserService* iface,
548         IShellView *psv,
549         BOOL fDone,
550         VARIANT *pvarargIn,
551         VARIANT *pvarargOut)
552 {
553     ShellBrowser *This = impl_from_IBrowserService(iface);
554     FIXME("%p %p %d %p %p\n", This, psv, fDone, pvarargIn, pvarargOut);
555     return E_NOTIMPL;
556 }
557
558 static HRESULT WINAPI BrowserService_GetPalette(
559         IBrowserService* iface,
560         HPALETTE *hpal)
561 {
562     ShellBrowser *This = impl_from_IBrowserService(iface);
563     FIXME("%p %p\n", This, hpal);
564     return E_NOTIMPL;
565 }
566
567 static HRESULT WINAPI BrowserService_RegisterWindow(
568         IBrowserService* iface,
569         BOOL fForceRegister,
570         int swc)
571 {
572     ShellBrowser *This = impl_from_IBrowserService(iface);
573     FIXME("%p %d %d\n", This, fForceRegister, swc);
574     return E_NOTIMPL;
575 }
576
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
611 };
612
613 static inline ShellBrowser *impl_from_IDocObjectService(IDocObjectService *iface)
614 {
615     return CONTAINING_RECORD(iface, ShellBrowser, IDocObjectService_iface);
616 }
617
618 static HRESULT WINAPI DocObjectService_QueryInterface(
619         IDocObjectService* iface,
620         REFIID riid,
621         void **ppvObject)
622 {
623     ShellBrowser *This = impl_from_IDocObjectService(iface);
624     return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject);
625 }
626
627 static ULONG WINAPI DocObjectService_AddRef(
628         IDocObjectService* iface)
629 {
630     ShellBrowser *This = impl_from_IDocObjectService(iface);
631     return IShellBrowser_AddRef(&This->IShellBrowser_iface);
632 }
633
634 static ULONG WINAPI DocObjectService_Release(
635         IDocObjectService* iface)
636 {
637     ShellBrowser *This = impl_from_IDocObjectService(iface);
638     return IShellBrowser_Release(&This->IShellBrowser_iface);
639 }
640
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)
652 {
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;
659
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);
663
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;
671     }
672
673     V_VT(params) = VT_BOOL|VT_BYREF;
674     V_BOOLREF(params) = &cancel;
675
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;
680
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;
685
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;
691     }
692
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) = NULL;
697
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;
702
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);
707
708     V_VT(params+6) = (VT_DISPATCH);
709     V_DISPATCH(params+6) = (IDispatch*)This->doc_host->wb;
710
711     TRACE(">>>\n");
712     call_sink(This->doc_host->cps.wbe2, DISPID_BEFORENAVIGATE2, &dp);
713     TRACE("<<<\n");
714
715     SysFreeString(V_BSTR(&var_url));
716     SysFreeString(V_BSTR(&var_headers));
717     SafeArrayDestroy(post_data);
718
719     *pfCancel = !!cancel;
720     return S_OK;
721 }
722
723 static HRESULT WINAPI DocObjectService_FireNavigateComplete2(
724         IDocObjectService* iface,
725         IHTMLWindow2 *pHTMLWindow2,
726         DWORD dwFlags)
727 {
728     ShellBrowser *This = impl_from_IDocObjectService(iface);
729     DocHost *doc_host = This->doc_host;
730     IHTMLPrivateWindow *priv_window;
731     VARIANTARG params[2];
732     DISPPARAMS dp = {params, NULL, 2, 0};
733     VARIANT url_var;
734     BSTR url;
735     HRESULT hres;
736
737     TRACE("%p %p %x\n", This, pHTMLWindow2, dwFlags);
738
739     if(doc_host->travellog.loading_pos != -1) {
740         WARN("histupdate not notified\n");
741         doc_host->travellog.position = doc_host->travellog.loading_pos;
742         doc_host->travellog.loading_pos = -1;
743     }
744
745     hres = IHTMLWindow2_QueryInterface(pHTMLWindow2, &IID_IHTMLPrivateWindow, (void**)&priv_window);
746     if(FAILED(hres))
747         return hres;
748
749     hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url);
750     IHTMLPrivateWindow_Release(priv_window);
751     if(FAILED(hres))
752         return hres;
753
754     TRACE("got URL %s\n", debugstr_w(url));
755     set_dochost_url(This->doc_host, url);
756
757     V_VT(params) = (VT_BYREF|VT_VARIANT);
758     V_VARIANTREF(params) = &url_var;
759
760     V_VT(params+1) = VT_DISPATCH;
761     V_DISPATCH(params+1) = (IDispatch*)doc_host->wb;
762
763     V_VT(&url_var) = VT_BSTR;
764     V_BSTR(&url_var) = url;
765
766     TRACE(">>>\n");
767     call_sink(This->doc_host->cps.wbe2, DISPID_NAVIGATECOMPLETE2, &dp);
768     TRACE("<<<\n");
769
770     SysFreeString(url);
771
772     This->doc_host->busy = VARIANT_FALSE;
773     return S_OK;
774 }
775
776 static HRESULT WINAPI DocObjectService_FireDownloadBegin(
777         IDocObjectService* iface)
778 {
779     ShellBrowser *This = impl_from_IDocObjectService(iface);
780     FIXME("%p\n", This);
781     return E_NOTIMPL;
782 }
783
784 static HRESULT WINAPI DocObjectService_FireDownloadComplete(
785         IDocObjectService* iface)
786 {
787     ShellBrowser *This = impl_from_IDocObjectService(iface);
788     FIXME("%p\n", This);
789     return E_NOTIMPL;
790 }
791
792 static HRESULT WINAPI DocObjectService_FireDocumentComplete(
793         IDocObjectService* iface,
794         IHTMLWindow2 *pHTMLWindow,
795         DWORD dwFlags)
796 {
797     ShellBrowser *This = impl_from_IDocObjectService(iface);
798     IHTMLPrivateWindow *priv_window;
799     VARIANTARG params[2];
800     DISPPARAMS dp = {params, NULL, 2, 0};
801     VARIANT url_var;
802     BSTR url;
803     HRESULT hres;
804
805     TRACE("%p %p %x\n", This, pHTMLWindow, dwFlags);
806
807     hres = IHTMLWindow2_QueryInterface(pHTMLWindow, &IID_IHTMLPrivateWindow, (void**)&priv_window);
808     if(FAILED(hres))
809         return hres;
810
811     hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url);
812     IHTMLPrivateWindow_Release(priv_window);
813     if(FAILED(hres))
814         return hres;
815
816     TRACE("got URL %s\n", debugstr_w(url));
817
818     V_VT(params) = (VT_BYREF|VT_VARIANT);
819     V_VARIANTREF(params) = &url_var;
820
821     V_VT(params+1) = VT_DISPATCH;
822     V_DISPATCH(params+1) = (IDispatch*)This->doc_host->wb;
823
824     V_VT(&url_var) = VT_BSTR;
825     V_BSTR(&url_var) = url;
826
827     TRACE(">>>\n");
828     call_sink(This->doc_host->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dp);
829     TRACE("<<<\n");
830
831     SysFreeString(url);
832     This->doc_host->busy = VARIANT_FALSE;
833     return S_OK;
834 }
835
836 static HRESULT WINAPI DocObjectService_UpdateDesktopComponent(
837         IDocObjectService* iface,
838         IHTMLWindow2 *pHTMLWindow)
839 {
840     ShellBrowser *This = impl_from_IDocObjectService(iface);
841     FIXME("%p %p\n", This, pHTMLWindow);
842     return E_NOTIMPL;
843 }
844
845 static HRESULT WINAPI DocObjectService_GetPendingUrl(
846         IDocObjectService* iface,
847         BSTR *pbstrPendingUrl)
848 {
849     ShellBrowser *This = impl_from_IDocObjectService(iface);
850     FIXME("%p %p\n", This, pbstrPendingUrl);
851     return E_NOTIMPL;
852 }
853
854 static HRESULT WINAPI DocObjectService_ActiveElementChanged(
855         IDocObjectService* iface,
856         IHTMLElement *pHTMLElement)
857 {
858     ShellBrowser *This = impl_from_IDocObjectService(iface);
859     FIXME("%p %p\n", This, pHTMLElement);
860     return E_NOTIMPL;
861 }
862
863 static HRESULT WINAPI DocObjectService_GetUrlSearchComponent(
864         IDocObjectService* iface,
865         BSTR *pbstrSearch)
866 {
867     ShellBrowser *This = impl_from_IDocObjectService(iface);
868     FIXME("%p %p\n", This, pbstrSearch);
869     return E_NOTIMPL;
870 }
871
872 static HRESULT WINAPI DocObjectService_IsErrorUrl(
873         IDocObjectService* iface,
874         LPCWSTR lpszUrl,
875         BOOL *pfIsError)
876 {
877     ShellBrowser *This = impl_from_IDocObjectService(iface);
878     FIXME("%p %s %p\n", This, debugstr_w(lpszUrl), pfIsError);
879
880     *pfIsError = FALSE;
881     return S_OK;
882 }
883
884 static const IDocObjectServiceVtbl DocObjectServiceVtbl = {
885     DocObjectService_QueryInterface,
886     DocObjectService_AddRef,
887     DocObjectService_Release,
888     DocObjectService_FireBeforeNavigate2,
889     DocObjectService_FireNavigateComplete2,
890     DocObjectService_FireDownloadBegin,
891     DocObjectService_FireDownloadComplete,
892     DocObjectService_FireDocumentComplete,
893     DocObjectService_UpdateDesktopComponent,
894     DocObjectService_GetPendingUrl,
895     DocObjectService_ActiveElementChanged,
896     DocObjectService_GetUrlSearchComponent,
897     DocObjectService_IsErrorUrl
898 };
899
900 HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret)
901 {
902     ShellBrowser *sb;
903
904     sb = heap_alloc(sizeof(ShellBrowser));
905     if(!sb)
906         return E_OUTOFMEMORY;
907
908     sb->IShellBrowser_iface.lpVtbl = &ShellBrowserVtbl;
909     sb->IBrowserService_iface.lpVtbl = &BrowserServiceVtbl;
910     sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl;
911
912     sb->ref = 1;
913     sb->doc_host = doc_host;
914
915     *ret = sb;
916     return S_OK;
917 }
918
919 void detach_browser_service(ShellBrowser *sb)
920 {
921     sb->doc_host = NULL;
922     IShellBrowser_Release(&sb->IShellBrowser_iface);
923 }
924
925 static inline NewWindowManager *impl_from_INewWindowManager(INewWindowManager *iface)
926 {
927     return CONTAINING_RECORD(iface, NewWindowManager, INewWindowManager_iface);
928 }
929
930 static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv)
931 {
932     NewWindowManager *This = impl_from_INewWindowManager(iface);
933
934     if(IsEqualGUID(&IID_IUnknown, riid)) {
935         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
936         *ppv = &This->INewWindowManager_iface;
937     }else if(IsEqualGUID(&IID_INewWindowManager, riid)) {
938         TRACE("(%p)->(IID_INewWindowManager %p)\n", This, ppv);
939         *ppv = &This->INewWindowManager_iface;
940     }else {
941         WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
942         *ppv = NULL;
943         return E_NOINTERFACE;
944     }
945
946     IUnknown_AddRef((IUnknown*)*ppv);
947     return S_OK;
948 }
949
950 static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface)
951 {
952     NewWindowManager *This = impl_from_INewWindowManager(iface);
953
954     TRACE("(%p)\n", This);
955
956     return IOleClientSite_AddRef(&This->doc_host->IOleClientSite_iface);
957 }
958
959 static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface)
960 {
961     NewWindowManager *This = impl_from_INewWindowManager(iface);
962
963     TRACE("(%p)\n", This);
964
965     return IOleClientSite_Release(&This->doc_host->IOleClientSite_iface);
966 }
967
968 static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl,
969         LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags,
970         DWORD dwUserActionTime)
971 {
972     NewWindowManager *This = impl_from_INewWindowManager(iface);
973     FIXME("(%p)->(%s %s %s %s %x %x %d)\n", This, debugstr_w(pszUrl), debugstr_w(pszName), debugstr_w(pszUrlContext),
974           debugstr_w(pszFeatures), fReplace, dwFlags, dwUserActionTime);
975     return S_OK;
976 }
977
978 static const INewWindowManagerVtbl NewWindowManagerVtbl = {
979     NewWindowManager_QueryInterface,
980     NewWindowManager_AddRef,
981     NewWindowManager_Release,
982     NewWindowManager_EvaluateNewWindow
983 };
984
985 void NewWindowManager_Init(DocHost *doc_host)
986 {
987     doc_host->nwm.INewWindowManager_iface.lpVtbl = &NewWindowManagerVtbl;
988     doc_host->nwm.doc_host = doc_host;
989 }