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