xref: /reactos/dll/win32/ieframe/shellbrowser.c (revision c3cabdbf)
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 
impl_from_IShellBrowser(IShellBrowser * iface)32 static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface)
33 {
34     return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface);
35 }
36 
ShellBrowser_QueryInterface(IShellBrowser * iface,REFIID riid,void ** ppv)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 
ShellBrowser_AddRef(IShellBrowser * iface)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 
ShellBrowser_Release(IShellBrowser * iface)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 
ShellBrowser_GetWindow(IShellBrowser * iface,HWND * phwnd)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 
ShellBrowser_ContextSensitiveHelp(IShellBrowser * iface,BOOL fEnterMode)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 
ShellBrowser_InsertMenusSB(IShellBrowser * iface,HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths)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 
ShellBrowser_SetMenuSB(IShellBrowser * iface,HMENU hmenuShared,HOLEMENU holemenuReserved,HWND hwndActiveObject)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 
ShellBrowser_RemoveMenusSB(IShellBrowser * iface,HMENU hmenuShared)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 
ShellBrowser_SetStatusTextSB(IShellBrowser * iface,LPCOLESTR pszStatusText)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 
ShellBrowser_EnableModelessSB(IShellBrowser * iface,BOOL fEnable)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 
ShellBrowser_TranslateAcceleratorSB(IShellBrowser * iface,MSG * pmsg,WORD wID)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 
ShellBrowser_BrowseObject(IShellBrowser * iface,LPCITEMIDLIST pidl,UINT wFlags)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 
ShellBrowser_GetViewStateStream(IShellBrowser * iface,DWORD grfMode,IStream ** ppStrm)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 
ShellBrowser_GetControlWindow(IShellBrowser * iface,UINT id,HWND * phwnd)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 
ShellBrowser_SendControlMsg(IShellBrowser * iface,UINT id,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT * pret)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 
ShellBrowser_QueryActiveShellView(IShellBrowser * iface,IShellView ** ppshv)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 
ShellBrowser_OnViewWindowActive(IShellBrowser * iface,IShellView * pshv)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 
ShellBrowser_SetToolbarItems(IShellBrowser * iface,LPTBBUTTONSB lpButtons,UINT nButtons,UINT uFlags)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 
impl_from_IBrowserService(IBrowserService * iface)261 static inline ShellBrowser *impl_from_IBrowserService(IBrowserService *iface)
262 {
263     return CONTAINING_RECORD(iface, ShellBrowser, IBrowserService_iface);
264 }
265 
BrowserService_QueryInterface(IBrowserService * iface,REFIID riid,void ** ppvObject)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 
BrowserService_AddRef(IBrowserService * iface)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 
BrowserService_Release(IBrowserService * iface)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 
BrowserService_GetParentSite(IBrowserService * iface,IOleInPlaceSite ** ppipsite)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 
BrowserService_SetTitle(IBrowserService * iface,IShellView * psv,LPCWSTR pszName)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 
BrowserService_GetTitle(IBrowserService * iface,IShellView * psv,LPWSTR pszName,DWORD cchName)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 
BrowserService_GetOleObject(IBrowserService * iface,IOleObject ** ppobjv)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 
BrowserService_GetTravelLog(IBrowserService * iface,ITravelLog ** pptl)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 
BrowserService_ShowControlWindow(IBrowserService * iface,UINT id,BOOL fShow)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 
BrowserService_IsControlWindowShown(IBrowserService * iface,UINT id,BOOL * pfShown)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 
BrowserService_IEGetDisplayName(IBrowserService * iface,PCIDLIST_ABSOLUTE pidl,LPWSTR pwszName,UINT uFlags)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 
BrowserService_IEParseDisplayName(IBrowserService * iface,UINT uiCP,LPCWSTR pwszPath,PIDLIST_ABSOLUTE * ppidlOut)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 
BrowserService_DisplayParseError(IBrowserService * iface,HRESULT hres,LPCWSTR pwszPath)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 
BrowserService_NavigateToPidl(IBrowserService * iface,PCIDLIST_ABSOLUTE pidl,DWORD grfHLNF)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 
BrowserService_SetNavigateState(IBrowserService * iface,BNSTATE bnstate)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 
BrowserService_GetNavigateState(IBrowserService * iface,BNSTATE * pbnstate)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 
BrowserService_NotifyRedirect(IBrowserService * iface,IShellView * psv,PCIDLIST_ABSOLUTE pidl,BOOL * pfDidBrowse)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 
BrowserService_UpdateWindowList(IBrowserService * iface)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 
BrowserService_UpdateBackForwardState(IBrowserService * iface)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 
BrowserService_SetFlags(IBrowserService * iface,DWORD dwFlags,DWORD dwFlagMask)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 
BrowserService_GetFlags(IBrowserService * iface,DWORD * pdwFlags)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 
BrowserService_CanNavigateNow(IBrowserService * iface)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 
BrowserService_GetPidl(IBrowserService * iface,PIDLIST_ABSOLUTE * ppidl)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 
BrowserService_SetReferrer(IBrowserService * iface,PCIDLIST_ABSOLUTE pidl)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 
BrowserService_GetBrowserIndex(IBrowserService * iface)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 
BrowserService_GetBrowserByIndex(IBrowserService * iface,DWORD dwID,IUnknown ** ppunk)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 
BrowserService_GetHistoryObject(IBrowserService * iface,IOleObject ** ppole,IStream ** pstm,IBindCtx ** ppbc)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 
BrowserService_SetHistoryObject(IBrowserService * iface,IOleObject * pole,BOOL fIsLocalAnchor)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 
BrowserService_CacheOLEServer(IBrowserService * iface,IOleObject * pole)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 
BrowserService_GetSetCodePage(IBrowserService * iface,VARIANT * pvarIn,VARIANT * pvarOut)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 
BrowserService_OnHttpEquiv(IBrowserService * iface,IShellView * psv,BOOL fDone,VARIANT * pvarargIn,VARIANT * pvarargOut)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 
BrowserService_GetPalette(IBrowserService * iface,HPALETTE * hpal)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 
BrowserService_RegisterWindow(IBrowserService * iface,BOOL fForceRegister,int swc)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 
impl_from_IDocObjectService(IDocObjectService * iface)614 static inline ShellBrowser *impl_from_IDocObjectService(IDocObjectService *iface)
615 {
616     return CONTAINING_RECORD(iface, ShellBrowser, IDocObjectService_iface);
617 }
618 
DocObjectService_QueryInterface(IDocObjectService * iface,REFIID riid,void ** ppvObject)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 
DocObjectService_AddRef(IDocObjectService * iface)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 
DocObjectService_Release(IDocObjectService * iface)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 
DocObjectService_FireBeforeNavigate2(IDocObjectService * iface,IDispatch * pDispatch,LPCWSTR lpszUrl,DWORD dwFlags,LPCWSTR lpszFrameName,BYTE * pPostData,DWORD cbPostData,LPCWSTR lpszHeaders,BOOL fPlayNavSound,BOOL * pfCancel)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 
DocObjectService_FireNavigateComplete2(IDocObjectService * iface,IHTMLWindow2 * pHTMLWindow2,DWORD dwFlags)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     IShellBrowser_Release(&This->IShellBrowser_iface);
790     return S_OK;
791 }
792 
DocObjectService_FireDownloadBegin(IDocObjectService * iface)793 static 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 
DocObjectService_FireDownloadComplete(IDocObjectService * iface)801 static 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 
DocObjectService_FireDocumentComplete(IDocObjectService * iface,IHTMLWindow2 * pHTMLWindow,DWORD dwFlags)809 static 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 
DocObjectService_UpdateDesktopComponent(IDocObjectService * iface,IHTMLWindow2 * pHTMLWindow)857 static 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 
DocObjectService_GetPendingUrl(IDocObjectService * iface,BSTR * pbstrPendingUrl)866 static 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 
DocObjectService_ActiveElementChanged(IDocObjectService * iface,IHTMLElement * pHTMLElement)875 static 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 
DocObjectService_GetUrlSearchComponent(IDocObjectService * iface,BSTR * pbstrSearch)884 static 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 
DocObjectService_IsErrorUrl(IDocObjectService * iface,LPCWSTR lpszUrl,BOOL * pfIsError)893 static 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 
905 static 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 
create_browser_service(DocHost * doc_host,ShellBrowser ** ret)921 HRESULT 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 
detach_browser_service(ShellBrowser * sb)940 void detach_browser_service(ShellBrowser *sb)
941 {
942     sb->doc_host = NULL;
943     IShellBrowser_Release(&sb->IShellBrowser_iface);
944 }
945 
impl_from_INewWindowManager(INewWindowManager * iface)946 static inline NewWindowManager *impl_from_INewWindowManager(INewWindowManager *iface)
947 {
948     return CONTAINING_RECORD(iface, NewWindowManager, INewWindowManager_iface);
949 }
950 
NewWindowManager_QueryInterface(INewWindowManager * iface,REFIID riid,void ** ppv)951 static 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 
NewWindowManager_AddRef(INewWindowManager * iface)971 static 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 
NewWindowManager_Release(INewWindowManager * iface)980 static 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 
NewWindowManager_EvaluateNewWindow(INewWindowManager * iface,LPCWSTR pszUrl,LPCWSTR pszName,LPCWSTR pszUrlContext,LPCWSTR pszFeatures,BOOL fReplace,DWORD dwFlags,DWORD dwUserActionTime)989 static 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 
999 static const INewWindowManagerVtbl NewWindowManagerVtbl = {
1000     NewWindowManager_QueryInterface,
1001     NewWindowManager_AddRef,
1002     NewWindowManager_Release,
1003     NewWindowManager_EvaluateNewWindow
1004 };
1005 
NewWindowManager_Init(DocHost * doc_host)1006 void NewWindowManager_Init(DocHost *doc_host)
1007 {
1008     doc_host->nwm.INewWindowManager_iface.lpVtbl = &NewWindowManagerVtbl;
1009     doc_host->nwm.doc_host = doc_host;
1010 }
1011