msxml3: Basic tests for startElement().
[wine] / dlls / shdocvw / shellbrowser.c
1 /*
2  * Implementation of IShellBrowser interface
3  *
4  * Copyright 2011 Piotr Caban for CodeWeavers
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "wine/debug.h"
22 #include "shdocvw.h"
23 #include "shdeprecated.h"
24 #include "docobjectservice.h"
25
26 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
27
28 typedef struct {
29     IShellBrowser IShellBrowser_iface;
30     IBrowserService IBrowserService_iface;
31     IDocObjectService IDocObjectService_iface;
32
33     LONG ref;
34 } ShellBrowser;
35
36 static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface)
37 {
38     return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface);
39 }
40
41 static HRESULT WINAPI ShellBrowser_QueryInterface(
42         IShellBrowser* iface,
43         REFIID riid,
44         void **ppvObject)
45 {
46     ShellBrowser *This = impl_from_IShellBrowser(iface);
47     *ppvObject = NULL;
48
49     if(IsEqualGUID(&IID_IShellBrowser, riid) || IsEqualGUID(&IID_IOleWindow, riid)
50         || IsEqualGUID(&IID_IUnknown, riid))
51         *ppvObject = &This->IShellBrowser_iface;
52     else if(IsEqualGUID(&IID_IBrowserService, riid))
53         *ppvObject = &This->IBrowserService_iface;
54     else if(IsEqualGUID(&IID_IDocObjectService, riid))
55         *ppvObject = &This->IDocObjectService_iface;
56
57     if(*ppvObject) {
58         TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
59         IUnknown_AddRef((IUnknown*)*ppvObject);
60         return S_OK;
61     }
62
63     FIXME("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
64     return E_NOINTERFACE;
65 }
66
67 static ULONG WINAPI ShellBrowser_AddRef(
68         IShellBrowser* iface)
69 {
70     ShellBrowser *This = impl_from_IShellBrowser(iface);
71     LONG ref = InterlockedIncrement(&This->ref);
72
73     TRACE("(%p) ref=%d\n", This, ref);
74
75     return ref;
76 }
77
78 static ULONG WINAPI ShellBrowser_Release(
79         IShellBrowser* iface)
80 {
81     ShellBrowser *This = impl_from_IShellBrowser(iface);
82     LONG ref = InterlockedDecrement(&This->ref);
83
84     TRACE("(%p) ref=%d\n", This, ref);
85
86     if(!ref)
87         heap_free(This);
88     return ref;
89 }
90
91 static HRESULT WINAPI ShellBrowser_GetWindow(
92         IShellBrowser* iface,
93         HWND *phwnd)
94 {
95     ShellBrowser *This = impl_from_IShellBrowser(iface);
96     FIXME("%p %p\n", This, phwnd);
97     return E_NOTIMPL;
98 }
99
100 static HRESULT WINAPI ShellBrowser_ContextSensitiveHelp(
101         IShellBrowser* iface,
102         BOOL fEnterMode)
103 {
104     ShellBrowser *This = impl_from_IShellBrowser(iface);
105     FIXME("%p %d\n", This, fEnterMode);
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI ShellBrowser_InsertMenusSB(
110         IShellBrowser* iface,
111         HMENU hmenuShared,
112         LPOLEMENUGROUPWIDTHS lpMenuWidths)
113 {
114     ShellBrowser *This = impl_from_IShellBrowser(iface);
115     FIXME("%p %p %p\n", This, hmenuShared, lpMenuWidths);
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI ShellBrowser_SetMenuSB(
120         IShellBrowser* iface,
121         HMENU hmenuShared,
122         HOLEMENU holemenuReserved,
123         HWND hwndActiveObject)
124 {
125     ShellBrowser *This = impl_from_IShellBrowser(iface);
126     FIXME("%p %p %p %p\n", This, hmenuShared, holemenuReserved, hwndActiveObject);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI ShellBrowser_RemoveMenusSB(
131         IShellBrowser* iface,
132         HMENU hmenuShared)
133 {
134     ShellBrowser *This = impl_from_IShellBrowser(iface);
135     FIXME("%p %p\n", This, hmenuShared);
136     return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI ShellBrowser_SetStatusTextSB(
140         IShellBrowser* iface,
141         LPCOLESTR pszStatusText)
142 {
143     ShellBrowser *This = impl_from_IShellBrowser(iface);
144     FIXME("%p %s\n", This, debugstr_w(pszStatusText));
145     return E_NOTIMPL;
146 }
147
148 static HRESULT WINAPI ShellBrowser_EnableModelessSB(
149         IShellBrowser* iface,
150         BOOL fEnable)
151 {
152     ShellBrowser *This = impl_from_IShellBrowser(iface);
153     FIXME("%p %d\n", This, fEnable);
154     return E_NOTIMPL;
155 }
156
157 static HRESULT WINAPI ShellBrowser_TranslateAcceleratorSB(
158         IShellBrowser* iface,
159         MSG *pmsg,
160         WORD wID)
161 {
162     ShellBrowser *This = impl_from_IShellBrowser(iface);
163     FIXME("%p %p %d\n", This, pmsg, (int)wID);
164     return E_NOTIMPL;
165 }
166
167 static HRESULT WINAPI ShellBrowser_BrowseObject(
168         IShellBrowser* iface,
169         LPCITEMIDLIST pidl,
170         UINT wFlags)
171 {
172     ShellBrowser *This = impl_from_IShellBrowser(iface);
173     FIXME("%p %p %u\n", This, pidl, wFlags);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI ShellBrowser_GetViewStateStream(
178         IShellBrowser* iface,
179         DWORD grfMode,
180         IStream **ppStrm)
181 {
182     ShellBrowser *This = impl_from_IShellBrowser(iface);
183     FIXME("%p %x %p\n", This, grfMode, ppStrm);
184     return E_NOTIMPL;
185 }
186
187 static HRESULT WINAPI ShellBrowser_GetControlWindow(
188         IShellBrowser* iface,
189         UINT id,
190         HWND *phwnd)
191 {
192     ShellBrowser *This = impl_from_IShellBrowser(iface);
193     FIXME("%p %u %p\n", This, id, phwnd);
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI ShellBrowser_SendControlMsg(
198         IShellBrowser* iface,
199         UINT id,
200         UINT uMsg,
201         WPARAM wParam,
202         LPARAM lParam,
203         LRESULT *pret)
204 {
205     ShellBrowser *This = impl_from_IShellBrowser(iface);
206     FIXME("%p %u %u %p\n", This, id, uMsg, pret);
207     return E_NOTIMPL;
208 }
209
210 static HRESULT WINAPI ShellBrowser_QueryActiveShellView(
211         IShellBrowser* iface,
212         IShellView **ppshv)
213 {
214     ShellBrowser *This = impl_from_IShellBrowser(iface);
215     FIXME("%p %p\n", This, ppshv);
216     return E_NOTIMPL;
217 }
218
219 static HRESULT WINAPI ShellBrowser_OnViewWindowActive(
220         IShellBrowser* iface,
221         IShellView *pshv)
222 {
223     ShellBrowser *This = impl_from_IShellBrowser(iface);
224     FIXME("%p %p\n", This, pshv);
225     return E_NOTIMPL;
226 }
227
228 static HRESULT WINAPI ShellBrowser_SetToolbarItems(
229         IShellBrowser* iface,
230         LPTBBUTTONSB lpButtons,
231         UINT nButtons,
232         UINT uFlags)
233 {
234     ShellBrowser *This = impl_from_IShellBrowser(iface);
235     FIXME("%p %p %u %u\n", This, lpButtons, nButtons, uFlags);
236     return E_NOTIMPL;
237 }
238
239 static const IShellBrowserVtbl ShellBrowserVtbl = {
240     ShellBrowser_QueryInterface,
241     ShellBrowser_AddRef,
242     ShellBrowser_Release,
243     ShellBrowser_GetWindow,
244     ShellBrowser_ContextSensitiveHelp,
245     ShellBrowser_InsertMenusSB,
246     ShellBrowser_SetMenuSB,
247     ShellBrowser_RemoveMenusSB,
248     ShellBrowser_SetStatusTextSB,
249     ShellBrowser_EnableModelessSB,
250     ShellBrowser_TranslateAcceleratorSB,
251     ShellBrowser_BrowseObject,
252     ShellBrowser_GetViewStateStream,
253     ShellBrowser_GetControlWindow,
254     ShellBrowser_SendControlMsg,
255     ShellBrowser_QueryActiveShellView,
256     ShellBrowser_OnViewWindowActive,
257     ShellBrowser_SetToolbarItems
258 };
259
260 static inline ShellBrowser *impl_from_IBrowserService(IBrowserService *iface)
261 {
262     return CONTAINING_RECORD(iface, ShellBrowser, IBrowserService_iface);
263 }
264
265 static HRESULT WINAPI BrowserService_QueryInterface(
266         IBrowserService* iface,
267         REFIID riid,
268         void **ppvObject)
269 {
270     ShellBrowser *This = impl_from_IBrowserService(iface);
271     return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject);
272 }
273
274 static ULONG WINAPI BrowserService_AddRef(
275         IBrowserService *iface)
276 {
277     ShellBrowser *This = impl_from_IBrowserService(iface);
278     return IShellBrowser_AddRef(&This->IShellBrowser_iface);
279 }
280
281 static ULONG WINAPI BrowserService_Release(
282         IBrowserService* iface)
283 {
284     ShellBrowser *This = impl_from_IBrowserService(iface);
285     return IShellBrowser_Release(&This->IShellBrowser_iface);
286 }
287
288 static HRESULT WINAPI BrowserService_GetParentSite(
289         IBrowserService* iface,
290         IOleInPlaceSite **ppipsite)
291 {
292     ShellBrowser *This = impl_from_IBrowserService(iface);
293     FIXME("%p %p\n", This, ppipsite);
294     return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI BrowserService_SetTitle(
298         IBrowserService* iface,
299         IShellView *psv,
300         LPCWSTR pszName)
301 {
302     ShellBrowser *This = impl_from_IBrowserService(iface);
303     FIXME("%p %p %s\n", This, psv, debugstr_w(pszName));
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI BrowserService_GetTitle(
308         IBrowserService* iface,
309         IShellView *psv,
310         LPWSTR pszName,
311         DWORD cchName)
312 {
313     ShellBrowser *This = impl_from_IBrowserService(iface);
314     FIXME("%p %p %p %d\n", This, psv, pszName, cchName);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI BrowserService_GetOleObject(
319         IBrowserService* iface,
320         IOleObject **ppobjv)
321 {
322     ShellBrowser *This = impl_from_IBrowserService(iface);
323     FIXME("%p %p\n", This, ppobjv);
324     return E_NOTIMPL;
325 }
326
327 static HRESULT WINAPI BrowserService_GetTravelLog(
328         IBrowserService* iface,
329         ITravelLog **pptl)
330 {
331     ShellBrowser *This = impl_from_IBrowserService(iface);
332     FIXME("%p %p\n", This, pptl);
333     return E_NOTIMPL;
334 }
335
336 static HRESULT WINAPI BrowserService_ShowControlWindow(
337         IBrowserService* iface,
338         UINT id,
339         BOOL fShow)
340 {
341     ShellBrowser *This = impl_from_IBrowserService(iface);
342     FIXME("%p %u %d\n", This, id, fShow);
343     return E_NOTIMPL;
344 }
345
346 static HRESULT WINAPI BrowserService_IsControlWindowShown(
347         IBrowserService* iface,
348         UINT id,
349         BOOL *pfShown)
350 {
351     ShellBrowser *This = impl_from_IBrowserService(iface);
352     FIXME("%p %u %p\n", This, id, pfShown);
353     return E_NOTIMPL;
354 }
355
356 static HRESULT WINAPI BrowserService_IEGetDisplayName(
357         IBrowserService* iface,
358         PCIDLIST_ABSOLUTE pidl,
359         LPWSTR pwszName,
360         UINT uFlags)
361 {
362     ShellBrowser *This = impl_from_IBrowserService(iface);
363     FIXME("%p %p %p %u\n", This, pidl, pwszName, uFlags);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI BrowserService_IEParseDisplayName(
368         IBrowserService* iface,
369         UINT uiCP,
370         LPCWSTR pwszPath,
371         PIDLIST_ABSOLUTE *ppidlOut)
372 {
373     ShellBrowser *This = impl_from_IBrowserService(iface);
374     FIXME("%p %u %s %p\n", This, uiCP, debugstr_w(pwszPath), ppidlOut);
375     return E_NOTIMPL;
376 }
377
378 static HRESULT WINAPI BrowserService_DisplayParseError(
379         IBrowserService* iface,
380         HRESULT hres,
381         LPCWSTR pwszPath)
382 {
383     ShellBrowser *This = impl_from_IBrowserService(iface);
384     FIXME("%p %x %s\n", This, hres, debugstr_w(pwszPath));
385     return E_NOTIMPL;
386 }
387
388 static HRESULT WINAPI BrowserService_NavigateToPidl(
389         IBrowserService* iface,
390         PCIDLIST_ABSOLUTE pidl,
391         DWORD grfHLNF)
392 {
393     ShellBrowser *This = impl_from_IBrowserService(iface);
394     FIXME("%p %p %d\n", This, pidl, grfHLNF);
395     return E_NOTIMPL;
396 }
397
398 static HRESULT WINAPI BrowserService_SetNavigateState(
399         IBrowserService* iface,
400         BNSTATE bnstate)
401 {
402     ShellBrowser *This = impl_from_IBrowserService(iface);
403     FIXME("%p %d\n", This, bnstate);
404     return E_NOTIMPL;
405 }
406
407 static HRESULT WINAPI BrowserService_GetNavigateState(
408         IBrowserService* iface,
409         BNSTATE *pbnstate)
410 {
411     ShellBrowser *This = impl_from_IBrowserService(iface);
412     FIXME("%p %p\n", This, pbnstate);
413     return E_NOTIMPL;
414 }
415
416 static HRESULT WINAPI BrowserService_NotifyRedirect(
417         IBrowserService* iface,
418         IShellView *psv,
419         PCIDLIST_ABSOLUTE pidl,
420         BOOL *pfDidBrowse)
421 {
422     ShellBrowser *This = impl_from_IBrowserService(iface);
423     FIXME("%p %p %p %p\n", This, psv, pidl, pfDidBrowse);
424     return E_NOTIMPL;
425 }
426
427 static HRESULT WINAPI BrowserService_UpdateWindowList(
428         IBrowserService* iface)
429 {
430     ShellBrowser *This = impl_from_IBrowserService(iface);
431     FIXME("%p\n", This);
432     return E_NOTIMPL;
433 }
434
435 static HRESULT WINAPI BrowserService_UpdateBackForwardState(
436         IBrowserService* iface)
437 {
438     ShellBrowser *This = impl_from_IBrowserService(iface);
439     FIXME("%p\n", This);
440     return E_NOTIMPL;
441 }
442
443 static HRESULT WINAPI BrowserService_SetFlags(
444         IBrowserService* iface,
445         DWORD dwFlags,
446         DWORD dwFlagMask)
447 {
448     ShellBrowser *This = impl_from_IBrowserService(iface);
449     FIXME("%p %x %x\n", This, dwFlags, dwFlagMask);
450     return E_NOTIMPL;
451 }
452
453 static HRESULT WINAPI BrowserService_GetFlags(
454         IBrowserService* iface,
455         DWORD *pdwFlags)
456 {
457     ShellBrowser *This = impl_from_IBrowserService(iface);
458     FIXME("%p %p\n", This, pdwFlags);
459     return E_NOTIMPL;
460 }
461
462 static HRESULT WINAPI BrowserService_CanNavigateNow(
463         IBrowserService* iface)
464 {
465     ShellBrowser *This = impl_from_IBrowserService(iface);
466     FIXME("%p\n", This);
467     return E_NOTIMPL;
468 }
469
470 static HRESULT WINAPI BrowserService_GetPidl(
471         IBrowserService* iface,
472         PIDLIST_ABSOLUTE *ppidl)
473 {
474     ShellBrowser *This = impl_from_IBrowserService(iface);
475     FIXME("%p %p\n", This, ppidl);
476     return E_NOTIMPL;
477 }
478
479 static HRESULT WINAPI BrowserService_SetReferrer(
480         IBrowserService* iface,
481         PCIDLIST_ABSOLUTE pidl)
482 {
483     ShellBrowser *This = impl_from_IBrowserService(iface);
484     FIXME("%p %p\n", This, pidl);
485     return E_NOTIMPL;
486 }
487
488 static DWORD WINAPI BrowserService_GetBrowserIndex(
489         IBrowserService* iface)
490 {
491     ShellBrowser *This = impl_from_IBrowserService(iface);
492     FIXME("%p\n", This);
493     return E_NOTIMPL;
494 }
495
496 static HRESULT WINAPI BrowserService_GetBrowserByIndex(
497         IBrowserService* iface,
498         DWORD dwID,
499         IUnknown **ppunk)
500 {
501     ShellBrowser *This = impl_from_IBrowserService(iface);
502     FIXME("%p %x %p\n", This, dwID, ppunk);
503     return E_NOTIMPL;
504 }
505
506 static HRESULT WINAPI BrowserService_GetHistoryObject(
507         IBrowserService* iface,
508         IOleObject **ppole,
509         IStream **pstm,
510         IBindCtx **ppbc)
511 {
512     ShellBrowser *This = impl_from_IBrowserService(iface);
513     FIXME("%p %p %p %p\n", This, ppole, pstm, ppbc);
514     return E_NOTIMPL;
515 }
516
517 static HRESULT WINAPI BrowserService_SetHistoryObject(
518         IBrowserService* iface,
519         IOleObject *pole,
520         BOOL fIsLocalAnchor)
521 {
522     ShellBrowser *This = impl_from_IBrowserService(iface);
523     FIXME("%p %p %d\n", This, pole, fIsLocalAnchor);
524     return E_NOTIMPL;
525 }
526
527 static HRESULT WINAPI BrowserService_CacheOLEServer(
528         IBrowserService* iface,
529         IOleObject *pole)
530 {
531     ShellBrowser *This = impl_from_IBrowserService(iface);
532     FIXME("%p %p\n", This, pole);
533     return E_NOTIMPL;
534 }
535
536 static HRESULT WINAPI BrowserService_GetSetCodePage(
537         IBrowserService* iface,
538         VARIANT *pvarIn,
539         VARIANT *pvarOut)
540 {
541     ShellBrowser *This = impl_from_IBrowserService(iface);
542     FIXME("%p %p %p\n", This, pvarIn, pvarOut);
543     return E_NOTIMPL;
544 }
545
546 static HRESULT WINAPI BrowserService_OnHttpEquiv(
547         IBrowserService* iface,
548         IShellView *psv,
549         BOOL fDone,
550         VARIANT *pvarargIn,
551         VARIANT *pvarargOut)
552 {
553     ShellBrowser *This = impl_from_IBrowserService(iface);
554     FIXME("%p %p %d %p %p\n", This, psv, fDone, pvarargIn, pvarargOut);
555     return E_NOTIMPL;
556 }
557
558 static HRESULT WINAPI BrowserService_GetPalette(
559         IBrowserService* iface,
560         HPALETTE *hpal)
561 {
562     ShellBrowser *This = impl_from_IBrowserService(iface);
563     FIXME("%p %p\n", This, hpal);
564     return E_NOTIMPL;
565 }
566
567 static HRESULT WINAPI BrowserService_RegisterWindow(
568         IBrowserService* iface,
569         BOOL fForceRegister,
570         int swc)
571 {
572     ShellBrowser *This = impl_from_IBrowserService(iface);
573     FIXME("%p %d %d\n", This, fForceRegister, swc);
574     return E_NOTIMPL;
575 }
576
577 static const IBrowserServiceVtbl BrowserServiceVtbl = {
578     BrowserService_QueryInterface,
579     BrowserService_AddRef,
580     BrowserService_Release,
581     BrowserService_GetParentSite,
582     BrowserService_SetTitle,
583     BrowserService_GetTitle,
584     BrowserService_GetOleObject,
585     BrowserService_GetTravelLog,
586     BrowserService_ShowControlWindow,
587     BrowserService_IsControlWindowShown,
588     BrowserService_IEGetDisplayName,
589     BrowserService_IEParseDisplayName,
590     BrowserService_DisplayParseError,
591     BrowserService_NavigateToPidl,
592     BrowserService_SetNavigateState,
593     BrowserService_GetNavigateState,
594     BrowserService_NotifyRedirect,
595     BrowserService_UpdateWindowList,
596     BrowserService_UpdateBackForwardState,
597     BrowserService_SetFlags,
598     BrowserService_GetFlags,
599     BrowserService_CanNavigateNow,
600     BrowserService_GetPidl,
601     BrowserService_SetReferrer,
602     BrowserService_GetBrowserIndex,
603     BrowserService_GetBrowserByIndex,
604     BrowserService_GetHistoryObject,
605     BrowserService_SetHistoryObject,
606     BrowserService_CacheOLEServer,
607     BrowserService_GetSetCodePage,
608     BrowserService_OnHttpEquiv,
609     BrowserService_GetPalette,
610     BrowserService_RegisterWindow
611 };
612
613 static inline ShellBrowser *impl_from_IDocObjectService(IDocObjectService *iface)
614 {
615     return CONTAINING_RECORD(iface, ShellBrowser, IDocObjectService_iface);
616 }
617
618 static HRESULT WINAPI DocObjectService_QueryInterface(
619         IDocObjectService* iface,
620         REFIID riid,
621         void **ppvObject)
622 {
623     ShellBrowser *This = impl_from_IDocObjectService(iface);
624     return IShellBrowser_QueryInterface(&This->IShellBrowser_iface, riid, ppvObject);
625 }
626
627 static ULONG WINAPI DocObjectService_AddRef(
628         IDocObjectService* iface)
629 {
630     ShellBrowser *This = impl_from_IDocObjectService(iface);
631     return IShellBrowser_AddRef(&This->IShellBrowser_iface);
632 }
633
634 static ULONG WINAPI DocObjectService_Release(
635         IDocObjectService* iface)
636 {
637     ShellBrowser *This = impl_from_IDocObjectService(iface);
638     return IShellBrowser_Release(&This->IShellBrowser_iface);
639 }
640
641 static HRESULT WINAPI DocObjectService_FireBeforeNavigate2(
642         IDocObjectService* iface,
643         IDispatch *pDispatch,
644         LPCWSTR lpszUrl,
645         DWORD dwFlags,
646         LPCWSTR lpszFrameName,
647         BYTE *pPostData,
648         DWORD cbPostData,
649         LPCWSTR lpszHeaders,
650         BOOL fPlayNavSound,
651         BOOL *pfCancel)
652 {
653     ShellBrowser *This = impl_from_IDocObjectService(iface);
654     FIXME("%p %p %s %x %s %p %d %s %d %p\n", This, pDispatch, debugstr_w(lpszUrl),
655             dwFlags, debugstr_w(lpszFrameName), pPostData, cbPostData,
656             debugstr_w(lpszHeaders), fPlayNavSound, pfCancel);
657     return E_NOTIMPL;
658 }
659
660 static HRESULT WINAPI DocObjectService_FireNavigateComplete2(
661         IDocObjectService* iface,
662         IHTMLWindow2 *pHTMLWindow2,
663         DWORD dwFlags)
664 {
665     ShellBrowser *This = impl_from_IDocObjectService(iface);
666     FIXME("%p %p %x\n", This, pHTMLWindow2, dwFlags);
667     return E_NOTIMPL;
668 }
669
670 static HRESULT WINAPI DocObjectService_FireDownloadBegin(
671         IDocObjectService* iface)
672 {
673     ShellBrowser *This = impl_from_IDocObjectService(iface);
674     FIXME("%p\n", This);
675     return E_NOTIMPL;
676 }
677
678 static HRESULT WINAPI DocObjectService_FireDownloadComplete(
679         IDocObjectService* iface)
680 {
681     ShellBrowser *This = impl_from_IDocObjectService(iface);
682     FIXME("%p\n", This);
683     return E_NOTIMPL;
684 }
685
686 static HRESULT WINAPI DocObjectService_FireDocumentComplete(
687         IDocObjectService* iface,
688         IHTMLWindow2 *pHTMLWindow,
689         DWORD dwFlags)
690 {
691     ShellBrowser *This = impl_from_IDocObjectService(iface);
692     FIXME("%p %p %x\n", This, pHTMLWindow, dwFlags);
693     return E_NOTIMPL;
694 }
695
696 static HRESULT WINAPI DocObjectService_UpdateDesktopComponent(
697         IDocObjectService* iface,
698         IHTMLWindow2 *pHTMLWindow)
699 {
700     ShellBrowser *This = impl_from_IDocObjectService(iface);
701     FIXME("%p %p\n", This, pHTMLWindow);
702     return E_NOTIMPL;
703 }
704
705 static HRESULT WINAPI DocObjectService_GetPendingUrl(
706         IDocObjectService* iface,
707         BSTR *pbstrPendingUrl)
708 {
709     ShellBrowser *This = impl_from_IDocObjectService(iface);
710     FIXME("%p %p\n", This, pbstrPendingUrl);
711     return E_NOTIMPL;
712 }
713
714 static HRESULT WINAPI DocObjectService_ActiveElementChanged(
715         IDocObjectService* iface,
716         IHTMLElement *pHTMLElement)
717 {
718     ShellBrowser *This = impl_from_IDocObjectService(iface);
719     FIXME("%p %p\n", This, pHTMLElement);
720     return E_NOTIMPL;
721 }
722
723 static HRESULT WINAPI DocObjectService_GetUrlSearchComponent(
724         IDocObjectService* iface,
725         BSTR *pbstrSearch)
726 {
727     ShellBrowser *This = impl_from_IDocObjectService(iface);
728     FIXME("%p %p\n", This, pbstrSearch);
729     return E_NOTIMPL;
730 }
731
732 static HRESULT WINAPI DocObjectService_IsErrorUrl(
733         IDocObjectService* iface,
734         LPCWSTR lpszUrl,
735         BOOL *pfIsError)
736 {
737     ShellBrowser *This = impl_from_IDocObjectService(iface);
738     FIXME("%p %s %p\n", This, debugstr_w(lpszUrl), pfIsError);
739
740     *pfIsError = FALSE;
741     return S_OK;
742 }
743
744 static const IDocObjectServiceVtbl DocObjectServiceVtbl = {
745     DocObjectService_QueryInterface,
746     DocObjectService_AddRef,
747     DocObjectService_Release,
748     DocObjectService_FireBeforeNavigate2,
749     DocObjectService_FireNavigateComplete2,
750     DocObjectService_FireDownloadBegin,
751     DocObjectService_FireDownloadComplete,
752     DocObjectService_FireDocumentComplete,
753     DocObjectService_UpdateDesktopComponent,
754     DocObjectService_GetPendingUrl,
755     DocObjectService_ActiveElementChanged,
756     DocObjectService_GetUrlSearchComponent,
757     DocObjectService_IsErrorUrl
758 };
759
760 HRESULT ShellBrowser_Create(IShellBrowser **ppv)
761 {
762     ShellBrowser *sb;
763
764     sb = heap_alloc(sizeof(ShellBrowser));
765     if(!sb)
766         return E_OUTOFMEMORY;
767
768     sb->IShellBrowser_iface.lpVtbl = &ShellBrowserVtbl;
769     sb->IBrowserService_iface.lpVtbl = &BrowserServiceVtbl;
770     sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl;
771
772     sb->ref = 1;
773
774     *ppv = &sb->IShellBrowser_iface;
775     return S_OK;
776 }