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