78e0e85a799ba76eaff9e42d05bef9126163af37
[reactos.git] / 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 <assert.h>
23
24 #include "ieframe.h"
25 #include "exdispid.h"
26 #include "shlwapi.h"
27
28 #include "wine/debug.h"
29
30 WINE_DEFAULT_DEBUG_CHANNEL(ieframe);
31
32 static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface)
33 {
34 return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface);
35 }
36
37 static 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
66 static 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
77 static 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
92 static 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
101 static 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
110 static 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
120 static 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
131 static 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
140 static 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
149 static 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
158 static 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
168 static 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
178 static 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
188 static 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
198 static 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
211 static 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
220 static 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
229 static 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
240 static 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
261 static inline ShellBrowser *impl_from_IBrowserService(IBrowserService *iface)
262 {
263 return CONTAINING_RECORD(iface, ShellBrowser, IBrowserService_iface);
264 }
265
266 static 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
275 static ULONG WINAPI BrowserService_AddRef(
276 IBrowserService *iface)
277 {
278 ShellBrowser *This = impl_from_IBrowserService(iface);
279 return IShellBrowser_AddRef(&This->IShellBrowser_iface);
280 }
281
282 static ULONG WINAPI BrowserService_Release(
283 IBrowserService* iface)
284 {
285 ShellBrowser *This = impl_from_IBrowserService(iface);
286 return IShellBrowser_Release(&This->IShellBrowser_iface);
287 }
288
289 static 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
298 static 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
308 static 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
319 static 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
328 static 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
337 static 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
347 static 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
357 static 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
368 static 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
379 static 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
389 static 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
399 static 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
408 static 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
417 static 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
428 static 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
436 static 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
444 static 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
454 static 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
463 static 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
471 static 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
480 static 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
489 static 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
497 static 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
507 static 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
518 static 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
528 static 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
537 static 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
547 static 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
559 static 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
568 static 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
578 static 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
614 static inline ShellBrowser *impl_from_IDocObjectService(IDocObjectService *iface)
615 {
616 return CONTAINING_RECORD(iface, ShellBrowser, IDocObjectService_iface);
617 }
618
619 static 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
628 static ULONG WINAPI DocObjectService_AddRef(
629 IDocObjectService* iface)
630 {
631 ShellBrowser *This = impl_from_IDocObjectService(iface);
632 return IShellBrowser_AddRef(&This->IShellBrowser_iface);
633 }
634
635 static ULONG WINAPI DocObjectService_Release(
636 IDocObjectService* iface)
637 {
638 ShellBrowser *This = impl_from_IDocObjectService(iface);
639 return IShellBrowser_Release(&This->IShellBrowser_iface);
640 }
641
642 static 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
735 static 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 This->doc_host->busy = VARIANT_FALSE;
790 IShellBrowser_Release(&This->IShellBrowser_iface);
791 return S_OK;
792 }
793
794 static HRESULT WINAPI DocObjectService_FireDownloadBegin(
795 IDocObjectService* iface)
796 {
797 ShellBrowser *This = impl_from_IDocObjectService(iface);
798 FIXME("%p\n", This);
799 return E_NOTIMPL;
800 }
801
802 static HRESULT WINAPI DocObjectService_FireDownloadComplete(
803 IDocObjectService* iface)
804 {
805 ShellBrowser *This = impl_from_IDocObjectService(iface);
806 FIXME("%p\n", This);
807 return E_NOTIMPL;
808 }
809
810 static HRESULT WINAPI DocObjectService_FireDocumentComplete(
811 IDocObjectService* iface,
812 IHTMLWindow2 *pHTMLWindow,
813 DWORD dwFlags)
814 {
815 ShellBrowser *This = impl_from_IDocObjectService(iface);
816 IHTMLPrivateWindow *priv_window;
817 VARIANTARG params[2];
818 DISPPARAMS dp = {params, NULL, 2, 0};
819 VARIANT url_var;
820 BSTR url;
821 HRESULT hres;
822
823 TRACE("%p %p %x\n", This, pHTMLWindow, dwFlags);
824
825 hres = IHTMLWindow2_QueryInterface(pHTMLWindow, &IID_IHTMLPrivateWindow, (void**)&priv_window);
826 if(FAILED(hres))
827 return hres;
828
829 hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &url);
830 IHTMLPrivateWindow_Release(priv_window);
831 if(FAILED(hres))
832 return hres;
833
834 TRACE("got URL %s\n", debugstr_w(url));
835
836 V_VT(params) = (VT_BYREF|VT_VARIANT);
837 V_VARIANTREF(params) = &url_var;
838
839 V_VT(params+1) = VT_DISPATCH;
840 V_DISPATCH(params+1) = (IDispatch*)This->doc_host->wb;
841
842 V_VT(&url_var) = VT_BSTR;
843 V_BSTR(&url_var) = url;
844
845 /* Keep reference to This. It may be released in event handler. */
846 IShellBrowser_AddRef(&This->IShellBrowser_iface);
847
848 TRACE(">>>\n");
849 call_sink(This->doc_host->cps.wbe2, DISPID_DOCUMENTCOMPLETE, &dp);
850 TRACE("<<<\n");
851
852 SysFreeString(url);
853 if(This->doc_host)
854 This->doc_host->busy = VARIANT_FALSE;
855
856 IShellBrowser_Release(&This->IShellBrowser_iface);
857 return S_OK;
858 }
859
860 static HRESULT WINAPI DocObjectService_UpdateDesktopComponent(
861 IDocObjectService* iface,
862 IHTMLWindow2 *pHTMLWindow)
863 {
864 ShellBrowser *This = impl_from_IDocObjectService(iface);
865 FIXME("%p %p\n", This, pHTMLWindow);
866 return E_NOTIMPL;
867 }
868
869 static HRESULT WINAPI DocObjectService_GetPendingUrl(
870 IDocObjectService* iface,
871 BSTR *pbstrPendingUrl)
872 {
873 ShellBrowser *This = impl_from_IDocObjectService(iface);
874 FIXME("%p %p\n", This, pbstrPendingUrl);
875 return E_NOTIMPL;
876 }
877
878 static HRESULT WINAPI DocObjectService_ActiveElementChanged(
879 IDocObjectService* iface,
880 IHTMLElement *pHTMLElement)
881 {
882 ShellBrowser *This = impl_from_IDocObjectService(iface);
883 FIXME("%p %p\n", This, pHTMLElement);
884 return E_NOTIMPL;
885 }
886
887 static HRESULT WINAPI DocObjectService_GetUrlSearchComponent(
888 IDocObjectService* iface,
889 BSTR *pbstrSearch)
890 {
891 ShellBrowser *This = impl_from_IDocObjectService(iface);
892 FIXME("%p %p\n", This, pbstrSearch);
893 return E_NOTIMPL;
894 }
895
896 static HRESULT WINAPI DocObjectService_IsErrorUrl(
897 IDocObjectService* iface,
898 LPCWSTR lpszUrl,
899 BOOL *pfIsError)
900 {
901 ShellBrowser *This = impl_from_IDocObjectService(iface);
902 FIXME("%p %s %p\n", This, debugstr_w(lpszUrl), pfIsError);
903
904 *pfIsError = FALSE;
905 return S_OK;
906 }
907
908 static const IDocObjectServiceVtbl DocObjectServiceVtbl = {
909 DocObjectService_QueryInterface,
910 DocObjectService_AddRef,
911 DocObjectService_Release,
912 DocObjectService_FireBeforeNavigate2,
913 DocObjectService_FireNavigateComplete2,
914 DocObjectService_FireDownloadBegin,
915 DocObjectService_FireDownloadComplete,
916 DocObjectService_FireDocumentComplete,
917 DocObjectService_UpdateDesktopComponent,
918 DocObjectService_GetPendingUrl,
919 DocObjectService_ActiveElementChanged,
920 DocObjectService_GetUrlSearchComponent,
921 DocObjectService_IsErrorUrl
922 };
923
924 HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret)
925 {
926 ShellBrowser *sb;
927
928 sb = heap_alloc(sizeof(ShellBrowser));
929 if(!sb)
930 return E_OUTOFMEMORY;
931
932 sb->IShellBrowser_iface.lpVtbl = &ShellBrowserVtbl;
933 sb->IBrowserService_iface.lpVtbl = &BrowserServiceVtbl;
934 sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl;
935
936 sb->ref = 1;
937 sb->doc_host = doc_host;
938
939 *ret = sb;
940 return S_OK;
941 }
942
943 void detach_browser_service(ShellBrowser *sb)
944 {
945 sb->doc_host = NULL;
946 IShellBrowser_Release(&sb->IShellBrowser_iface);
947 }
948
949 static inline NewWindowManager *impl_from_INewWindowManager(INewWindowManager *iface)
950 {
951 return CONTAINING_RECORD(iface, NewWindowManager, INewWindowManager_iface);
952 }
953
954 static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv)
955 {
956 NewWindowManager *This = impl_from_INewWindowManager(iface);
957
958 if(IsEqualGUID(&IID_IUnknown, riid)) {
959 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
960 *ppv = &This->INewWindowManager_iface;
961 }else if(IsEqualGUID(&IID_INewWindowManager, riid)) {
962 TRACE("(%p)->(IID_INewWindowManager %p)\n", This, ppv);
963 *ppv = &This->INewWindowManager_iface;
964 }else {
965 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
966 *ppv = NULL;
967 return E_NOINTERFACE;
968 }
969
970 IUnknown_AddRef((IUnknown*)*ppv);
971 return S_OK;
972 }
973
974 static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface)
975 {
976 NewWindowManager *This = impl_from_INewWindowManager(iface);
977
978 TRACE("(%p)\n", This);
979
980 return IOleClientSite_AddRef(&This->doc_host->IOleClientSite_iface);
981 }
982
983 static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface)
984 {
985 NewWindowManager *This = impl_from_INewWindowManager(iface);
986
987 TRACE("(%p)\n", This);
988
989 return IOleClientSite_Release(&This->doc_host->IOleClientSite_iface);
990 }
991
992 static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl,
993 LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags,
994 DWORD dwUserActionTime)
995 {
996 NewWindowManager *This = impl_from_INewWindowManager(iface);
997 FIXME("(%p)->(%s %s %s %s %x %x %d)\n", This, debugstr_w(pszUrl), debugstr_w(pszName), debugstr_w(pszUrlContext),
998 debugstr_w(pszFeatures), fReplace, dwFlags, dwUserActionTime);
999 return S_OK;
1000 }
1001
1002 static const INewWindowManagerVtbl NewWindowManagerVtbl = {
1003 NewWindowManager_QueryInterface,
1004 NewWindowManager_AddRef,
1005 NewWindowManager_Release,
1006 NewWindowManager_EvaluateNewWindow
1007 };
1008
1009 void NewWindowManager_Init(DocHost *doc_host)
1010 {
1011 doc_host->nwm.INewWindowManager_iface.lpVtbl = &NewWindowManagerVtbl;
1012 doc_host->nwm.doc_host = doc_host;
1013 }