xref: /reactos/dll/win32/browseui/shellbrowser.cpp (revision 75850abc)
1 /*
2  * ReactOS Explorer
3  *
4  * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 
21 #include "precomp.h"
22 
23 #include <shellapi.h>
24 #include <htiframe.h>
25 #include <strsafe.h>
26 
27 extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow);
28 
29 #include "newatlinterfaces.h"
30 
31 /*
32 TODO:
33   **Provide implementation of new and delete that use LocalAlloc
34   **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
35         view doesn't restore the selection correctly.
36   **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
37   **Add brand band bitmaps to shell32.dll
38   **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
39 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
40         current state overwrites the wrong entry's contents. This needs to be changed.
41 ****Fix close of browser window to release all objects
42 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
43   **When a new bar is added to base bar site, how is base bar told so it can resize?
44   **Does the base bar site have a classid?
45   **What should refresh command send to views to make them refresh?
46   **When new bar is created, what status notifications need to be fired?
47   **How does keyboard filtering dispatch?
48   **For deferred persist history load, how does the view connect up and get the state?
49     How does context menu send open, cut, rename commands to its site (the shell view)?
50   **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
51 
52   **Route View->Toolbars commands to internet toolbar
53   **Handle travel log items in View->Go
54   **Fix ShowBrowserBar to pass correct size on when bar is shown
55 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
56 ****Make ShowToolbar check if bar is already created before creating it again
57 ****Shell should fill in the list of explorer bars in the View submenus
58   **Add folder menu in the file menu
59   **Fix CShellBrowser::GetBorderDW to compute available size correctly
60   **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
61   **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
62     Make folders toolbar item update state appropriately
63     Read list of bands from registry on launch
64     Read list of bars from registry on launch
65     If the folders or search bars don't exist, disable the toolbar buttons
66     If the favorites or history bars don't exist, disable the toolbar butons
67     Fix Apply to all Folders in Folder Options
68     Implement close command
69     Add explorer band context menu to file menu
70     Add code to allow restore of internet toolbar from registry
71     Fix code that calls FireNavigateComplete to pass the correct new path
72 
73     What are the other command ids for QueryStatus/FireCommandStateChange?
74 
75     Add handler for cabinet settings change
76     Add handler for system metrics change (renegotiate border space?)
77     Add handler for theme change and forward to contained windows
78 
79     When folders are shown, the status bar text should change
80     Add code to save/restore shell view settings
81     Implement tabbing between frames
82     Fix handling of focus everywhere
83     Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
84 
85     The status bar doesn't show help text for items owned by frame during menu tracking
86     Stub out frame command handlers
87     "Arrange icons by" group is not checked properly
88 
89     When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
90         the icon is always an open folder with magnifying glass
91     Fix bars to calculate height correctly
92     Hookup policies for everything...
93     Investigate toolbar message WM_USER+93
94     Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
95 
96     Vertical Explorer Bar		CATID_InfoBand
97     Horizontal Explorer Bar		CATID_CommBand
98     Desk Band					CATID_DeskBand
99 
100     cache of bars
101     HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
102     HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
103 
104     create key here with CLSID of bar to register tool band
105     HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
106 
107 */
108 
109 #ifndef __GNUC__
110 #pragma comment(linker, \
111     "\"/manifestdependency:type='Win32' "\
112     "name='Microsoft.Windows.Common-Controls' "\
113     "version='6.0.0.0' "\
114     "processorArchitecture='*' "\
115     "publicKeyToken='6595b64144ccf1df' "\
116     "language='*'\"")
117 #endif // __GNUC__
118 
119 static const unsigned int                   folderOptionsPageCountMax = 20;
120 static const long                           BTP_DONT_UPDATE_HISTORY = 0;
121 static const long                           BTP_UPDATE_CUR_HISTORY = 1;
122 static const long                           BTP_UPDATE_NEXT_HISTORY = 2;
123 
124 BOOL                                        createNewStuff = false;
125 
126 
127 // this class is private to browseui.dll and is not registered externally?
128 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
129 
130 void DeleteMenuItems(HMENU theMenu, unsigned int firstIDToDelete, unsigned int lastIDToDelete)
131 {
132     MENUITEMINFO                            menuItemInfo;
133     int                                     menuItemCount;
134     int                                     curIndex;
135 
136     menuItemCount = GetMenuItemCount(theMenu);
137     curIndex = 0;
138     while (curIndex < menuItemCount)
139     {
140         menuItemInfo.cbSize = sizeof(menuItemInfo);
141         menuItemInfo.fMask = MIIM_ID;
142         if (GetMenuItemInfo(theMenu, curIndex, TRUE, &menuItemInfo) &&
143             menuItemInfo.wID >= firstIDToDelete && menuItemInfo.wID <= lastIDToDelete)
144         {
145             DeleteMenu(theMenu, curIndex, MF_BYPOSITION);
146             menuItemCount--;
147         }
148         else
149             curIndex++;
150     }
151 }
152 
153 HRESULT WINAPI SHBindToFolder(LPCITEMIDLIST path, IShellFolder **newFolder)
154 {
155     CComPtr<IShellFolder>                   desktop;
156 
157     HRESULT hr = ::SHGetDesktopFolder(&desktop);
158     if (FAILED_UNEXPECTEDLY(hr))
159         return E_FAIL;
160     if (path == NULL || path->mkid.cb == 0)
161     {
162         *newFolder = desktop;
163         desktop.p->AddRef ();
164         return S_OK;
165     }
166     return desktop->BindToObject (path, NULL, IID_PPV_ARG(IShellFolder, newFolder));
167 }
168 
169 static const TCHAR szCabinetWndClass[] = TEXT("CabinetWClass");
170 //static const TCHAR szExploreWndClass[] = TEXT("ExploreWClass");
171 
172 class CDockManager;
173 class CShellBrowser;
174 
175 class CToolbarProxy :
176     public CWindowImpl<CToolbarProxy, CWindow, CControlWinTraits>
177 {
178 private:
179     CComPtr<IExplorerToolbar>               fExplorerToolbar;
180 public:
181     void Initialize(HWND parent, IUnknown *explorerToolbar);
182     void Destroy();
183 private:
184 
185     // message handlers
186     LRESULT OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
187     LRESULT OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
188 
189     BEGIN_MSG_MAP(CToolbarProxy)
190         MESSAGE_HANDLER(TB_ADDBITMAP, OnAddBitmap)
191         MESSAGE_RANGE_HANDLER(WM_USER, 0x7fff, OnForwardMessage)
192     END_MSG_MAP()
193 };
194 
195 void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar)
196 {
197     HWND                                    myWindow;
198     HRESULT                                 hResult;
199 
200     myWindow = SHCreateWorkerWindowW(0, parent, 0, WS_CHILD, NULL, 0);
201     if (myWindow != NULL)
202     {
203         SubclassWindow(myWindow);
204         SetWindowPos(NULL, -32000, -32000, 0, 0, SWP_NOOWNERZORDER | SWP_NOZORDER);
205         hResult = explorerToolbar->QueryInterface(
206             IID_PPV_ARG(IExplorerToolbar, &fExplorerToolbar));
207     }
208 }
209 
210 void CToolbarProxy::Destroy()
211 {
212     DestroyWindow();
213     fExplorerToolbar = NULL;
214 }
215 
216 LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
217 {
218     long int                                result;
219     HRESULT                                 hResult;
220 
221     result = 0;
222     if (fExplorerToolbar.p != NULL)
223     {
224         hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 1, (long)wParam,
225             reinterpret_cast<TBADDBITMAP *>(lParam), &result, RGB(192, 192, 192));
226         hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 2, (long)wParam,
227             reinterpret_cast<TBADDBITMAP *>(lParam), &result, RGB(192, 192, 192));
228     }
229     return result;
230 }
231 
232 LRESULT CToolbarProxy::OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
233 {
234     LRESULT                                 result;
235     HRESULT                                 hResult;
236 
237     result = 0;
238     if (fExplorerToolbar.p != NULL)
239         hResult = fExplorerToolbar->SendToolbarMsg(&CGID_ShellBrowser, uMsg, wParam, lParam, &result);
240     return result;
241 }
242 
243 /*
244 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
245     where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
246     rebar
247 */
248 
249 struct MenuBandInfo {
250     GUID barGuid;
251     BOOL fVertical;
252 };
253 
254 class CShellBrowser :
255     public CWindowImpl<CShellBrowser, CWindow, CFrameWinTraits>,
256     public CComObjectRootEx<CComMultiThreadModelNoCS>,
257     public IShellBrowser,
258     public IDropTarget,
259     public IServiceProvider,
260     public IProfferServiceImpl<CShellBrowser>,
261     public IShellBrowserService,
262     public IWebBrowser2,
263     public ITravelLogClient,
264     public IPersistHistory,
265     public IDockingWindowSite,
266     public IOleCommandTarget,
267     public IBrowserService2,
268     public IConnectionPointContainerImpl<CShellBrowser>,
269     public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>,
270     public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents>
271 {
272 private:
273     class barInfo
274     {
275     public:
276         RECT                                borderSpace;
277         CComPtr<IUnknown>                   clientBar;
278         HWND                                hwnd;
279     };
280     static const int                        BIInternetToolbar = 0;
281     static const int                        BIVerticalBaseBar = 1;
282     static const int                        BIHorizontalBaseBar = 2;
283 
284     HWND                                    fCurrentShellViewWindow;    // our currently hosted shell view window
285     CComPtr<IShellFolder>                   fCurrentShellFolder;        //
286     CComPtr<IShellView>                     fCurrentShellView;          //
287     LPITEMIDLIST                            fCurrentDirectoryPIDL;      //
288     HWND                                    fStatusBar;
289     bool                                    fStatusBarVisible;
290     CToolbarProxy                           fToolbarProxy;
291     barInfo                                 fClientBars[3];
292     CComPtr<ITravelLog>                     fTravelLog;
293     HMENU                                   fCurrentMenuBar;
294     CABINETSTATE                            fCabinetState;
295     // The next three fields support persisted history for shell views.
296     // They do not need to be reference counted.
297     IOleObject                              *fHistoryObject;
298     IStream                                 *fHistoryStream;
299     IBindCtx                                *fHistoryBindContext;
300     HDSA menuDsa;
301     HACCEL m_hAccel;
302 public:
303 #if 0
304     ULONG InternalAddRef()
305     {
306         OutputDebugString(_T("AddRef\n"));
307         return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalAddRef();
308     }
309     ULONG InternalRelease()
310     {
311         OutputDebugString(_T("Release\n"));
312         return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalRelease();
313     }
314 #endif
315 
316     CShellBrowser();
317     ~CShellBrowser();
318     HRESULT Initialize(LPITEMIDLIST pidl, DWORD dwFlags);
319 public:
320     HRESULT BrowseToPIDL(LPCITEMIDLIST pidl, long flags);
321     HRESULT BrowseToPath(IShellFolder *newShellFolder, LPCITEMIDLIST absolutePIDL,
322         FOLDERSETTINGS *folderSettings, long flags);
323     HRESULT GetMenuBand(REFIID riid, void **shellMenu);
324     HRESULT GetBaseBar(bool vertical, REFIID riid, void **theBaseBar);
325     BOOL IsBandLoaded(const CLSID clsidBand, bool verticali, DWORD *pdwBandID);
326     HRESULT ShowBand(const CLSID &classID, bool vertical);
327     HRESULT NavigateToParent();
328     HRESULT DoFolderOptions();
329     static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
330     void RepositionBars();
331     HRESULT BuildExplorerBandMenu();
332     HRESULT BuildExplorerBandCategory(HMENU hBandsMenu, CATID category, DWORD dwPos, UINT *nbFound);
333     BOOL IsBuiltinBand(CLSID &bandID);
334     virtual WNDPROC GetWindowProc()
335     {
336         return WindowProc;
337     }
338     HRESULT FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments);
339     HRESULT FireNavigateComplete(const wchar_t *newDirectory);
340     HRESULT FireCommandStateChange(bool newState, int commandID);
341     HRESULT FireCommandStateChangeAll();
342     HRESULT UpdateForwardBackState();
343     HRESULT UpdateUpState();
344     void UpdateGotoMenu(HMENU theMenu);
345     void UpdateViewMenu(HMENU theMenu);
346 
347 /*    // *** IDockingWindowFrame methods ***
348     virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
349     virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
350     virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
351     */
352 
353     // *** IDockingWindowSite methods ***
354     virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder);
355     virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw);
356     virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw);
357 
358     // *** IOleCommandTarget methods ***
359     virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds,
360         OLECMD prgCmds[  ], OLECMDTEXT *pCmdText);
361     virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID,
362         DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
363 
364     // *** IOleWindow methods ***
365     virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
366     virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
367 
368     // *** IShellBrowser methods ***
369     virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
370     virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);
371     virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared);
372     virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR pszStatusText);
373     virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable);
374     virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(MSG *pmsg, WORD wID);
375     virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags);
376     virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, IStream **ppStrm);
377     virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND *lphwnd);
378     virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);
379     virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(IShellView **ppshv);
380     virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(IShellView *ppshv);
381     virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags);
382 
383     // *** IDropTarget methods ***
384     virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
385     virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
386     virtual HRESULT STDMETHODCALLTYPE DragLeave();
387     virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
388 
389     // *** IServiceProvider methods ***
390     virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
391 
392     // *** IShellBowserService methods ***
393     virtual HRESULT STDMETHODCALLTYPE GetPropertyBag(long flags, REFIID riid, void **ppvObject);
394 
395     // *** IDispatch methods ***
396     virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
397     virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
398     virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
399         REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
400     virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
401         DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
402 
403     // *** IBrowserService methods ***
404     virtual HRESULT STDMETHODCALLTYPE GetParentSite(IOleInPlaceSite **ppipsite);
405     virtual HRESULT STDMETHODCALLTYPE SetTitle(IShellView *psv, LPCWSTR pszName);
406     virtual HRESULT STDMETHODCALLTYPE GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName);
407     virtual HRESULT STDMETHODCALLTYPE GetOleObject(IOleObject **ppobjv);
408     virtual HRESULT STDMETHODCALLTYPE GetTravelLog(ITravelLog **pptl);
409     virtual HRESULT STDMETHODCALLTYPE ShowControlWindow(UINT id, BOOL fShow);
410     virtual HRESULT STDMETHODCALLTYPE IsControlWindowShown(UINT id, BOOL *pfShown);
411     virtual HRESULT STDMETHODCALLTYPE IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags);
412     virtual HRESULT STDMETHODCALLTYPE IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPITEMIDLIST *ppidlOut);
413     virtual HRESULT STDMETHODCALLTYPE DisplayParseError(HRESULT hres, LPCWSTR pwszPath);
414     virtual HRESULT STDMETHODCALLTYPE NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF);
415     virtual HRESULT STDMETHODCALLTYPE SetNavigateState(BNSTATE bnstate);
416     virtual HRESULT STDMETHODCALLTYPE GetNavigateState(BNSTATE *pbnstate);
417     virtual HRESULT STDMETHODCALLTYPE NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse);
418     virtual HRESULT STDMETHODCALLTYPE UpdateWindowList();
419     virtual HRESULT STDMETHODCALLTYPE UpdateBackForwardState();
420     virtual HRESULT STDMETHODCALLTYPE SetFlags(DWORD dwFlags, DWORD dwFlagMask);
421     virtual HRESULT STDMETHODCALLTYPE GetFlags(DWORD *pdwFlags);
422     virtual HRESULT STDMETHODCALLTYPE CanNavigateNow( void);
423     virtual HRESULT STDMETHODCALLTYPE GetPidl(LPITEMIDLIST *ppidl);
424     virtual HRESULT STDMETHODCALLTYPE SetReferrer(LPCITEMIDLIST pidl);
425     virtual DWORD STDMETHODCALLTYPE GetBrowserIndex();
426     virtual HRESULT STDMETHODCALLTYPE GetBrowserByIndex(DWORD dwID, IUnknown **ppunk);
427     virtual HRESULT STDMETHODCALLTYPE GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc);
428     virtual HRESULT STDMETHODCALLTYPE SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor);
429     virtual HRESULT STDMETHODCALLTYPE CacheOLEServer(IOleObject *pole);
430     virtual HRESULT STDMETHODCALLTYPE GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut);
431     virtual HRESULT STDMETHODCALLTYPE OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut);
432     virtual HRESULT STDMETHODCALLTYPE GetPalette(HPALETTE *hpal);
433     virtual HRESULT STDMETHODCALLTYPE RegisterWindow(BOOL fForceRegister, int swc);
434 
435     // *** IBrowserService2 methods ***
436     virtual LRESULT STDMETHODCALLTYPE WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
437     virtual HRESULT STDMETHODCALLTYPE SetAsDefFolderSettings();
438     virtual HRESULT STDMETHODCALLTYPE GetViewRect(RECT *prc);
439     virtual HRESULT STDMETHODCALLTYPE OnSize(WPARAM wParam);
440     virtual HRESULT STDMETHODCALLTYPE OnCreate(struct tagCREATESTRUCTW *pcs);
441     virtual LRESULT STDMETHODCALLTYPE OnCommand(WPARAM wParam, LPARAM lParam);
442     virtual HRESULT STDMETHODCALLTYPE OnDestroy();
443     virtual LRESULT STDMETHODCALLTYPE OnNotify(struct tagNMHDR *pnm);
444     virtual HRESULT STDMETHODCALLTYPE OnSetFocus();
445     virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivateBS(BOOL fActive);
446     virtual HRESULT STDMETHODCALLTYPE ReleaseShellView();
447     virtual HRESULT STDMETHODCALLTYPE ActivatePendingView();
448     virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd);
449     virtual HRESULT STDMETHODCALLTYPE CreateBrowserPropSheetExt(REFIID riid, void **ppv);
450     virtual HRESULT STDMETHODCALLTYPE GetViewWindow(HWND *phwndView);
451     virtual HRESULT STDMETHODCALLTYPE GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd);
452     virtual LPBASEBROWSERDATA STDMETHODCALLTYPE PutBaseBrowserData( void);
453     virtual HRESULT STDMETHODCALLTYPE InitializeTravelLog(ITravelLog *ptl, DWORD dw);
454     virtual HRESULT STDMETHODCALLTYPE SetTopBrowser();
455     virtual HRESULT STDMETHODCALLTYPE Offline(int iCmd);
456     virtual HRESULT STDMETHODCALLTYPE AllowViewResize(BOOL f);
457     virtual HRESULT STDMETHODCALLTYPE SetActivateState(UINT u);
458     virtual HRESULT STDMETHODCALLTYPE UpdateSecureLockIcon(int eSecureLock);
459     virtual HRESULT STDMETHODCALLTYPE InitializeDownloadManager();
460     virtual HRESULT STDMETHODCALLTYPE InitializeTransitionSite();
461     virtual HRESULT STDMETHODCALLTYPE _Initialize(HWND hwnd, IUnknown *pauto);
462     virtual HRESULT STDMETHODCALLTYPE _CancelPendingNavigationAsync( void);
463     virtual HRESULT STDMETHODCALLTYPE _CancelPendingView();
464     virtual HRESULT STDMETHODCALLTYPE _MaySaveChanges();
465     virtual HRESULT STDMETHODCALLTYPE _PauseOrResumeView(BOOL fPaused);
466     virtual HRESULT STDMETHODCALLTYPE _DisableModeless();
467     virtual HRESULT STDMETHODCALLTYPE _NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags);
468     virtual HRESULT STDMETHODCALLTYPE _TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew);
469     virtual HRESULT STDMETHODCALLTYPE _SwitchActivationNow();
470     virtual HRESULT STDMETHODCALLTYPE _ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup,
471         DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
472     virtual HRESULT STDMETHODCALLTYPE _SendChildren(
473         HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam);
474     virtual HRESULT STDMETHODCALLTYPE GetFolderSetData(struct tagFolderSetData *pfsd);
475     virtual HRESULT STDMETHODCALLTYPE _OnFocusChange(UINT itb);
476     virtual HRESULT STDMETHODCALLTYPE v_ShowHideChildWindows(BOOL fChildOnly);
477     virtual UINT STDMETHODCALLTYPE _get_itbLastFocus();
478     virtual HRESULT STDMETHODCALLTYPE _put_itbLastFocus(UINT itbLastFocus);
479     virtual HRESULT STDMETHODCALLTYPE _UIActivateView(UINT uState);
480     virtual HRESULT STDMETHODCALLTYPE _GetViewBorderRect(RECT *prc);
481     virtual HRESULT STDMETHODCALLTYPE _UpdateViewRectSize();
482     virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorder(UINT itb);
483     virtual HRESULT STDMETHODCALLTYPE _ResizeView();
484     virtual HRESULT STDMETHODCALLTYPE _GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon);
485     virtual IStream *STDMETHODCALLTYPE v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName);
486     virtual LRESULT STDMETHODCALLTYPE ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
487     virtual HRESULT STDMETHODCALLTYPE SetAcceleratorMenu(HACCEL hacc);
488     virtual int STDMETHODCALLTYPE _GetToolbarCount();
489     virtual LPTOOLBARITEM STDMETHODCALLTYPE _GetToolbarItem(int itb);
490     virtual HRESULT STDMETHODCALLTYPE _SaveToolbars(IStream *pstm);
491     virtual HRESULT STDMETHODCALLTYPE _LoadToolbars(IStream *pstm);
492     virtual HRESULT STDMETHODCALLTYPE _CloseAndReleaseToolbars(BOOL fClose);
493     virtual HRESULT STDMETHODCALLTYPE v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext,
494         int citb, LPTOOLBARITEM *pptbi, HWND *phwnd);
495     virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor);
496     virtual UINT STDMETHODCALLTYPE _FindTBar(IUnknown *punkSrc);
497     virtual HRESULT STDMETHODCALLTYPE _SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg);
498     virtual HRESULT STDMETHODCALLTYPE v_MayTranslateAccelerator(MSG *pmsg);
499     virtual HRESULT STDMETHODCALLTYPE _GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor);
500     virtual HRESULT STDMETHODCALLTYPE v_CheckZoneCrossing(LPCITEMIDLIST pidl);
501 
502     // *** IWebBrowser methods ***
503     virtual HRESULT STDMETHODCALLTYPE GoBack();
504     virtual HRESULT STDMETHODCALLTYPE GoForward();
505     virtual HRESULT STDMETHODCALLTYPE GoHome();
506     virtual HRESULT STDMETHODCALLTYPE GoSearch();
507     virtual HRESULT STDMETHODCALLTYPE Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName,
508         VARIANT *PostData, VARIANT *Headers);
509     virtual HRESULT STDMETHODCALLTYPE Refresh();
510     virtual HRESULT STDMETHODCALLTYPE Refresh2(VARIANT *Level);
511     virtual HRESULT STDMETHODCALLTYPE Stop();
512     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppDisp);
513     virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppDisp);
514     virtual HRESULT STDMETHODCALLTYPE get_Container(IDispatch **ppDisp);
515     virtual HRESULT STDMETHODCALLTYPE get_Document(IDispatch **ppDisp);
516     virtual HRESULT STDMETHODCALLTYPE get_TopLevelContainer(VARIANT_BOOL *pBool);
517     virtual HRESULT STDMETHODCALLTYPE get_Type(BSTR *Type);
518     virtual HRESULT STDMETHODCALLTYPE get_Left(long *pl);
519     virtual HRESULT STDMETHODCALLTYPE put_Left(long Left);
520     virtual HRESULT STDMETHODCALLTYPE get_Top(long *pl);
521     virtual HRESULT STDMETHODCALLTYPE put_Top(long Top);
522     virtual HRESULT STDMETHODCALLTYPE get_Width(long *pl);
523     virtual HRESULT STDMETHODCALLTYPE put_Width(long Width);
524     virtual HRESULT STDMETHODCALLTYPE get_Height(long *pl);
525     virtual HRESULT STDMETHODCALLTYPE put_Height(long Height);
526     virtual HRESULT STDMETHODCALLTYPE get_LocationName(BSTR *LocationName);
527     virtual HRESULT STDMETHODCALLTYPE get_LocationURL(BSTR *LocationURL);
528     virtual HRESULT STDMETHODCALLTYPE get_Busy(VARIANT_BOOL *pBool);
529 
530     // *** IWebBrowserApp methods ***
531     virtual HRESULT STDMETHODCALLTYPE Quit();
532     virtual HRESULT STDMETHODCALLTYPE ClientToWindow(int *pcx, int *pcy);
533     virtual HRESULT STDMETHODCALLTYPE PutProperty(BSTR Property, VARIANT vtValue);
534     virtual HRESULT STDMETHODCALLTYPE GetProperty(BSTR Property, VARIANT *pvtValue);
535     virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR *Name);
536     virtual HRESULT STDMETHODCALLTYPE get_HWND(SHANDLE_PTR *pHWND);
537     virtual HRESULT STDMETHODCALLTYPE get_FullName(BSTR *FullName);
538     virtual HRESULT STDMETHODCALLTYPE get_Path(BSTR *Path);
539     virtual HRESULT STDMETHODCALLTYPE get_Visible(VARIANT_BOOL *pBool);
540     virtual HRESULT STDMETHODCALLTYPE put_Visible(VARIANT_BOOL Value);
541     virtual HRESULT STDMETHODCALLTYPE get_StatusBar(VARIANT_BOOL *pBool);
542     virtual HRESULT STDMETHODCALLTYPE put_StatusBar(VARIANT_BOOL Value);
543     virtual HRESULT STDMETHODCALLTYPE get_StatusText(BSTR *StatusText);
544     virtual HRESULT STDMETHODCALLTYPE put_StatusText(BSTR StatusText);
545     virtual HRESULT STDMETHODCALLTYPE get_ToolBar(int *Value);
546     virtual HRESULT STDMETHODCALLTYPE put_ToolBar(int Value);
547     virtual HRESULT STDMETHODCALLTYPE get_MenuBar(VARIANT_BOOL *Value);
548     virtual HRESULT STDMETHODCALLTYPE put_MenuBar(VARIANT_BOOL Value);
549     virtual HRESULT STDMETHODCALLTYPE get_FullScreen(VARIANT_BOOL *pbFullScreen);
550     virtual HRESULT STDMETHODCALLTYPE put_FullScreen(VARIANT_BOOL bFullScreen);
551 
552     // *** IWebBrowser2 methods ***
553     virtual HRESULT STDMETHODCALLTYPE Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName,
554         VARIANT *PostData, VARIANT *Headers);
555     virtual HRESULT STDMETHODCALLTYPE QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf);
556     virtual HRESULT STDMETHODCALLTYPE ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,
557         VARIANT *pvaIn, VARIANT *pvaOut);
558     virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize);
559     virtual HRESULT STDMETHODCALLTYPE get_ReadyState(READYSTATE *plReadyState);
560     virtual HRESULT STDMETHODCALLTYPE get_Offline(VARIANT_BOOL *pbOffline);
561     virtual HRESULT STDMETHODCALLTYPE put_Offline(VARIANT_BOOL bOffline);
562     virtual HRESULT STDMETHODCALLTYPE get_Silent(VARIANT_BOOL *pbSilent);
563     virtual HRESULT STDMETHODCALLTYPE put_Silent(VARIANT_BOOL bSilent);
564     virtual HRESULT STDMETHODCALLTYPE get_RegisterAsBrowser(VARIANT_BOOL *pbRegister);
565     virtual HRESULT STDMETHODCALLTYPE put_RegisterAsBrowser(VARIANT_BOOL bRegister);
566     virtual HRESULT STDMETHODCALLTYPE get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister);
567     virtual HRESULT STDMETHODCALLTYPE put_RegisterAsDropTarget(VARIANT_BOOL bRegister);
568     virtual HRESULT STDMETHODCALLTYPE get_TheaterMode(VARIANT_BOOL *pbRegister);
569     virtual HRESULT STDMETHODCALLTYPE put_TheaterMode(VARIANT_BOOL bRegister);
570     virtual HRESULT STDMETHODCALLTYPE get_AddressBar(VARIANT_BOOL *Value);
571     virtual HRESULT STDMETHODCALLTYPE put_AddressBar(VARIANT_BOOL Value);
572     virtual HRESULT STDMETHODCALLTYPE get_Resizable(VARIANT_BOOL *Value);
573     virtual HRESULT STDMETHODCALLTYPE put_Resizable(VARIANT_BOOL Value);
574 
575     // *** ITravelLogClient methods ***
576     virtual HRESULT STDMETHODCALLTYPE FindWindowByIndex(DWORD dwID, IUnknown **ppunk);
577     virtual HRESULT STDMETHODCALLTYPE GetWindowData(IStream *pStream, LPWINDOWDATA pWinData);
578     virtual HRESULT STDMETHODCALLTYPE LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition);
579 
580     // *** IPersist methods ***
581     virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
582 
583     // *** IPersistHistory methods ***
584     virtual HRESULT STDMETHODCALLTYPE LoadHistory(IStream *pStream, IBindCtx *pbc);
585     virtual HRESULT STDMETHODCALLTYPE SaveHistory(IStream *pStream);
586     virtual HRESULT STDMETHODCALLTYPE SetPositionCookie(DWORD dwPositioncookie);
587     virtual HRESULT STDMETHODCALLTYPE GetPositionCookie(DWORD *pdwPositioncookie);
588 
589     // message handlers
590     LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
591     LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
592     LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
593     LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
594     LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
595     LRESULT RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
596     LRESULT PropagateMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
597     LRESULT OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
598     LRESULT OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
599     LRESULT OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
600     LRESULT OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
601     LRESULT OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
602     LRESULT OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
603     LRESULT OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
604     LRESULT OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
605     LRESULT OnBackspace(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
606     LRESULT OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
607     LRESULT OnOrganizeFavorites(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
608     LRESULT OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
609     LRESULT OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
610     LRESULT OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
611     LRESULT OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
612     LRESULT OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
613     LRESULT OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
614     LRESULT OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
615     LRESULT OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
616     LRESULT OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
617     LRESULT OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
618     LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
619     HRESULT OnSearch();
620 
621     static ATL::CWndClassInfo& GetWndClassInfo()
622     {
623         static ATL::CWndClassInfo wc =
624         {
625             { sizeof(WNDCLASSEX), CS_DBLCLKS, StartWindowProc,
626               0, 0, NULL, LoadIcon(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET)),
627               LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, szCabinetWndClass, NULL },
628             NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
629         };
630         return wc;
631     }
632 
633     BEGIN_MSG_MAP(CShellBrowser)
634         MESSAGE_HANDLER(WM_CREATE, OnCreate)
635         MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
636         MESSAGE_HANDLER(WM_SIZE, OnSize)
637         MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
638         MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
639         MESSAGE_HANDLER(WM_MEASUREITEM, RelayMsgToShellView)
640         MESSAGE_HANDLER(WM_DRAWITEM, RelayMsgToShellView)
641         MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView)
642         MESSAGE_HANDLER(WM_WININICHANGE, PropagateMessage)
643         COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose)
644         COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions)
645         COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive)
646         COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE, OnDisconnectNetworkDrive)
647         COMMAND_ID_HANDLER(IDM_HELP_ABOUT, OnAboutReactOS)
648         COMMAND_ID_HANDLER(IDM_GOTO_BACK, OnGoBack)
649         COMMAND_ID_HANDLER(IDM_GOTO_FORWARD, OnGoForward)
650         COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL, OnGoUpLevel)
651         COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE, OnGoHome)
652         COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES, OnOrganizeFavorites)
653         COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR, OnToggleStatusBarVisible)
654         COMMAND_ID_HANDLER(IDM_VIEW_REFRESH, OnRefresh)
655         COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS, OnToggleToolbarLock)
656         COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS, OnToggleToolbarBandVisible)
657         COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR, OnToggleAddressBandVisible)
658         COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR, OnToggleLinksBandVisible)
659         COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS, OnToggleTextLabels)
660         COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE, OnToolbarCustomize)
661         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH, OnExplorerBar)
662         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS, OnExplorerBar)
663         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY, OnExplorerBar)
664         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES, OnExplorerBar)
665         COMMAND_ID_HANDLER(IDM_BACKSPACE, OnBackspace)
666         COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel)
667         COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM, IDM_EXPLORERBAND_ENDCUSTOM, OnExplorerBar)
668         MESSAGE_HANDLER(WM_COMMAND, RelayCommands)
669     END_MSG_MAP()
670 
671     BEGIN_CONNECTION_POINT_MAP(CShellBrowser)
672         CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2)
673         CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents)
674     END_CONNECTION_POINT_MAP()
675 
676     BEGIN_COM_MAP(CShellBrowser)
677         COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite)
678         COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
679         COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDockingWindowSite)
680         COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser)
681         COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
682         COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
683         COM_INTERFACE_ENTRY_IID(IID_IProfferService, IProfferService)
684         COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService, IShellBrowserService)
685         COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
686         COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer, IConnectionPointContainer)
687         COM_INTERFACE_ENTRY_IID(IID_IWebBrowser, IWebBrowser)
688         COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp, IWebBrowserApp)
689         COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2, IWebBrowser2)
690         COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient, ITravelLogClient)
691         COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist)
692         COM_INTERFACE_ENTRY_IID(IID_IPersistHistory, IPersistHistory)
693         COM_INTERFACE_ENTRY_IID(IID_IBrowserService, IBrowserService)
694         COM_INTERFACE_ENTRY_IID(IID_IBrowserService2, IBrowserService2)
695     END_COM_MAP()
696 };
697 
698 extern HRESULT CreateProgressDialog(REFIID riid, void **ppv);
699 
700 CShellBrowser::CShellBrowser()
701 {
702     fCurrentShellViewWindow = NULL;
703     fCurrentDirectoryPIDL = NULL;
704     fStatusBar = NULL;
705     fStatusBarVisible = true;
706     memset(fClientBars, 0, sizeof(fClientBars));
707     fCurrentMenuBar = NULL;
708     fHistoryObject = NULL;
709     fHistoryStream = NULL;
710     fHistoryBindContext = NULL;
711 }
712 
713 CShellBrowser::~CShellBrowser()
714 {
715     if (menuDsa)
716         DSA_Destroy(menuDsa);
717 }
718 
719 HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, DWORD dwFlags)
720 {
721     CComPtr<IPersistStreamInit>             persistStreamInit;
722     HRESULT                                 hResult;
723     CComPtr<IUnknown> clientBar;
724 
725     _AtlInitialConstruct();
726 
727     menuDsa = DSA_Create(sizeof(MenuBandInfo), 5);
728     if (!menuDsa)
729         return E_OUTOFMEMORY;
730 
731     fCabinetState.cLength = sizeof(fCabinetState);
732     if (ReadCabinetState(&fCabinetState, sizeof(fCabinetState)) == FALSE)
733     {
734     }
735 
736     // create window
737     Create(HWND_DESKTOP);
738     if (m_hWnd == NULL)
739         return E_FAIL;
740 
741     hResult = CInternetToolbar_CreateInstance(IID_PPV_ARG(IUnknown, &clientBar));
742     if (FAILED_UNEXPECTEDLY(hResult))
743         return hResult;
744 
745     fClientBars[BIInternetToolbar].clientBar = clientBar;
746 
747     // create interfaces
748     hResult = clientBar->QueryInterface(IID_PPV_ARG(IPersistStreamInit, &persistStreamInit));
749     if (FAILED_UNEXPECTEDLY(hResult))
750         return hResult;
751 
752     hResult = IUnknown_SetSite(clientBar, static_cast<IShellBrowser *>(this));
753     if (FAILED_UNEXPECTEDLY(hResult))
754         return hResult;
755 
756     hResult = IUnknown_Exec(clientBar, CGID_PrivCITCommands, 1, 1 /* or 0 */, NULL, NULL);
757     if (FAILED_UNEXPECTEDLY(hResult))
758         return hResult;
759 
760     // TODO: create settingsStream from registry entry
761     //if (settingsStream.p)
762     //{
763     //    hResult = persistStreamInit->Load(settingsStream);
764     //    if (FAILED_UNEXPECTEDLY(hResult))
765     //        return hResult;
766     //}
767     //else
768     {
769         hResult = persistStreamInit->InitNew();
770         if (FAILED_UNEXPECTEDLY(hResult))
771             return hResult;
772     }
773 
774     hResult = IUnknown_ShowDW(clientBar, TRUE);
775     if (FAILED_UNEXPECTEDLY(hResult))
776         return hResult;
777 
778     fToolbarProxy.Initialize(m_hWnd, clientBar);
779 
780 
781     // create status bar
782     fStatusBar = CreateWindow(STATUSCLASSNAMEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
783                     SBT_NOBORDERS | SBT_TOOLTIPS, 0, 0, 500, 20, m_hWnd, (HMENU)0xa001,
784                     _AtlBaseModule.GetModuleInstance(), 0);
785     fStatusBarVisible = true;
786 
787 
788     // browse
789     hResult = BrowseToPIDL(pidl, BTP_UPDATE_NEXT_HISTORY);
790     if (FAILED_UNEXPECTEDLY(hResult))
791         return hResult;
792 
793     if ((dwFlags & SBSP_EXPLOREMODE) != NULL)
794         ShowBand(CLSID_ExplorerBand, true);
795 
796     ShowWindow(SW_SHOWNORMAL);
797 
798     return S_OK;
799 }
800 
801 HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags)
802 {
803     CComPtr<IShellFolder>                   newFolder;
804     FOLDERSETTINGS                          newFolderSettings;
805     HRESULT                                 hResult;
806 
807     // called by shell view to browse to new folder
808     // also called by explorer band to navigate to new folder
809     hResult = SHBindToFolder(pidl, &newFolder);
810     if (FAILED_UNEXPECTEDLY(hResult))
811         return hResult;
812 
813     newFolderSettings.ViewMode = FVM_ICON;
814     newFolderSettings.fFlags = 0;
815     hResult = BrowseToPath(newFolder, pidl, &newFolderSettings, flags);
816     if (FAILED_UNEXPECTEDLY(hResult))
817         return hResult;
818     return S_OK;
819 }
820 
821 BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
822 {
823     LPCITEMIDLIST                           pidlnext;
824     WORD                                    length;
825     BOOL                                    ret;
826 
827     ret = TRUE;
828     if (! _ILIsDesktop(pidl))
829     {
830         length = pidl->mkid.cb;
831         pidlnext =
832             reinterpret_cast<LPCITEMIDLIST>(
833                 reinterpret_cast<const BYTE *>(pidl) + length);
834         if (pidlnext->mkid.cb != 0)
835             ret = FALSE;
836     }
837     return ret;
838 }
839 
840 HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *unused, LPCITEMIDLIST pidl,
841     const IID *riid, LPVOID *ppv, LPITEMIDLIST *ppidlLast)
842 {
843     CComPtr<IShellFolder>                   psf;
844     LPITEMIDLIST                            pidlChild;
845     LPITEMIDLIST                            pidlParent;
846     HRESULT                                 hResult;
847 
848     hResult = E_FAIL;
849     if (ppv == NULL)
850         return E_POINTER;
851     *ppv = NULL;
852     if (ppidlLast != NULL)
853         *ppidlLast = NULL;
854     if (_ILIsPidlSimple(pidl))
855     {
856         if (ppidlLast != NULL)
857             *ppidlLast = ILClone(pidl);
858         hResult = SHGetDesktopFolder((IShellFolder **)ppv);
859     }
860     else
861     {
862         pidlChild = ILClone(ILFindLastID(pidl));
863         pidlParent = ILClone(pidl);
864         ILRemoveLastID(pidlParent);
865         hResult = SHGetDesktopFolder(&psf);
866         if (SUCCEEDED(hResult))
867             hResult = psf->BindToObject(pidlParent, NULL, *riid, ppv);
868         if (SUCCEEDED(hResult) && ppidlLast != NULL)
869             *ppidlLast = pidlChild;
870         else
871             ILFree(pidlChild);
872         ILFree(pidlParent);
873     }
874     return hResult;
875 }
876 
877 HRESULT IEGetNameAndFlagsEx(LPITEMIDLIST pidl, SHGDNF uFlags, long param10,
878     LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
879 {
880     CComPtr<IShellFolder>                   parentFolder;
881     LPITEMIDLIST                            childPIDL = NULL;
882     STRRET                                  L108;
883     HRESULT                                 hResult;
884 
885     hResult = SHBindToFolderIDListParent(NULL, pidl, &IID_PPV_ARG(IShellFolder, &parentFolder), &childPIDL);
886     if (FAILED(hResult))
887         goto cleanup;
888 
889     hResult = parentFolder->GetDisplayNameOf(childPIDL, uFlags, &L108);
890     if (FAILED(hResult))
891         goto cleanup;
892 
893     StrRetToBufW(&L108, childPIDL, pszBuf, cchBuf);
894     if (rgfInOut)
895     {
896         hResult = parentFolder->GetAttributesOf(1, const_cast<LPCITEMIDLIST *>(&childPIDL), rgfInOut);
897         if (FAILED(hResult))
898             goto cleanup;
899     }
900 
901     hResult = S_OK;
902 
903 cleanup:
904     if (childPIDL)
905         ILFree(childPIDL);
906     return hResult;
907 }
908 
909 long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
910 {
911     return IEGetNameAndFlagsEx(pidl, uFlags, 0, pszBuf, cchBuf, rgfInOut);
912 }
913 
914 HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder,
915     LPCITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags)
916 {
917     CComPtr<IObjectWithSite>                objectWithSite;
918     CComPtr<IShellFolder>                   saveCurrentShellFolder;
919     CComPtr<IShellView>                     saveCurrentShellView;
920     CComPtr<IShellView>                     newShellView;
921     CComPtr<ITravelLog>                     travelLog;
922     HWND                                    newShellViewWindow;
923     BOOL                                    windowUpdateIsLocked;
924     RECT                                    shellViewWindowBounds;
925     HWND                                    previousView;
926     HCURSOR                                 saveCursor;
927     wchar_t                                 newTitle[MAX_PATH];
928     SHGDNF                                  nameFlags;
929     HRESULT                                 hResult;
930 
931     if (newShellFolder == NULL)
932         return E_INVALIDARG;
933 
934     hResult = GetTravelLog(&travelLog);
935     if (FAILED_UNEXPECTEDLY(hResult))
936         return hResult;
937 
938     // update history
939     if (flags & BTP_UPDATE_CUR_HISTORY)
940     {
941         if (travelLog->CountEntries(static_cast<IDropTarget *>(this)) > 0)
942             hResult = travelLog->UpdateEntry(static_cast<IDropTarget *>(this), FALSE);
943         // what to do with error? Do we want to halt browse because state save failed?
944     }
945 
946     if (fCurrentShellView)
947     {
948         fCurrentShellView->UIActivate(SVUIA_DEACTIVATE);
949     }
950 
951     // create view object
952     hResult = newShellFolder->CreateViewObject(m_hWnd, IID_PPV_ARG(IShellView, &newShellView));
953     if (FAILED_UNEXPECTEDLY(hResult))
954         return hResult;
955     previousView = fCurrentShellViewWindow;
956 
957     // enter updating section
958     saveCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
959     windowUpdateIsLocked = LockWindowUpdate(TRUE);
960     if (fCurrentShellView != NULL)
961         ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 0, 0);
962 
963     // set site
964     hResult = IUnknown_SetSite(newShellView, static_cast<IDropTarget *>(this));
965 
966     // update folder and view
967     saveCurrentShellFolder = fCurrentShellFolder;
968     saveCurrentShellView = fCurrentShellView;
969     fCurrentShellFolder = newShellFolder;
970     fCurrentShellView = newShellView;
971 
972     // get boundary
973     if (previousView != NULL)
974         ::GetWindowRect(previousView, &shellViewWindowBounds);
975     else
976         ZeroMemory(&shellViewWindowBounds, sizeof(shellViewWindowBounds));
977     ::MapWindowPoints(0, m_hWnd, reinterpret_cast<POINT *>(&shellViewWindowBounds), 2);
978 
979     // create view window
980     hResult = newShellView->CreateViewWindow(saveCurrentShellView, folderSettings,
981         this, &shellViewWindowBounds, &newShellViewWindow);
982     if (FAILED_UNEXPECTEDLY(hResult) || newShellViewWindow == NULL)
983     {
984         fCurrentShellView = saveCurrentShellView;
985         fCurrentShellFolder = saveCurrentShellFolder;
986         ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 1, 0);
987         if (windowUpdateIsLocked)
988             LockWindowUpdate(FALSE);
989         SetCursor(saveCursor);
990         return hResult;
991     }
992 
993     if (objectWithSite.p != NULL)
994         hResult = objectWithSite->SetSite(NULL);
995 
996     // update current pidl
997     ILFree(fCurrentDirectoryPIDL);
998     fCurrentDirectoryPIDL = ILClone(absolutePIDL);
999 
1000     // update view window
1001     if (saveCurrentShellView != NULL)
1002         saveCurrentShellView->DestroyViewWindow();
1003     fCurrentShellViewWindow = newShellViewWindow;
1004 
1005     // no use
1006     saveCurrentShellView.Release();
1007     saveCurrentShellFolder.Release();
1008 
1009     hResult = newShellView->UIActivate(SVUIA_ACTIVATE_FOCUS);
1010 
1011     // leave updating section
1012     if (windowUpdateIsLocked)
1013         LockWindowUpdate(FALSE);
1014     SetCursor(saveCursor);
1015 
1016     // update history
1017     if (flags & BTP_UPDATE_NEXT_HISTORY)
1018     {
1019         hResult = travelLog->AddEntry(static_cast<IDropTarget *>(this), FALSE);
1020         hResult = travelLog->UpdateEntry(static_cast<IDropTarget *>(this), FALSE);
1021     }
1022 
1023     // completed
1024     nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING;
1025     hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle,
1026         sizeof(newTitle) / sizeof(wchar_t), NULL);
1027     if (SUCCEEDED(hResult))
1028     {
1029         FireNavigateComplete(newTitle);
1030     }
1031     else
1032     {
1033         FireNavigateComplete(L"ERROR");
1034     }
1035 
1036     if (fCabinetState.fFullPathTitle)
1037         nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING;
1038     else
1039         nameFlags = SHGDN_FORADDRESSBAR;
1040     hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle,
1041         sizeof(newTitle) / sizeof(wchar_t), NULL);
1042     if (SUCCEEDED(hResult))
1043     {
1044         SetWindowText(newTitle);
1045 
1046         LPCITEMIDLIST pidlChild;
1047         INT index, indexOpen;
1048         HIMAGELIST himlSmall, himlLarge;
1049 
1050         CComPtr<IShellFolder> sf;
1051         hResult = SHBindToParent(absolutePIDL, IID_PPV_ARG(IShellFolder, &sf), &pidlChild);
1052         if (SUCCEEDED(hResult))
1053         {
1054             index = SHMapPIDLToSystemImageListIndex(sf, pidlChild, &indexOpen);
1055 
1056             Shell_GetImageLists(&himlLarge, &himlSmall);
1057 
1058             HICON icSmall = ImageList_GetIcon(himlSmall, indexOpen, 0);
1059             HICON icLarge = ImageList_GetIcon(himlLarge, indexOpen, 0);
1060 
1061             /* Hack to make it possible to release the old icons */
1062             /* Something seems to go wrong with WM_SETICON */
1063             HICON oldSmall = (HICON)SendMessage(WM_GETICON, ICON_SMALL, 0);
1064             HICON oldLarge = (HICON)SendMessage(WM_GETICON, ICON_BIG,   0);
1065 
1066             SendMessage(WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(icSmall));
1067             SendMessage(WM_SETICON, ICON_BIG,   reinterpret_cast<LPARAM>(icLarge));
1068 
1069             DestroyIcon(oldSmall);
1070             DestroyIcon(oldLarge);
1071         }
1072     }
1073 
1074     FireCommandStateChangeAll();
1075     hResult = UpdateForwardBackState();
1076     hResult = UpdateUpState();
1077     return S_OK;
1078 }
1079 
1080 HRESULT CShellBrowser::GetMenuBand(REFIID riid, void **shellMenu)
1081 {
1082     CComPtr<IBandSite>                      bandSite;
1083     CComPtr<IDeskBand>                      deskBand;
1084     HRESULT                                 hResult;
1085 
1086     if (!fClientBars[BIInternetToolbar].clientBar)
1087         return E_FAIL;
1088 
1089     hResult = IUnknown_QueryService(fClientBars[BIInternetToolbar].clientBar, SID_IBandSite, IID_PPV_ARG(IBandSite, &bandSite));
1090     if (FAILED_UNEXPECTEDLY(hResult))
1091         return hResult;
1092 
1093     hResult = bandSite->QueryBand(1, &deskBand, NULL, NULL, 0);
1094     if (FAILED_UNEXPECTEDLY(hResult))
1095         return hResult;
1096 
1097     return deskBand->QueryInterface(riid, shellMenu);
1098 }
1099 
1100 HRESULT CShellBrowser::GetBaseBar(bool vertical, REFIID riid, void **theBaseBar)
1101 {
1102     CComPtr<IUnknown>                       newBaseBar;
1103     CComPtr<IDeskBar>                       deskBar;
1104     CComPtr<IUnknown>                       newBaseBarSite;
1105     CComPtr<IDeskBarClient>                 deskBarClient;
1106     IUnknown                                **cache;
1107     HRESULT                                 hResult;
1108 
1109     if (vertical)
1110         cache = &fClientBars[BIVerticalBaseBar].clientBar.p;
1111     else
1112         cache = &fClientBars[BIHorizontalBaseBar].clientBar.p;
1113     if (*cache == NULL)
1114     {
1115         hResult = CBaseBar_CreateInstance(IID_PPV_ARG(IUnknown, &newBaseBar), vertical);
1116         if (FAILED_UNEXPECTEDLY(hResult))
1117             return hResult;
1118         hResult = CBaseBarSite_CreateInstance(IID_PPV_ARG(IUnknown, &newBaseBarSite), vertical);
1119         if (FAILED_UNEXPECTEDLY(hResult))
1120             return hResult;
1121 
1122         // we have to store our basebar into cache now
1123         *cache = newBaseBar;
1124         newBaseBar->AddRef();
1125 
1126         // tell the new base bar about the shell browser
1127         hResult = IUnknown_SetSite(newBaseBar, static_cast<IDropTarget *>(this));
1128         if (FAILED_UNEXPECTEDLY(hResult))
1129             return hResult;
1130 
1131         // tell the new base bar about the new base bar site
1132         hResult = newBaseBar->QueryInterface(IID_PPV_ARG(IDeskBar, &deskBar));
1133         if (FAILED_UNEXPECTEDLY(hResult))
1134             return hResult;
1135         hResult = deskBar->SetClient(newBaseBarSite);
1136         if (FAILED_UNEXPECTEDLY(hResult))
1137             return hResult;
1138 
1139         // tell the new base bar site about the new base bar
1140         hResult = newBaseBarSite->QueryInterface(IID_PPV_ARG(IDeskBarClient, &deskBarClient));
1141         if (FAILED_UNEXPECTEDLY(hResult))
1142             return hResult;
1143         hResult = deskBarClient->SetDeskBarSite(newBaseBar);
1144         if (FAILED_UNEXPECTEDLY(hResult))
1145             return hResult;
1146 
1147     }
1148     return (*cache)->QueryInterface(riid, theBaseBar);
1149 }
1150 
1151 BOOL CShellBrowser::IsBandLoaded(const CLSID clsidBand, bool vertical, DWORD *pdwBandID)
1152 {
1153     HRESULT                                 hResult;
1154     CComPtr<IDeskBar>                       deskBar;
1155     CComPtr<IUnknown>                       baseBarSite;
1156     CComPtr<IBandSite>                      bandSite;
1157     CLSID                                   clsidTmp;
1158     DWORD                                   numBands;
1159     DWORD                                   dwBandID;
1160     DWORD                                   i;
1161 
1162     /* Get our basebarsite to be able to enumerate bands */
1163     hResult = GetBaseBar(vertical, IID_PPV_ARG(IDeskBar, &deskBar));
1164     if (FAILED_UNEXPECTEDLY(hResult))
1165         return FALSE;
1166     hResult = deskBar->GetClient(&baseBarSite);
1167     if (FAILED_UNEXPECTEDLY(hResult))
1168         return FALSE;
1169     hResult = baseBarSite->QueryInterface(IID_PPV_ARG(IBandSite, &bandSite));
1170     if (FAILED_UNEXPECTEDLY(hResult))
1171         return FALSE;
1172 
1173     hResult = bandSite->EnumBands(-1, &numBands);
1174     if (FAILED_UNEXPECTEDLY(hResult))
1175         return FALSE;
1176 
1177     for(i = 0; i < numBands; i++)
1178     {
1179         CComPtr<IPersist> bandPersist;
1180 
1181         hResult = bandSite->EnumBands(i, &dwBandID);
1182         if (FAILED_UNEXPECTEDLY(hResult))
1183             return FALSE;
1184 
1185         hResult = bandSite->GetBandObject(dwBandID, IID_PPV_ARG(IPersist, &bandPersist));
1186         if (FAILED_UNEXPECTEDLY(hResult))
1187             return FALSE;
1188         hResult = bandPersist->GetClassID(&clsidTmp);
1189         if (FAILED_UNEXPECTEDLY(hResult))
1190             return FALSE;
1191         if (IsEqualGUID(clsidBand, clsidTmp))
1192         {
1193             if (pdwBandID) *pdwBandID = dwBandID;
1194             return TRUE;
1195         }
1196     }
1197     return FALSE;
1198 }
1199 
1200 HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical)
1201 {
1202     CComPtr<IDockingWindow>                 dockingWindow;
1203     CComPtr<IUnknown>                       baseBarSite;
1204     CComPtr<IUnknown>                       newBand;
1205     CComPtr<IDeskBar>                       deskBar;
1206     VARIANT                                 vaIn;
1207     HRESULT                                 hResult;
1208     DWORD                                   dwBandID;
1209 
1210     hResult = GetBaseBar(vertical, IID_PPV_ARG(IDeskBar, &deskBar));
1211     if (FAILED_UNEXPECTEDLY(hResult))
1212         return hResult;
1213 
1214     hResult = deskBar->GetClient(&baseBarSite);
1215     if (FAILED_UNEXPECTEDLY(hResult))
1216         return hResult;
1217 
1218     hResult = deskBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow));
1219     if (FAILED_UNEXPECTEDLY(hResult))
1220         return hResult;
1221 
1222     if (!IsBandLoaded(classID, vertical, &dwBandID))
1223     {
1224         TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID), vertical);
1225         if (IsEqualCLSID(CLSID_ExplorerBand, classID))
1226         {
1227             TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1228             hResult = CExplorerBand_CreateInstance(IID_PPV_ARG(IUnknown, &newBand));
1229             if (FAILED_UNEXPECTEDLY(hResult))
1230                 return hResult;
1231         }
1232         else
1233         {
1234             TRACE("A different CLSID requested, using CoCreateInstance.\n");
1235             hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, &newBand));
1236             if (FAILED_UNEXPECTEDLY(hResult))
1237                 return hResult;
1238         }
1239     }
1240     else
1241     {
1242         CComPtr<IBandSite>                  pBandSite;
1243 
1244         hResult = baseBarSite->QueryInterface(IID_PPV_ARG(IBandSite, &pBandSite));
1245         if (!SUCCEEDED(hResult))
1246         {
1247             ERR("Can't get IBandSite interface\n");
1248             return E_FAIL;
1249         }
1250         hResult = pBandSite->GetBandObject(dwBandID, IID_PPV_ARG(IUnknown, &newBand));
1251         if (!SUCCEEDED(hResult))
1252         {
1253             ERR("Can't find band object\n");
1254             return E_FAIL;
1255         }
1256 
1257         // It's hackish, but we should be able to show the wanted band until we
1258         // find the proper way to do this (but it seems to work to add a new band)
1259         // Here we'll just re-add the existing band to the site, causing it to display.
1260     }
1261     V_VT(&vaIn) = VT_UNKNOWN;
1262     V_UNKNOWN(&vaIn) = newBand.p;
1263     hResult = IUnknown_Exec(baseBarSite, CGID_IDeskBand, 1, 1, &vaIn, NULL);
1264     if (FAILED_UNEXPECTEDLY(hResult))
1265     {
1266         return hResult;
1267     }
1268 
1269     hResult = dockingWindow->ShowDW(TRUE);
1270     if (FAILED_UNEXPECTEDLY(hResult))
1271         return hResult;
1272 
1273     return S_OK;
1274 }
1275 
1276 HRESULT CShellBrowser::NavigateToParent()
1277 {
1278     LPITEMIDLIST newDirectory = ILClone(fCurrentDirectoryPIDL);
1279     if (newDirectory == NULL)
1280         return E_OUTOFMEMORY;
1281     if (_ILIsDesktop(newDirectory))
1282     {
1283         ILFree(newDirectory);
1284         return E_INVALIDARG;
1285     }
1286     ILRemoveLastID(newDirectory);
1287     HRESULT hResult = BrowseToPIDL(newDirectory, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
1288     ILFree(newDirectory);
1289     if (FAILED_UNEXPECTEDLY(hResult))
1290         return hResult;
1291     return S_OK;
1292 }
1293 
1294 BOOL CALLBACK AddFolderOptionsPage(HPROPSHEETPAGE thePage, LPARAM lParam)
1295 {
1296     PROPSHEETHEADER* sheetInfo = reinterpret_cast<PROPSHEETHEADER*>(lParam);
1297     if (sheetInfo->nPages >= folderOptionsPageCountMax)
1298         return FALSE;
1299     sheetInfo->phpage[sheetInfo->nPages] = thePage;
1300     sheetInfo->nPages++;
1301     return TRUE;
1302 }
1303 
1304 HRESULT CShellBrowser::DoFolderOptions()
1305 {
1306     CComPtr<IShellPropSheetExt>             folderOptionsSheet;
1307     PROPSHEETHEADER                         m_PropSheet;
1308     HPROPSHEETPAGE                          m_psp[folderOptionsPageCountMax];
1309 //    CComPtr<IGlobalFolderSettings>          globalSettings;
1310 //    SHELLSTATE2                             shellState;
1311     HRESULT                                 hResult;
1312 
1313     memset(m_psp, 0, sizeof(m_psp));
1314     memset(&m_PropSheet, 0, sizeof(m_PropSheet));
1315 
1316     // create sheet object
1317     hResult = CoCreateInstance(CLSID_ShellFldSetExt, NULL, CLSCTX_INPROC_SERVER,
1318         IID_PPV_ARG(IShellPropSheetExt, &folderOptionsSheet));
1319     if (FAILED_UNEXPECTEDLY(hResult))
1320         return E_FAIL;
1321 
1322     // must set site in order for Apply to all Folders on Advanced page to be enabled
1323     hResult = IUnknown_SetSite(folderOptionsSheet, static_cast<IDispatch *>(this));
1324     m_PropSheet.phpage = m_psp;
1325 
1326 #if 0
1327     hResult = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IGlobalFolderSettings, &globalSettings));
1328     if (FAILED_UNEXPECTEDLY(hResult))
1329         return E_FAIL;
1330     hResult = globalSettings->Get(&shellState, sizeof(shellState));
1331     if (FAILED_UNEXPECTEDLY(hResult))
1332         return E_FAIL;
1333 #endif
1334 
1335     // add pages
1336     hResult = folderOptionsSheet->AddPages(AddFolderOptionsPage, reinterpret_cast<LPARAM>(&m_PropSheet));
1337     if (FAILED_UNEXPECTEDLY(hResult))
1338         return E_FAIL;
1339 
1340 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1341 //              It returns 'E_NOTIMPL'
1342 #if 0
1343     if (fCurrentShellView != NULL)
1344     {
1345         hResult = fCurrentShellView->AddPropertySheetPages(
1346             0, AddFolderOptionsPage, reinterpret_cast<LPARAM>(&m_PropSheet));
1347         if (FAILED_UNEXPECTEDLY(hResult))
1348             return E_FAIL;
1349     }
1350 #endif
1351 
1352     // show sheet
1353     m_PropSheet.dwSize = sizeof(PROPSHEETHEADER);
1354     m_PropSheet.dwFlags = 0;
1355     m_PropSheet.hwndParent = m_hWnd;
1356     m_PropSheet.hInstance = _AtlBaseModule.GetResourceInstance();
1357     m_PropSheet.pszCaption = _T("Folder Options");
1358     m_PropSheet.nStartPage = 0;
1359     PropertySheet(&m_PropSheet);
1360     return S_OK;
1361 }
1362 
1363 LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1364 {
1365     CShellBrowser                           *pThis = reinterpret_cast<CShellBrowser *>(hWnd);
1366     _ATL_MSG                                msg(pThis->m_hWnd, uMsg, wParam, lParam);
1367     LRESULT                                 lResult;
1368     const _ATL_MSG                          *previousMessage;
1369     BOOL                                    handled;
1370     WNDPROC                                 saveWindowProc;
1371     HRESULT                                 hResult;
1372 
1373     hWnd = pThis->m_hWnd;
1374     previousMessage = pThis->m_pCurrentMsg;
1375     pThis->m_pCurrentMsg = &msg;
1376 
1377     /* If the shell browser is initialized, let the menu band preprocess the messages */
1378     if (pThis->fCurrentDirectoryPIDL)
1379     {
1380         CComPtr<IMenuBand> menuBand;
1381         hResult = pThis->GetMenuBand(IID_PPV_ARG(IMenuBand, &menuBand));
1382         if (SUCCEEDED(hResult) && menuBand.p != NULL)
1383         {
1384             hResult = menuBand->TranslateMenuMessage(&msg, &lResult);
1385             if (hResult == S_OK)
1386                 return lResult;
1387             uMsg = msg.message;
1388             wParam = msg.wParam;
1389             lParam = msg.lParam;
1390         }
1391         menuBand.Release();
1392     }
1393 
1394     handled = pThis->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0);
1395     ATLASSERT(pThis->m_pCurrentMsg == &msg);
1396     if (handled == FALSE)
1397     {
1398         if (uMsg == WM_NCDESTROY)
1399         {
1400             saveWindowProc = reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWL_WNDPROC));
1401             lResult = pThis->DefWindowProc(uMsg, wParam, lParam);
1402             if (saveWindowProc == reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWL_WNDPROC)))
1403                 ::SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
1404             pThis->m_dwState |= WINSTATE_DESTROYED;
1405         }
1406         else
1407             lResult = pThis->DefWindowProc(uMsg, wParam, lParam);
1408     }
1409     pThis->m_pCurrentMsg = previousMessage;
1410     if (previousMessage == NULL && (pThis->m_dwState & WINSTATE_DESTROYED) != 0)
1411     {
1412         pThis->m_dwState &= ~WINSTATE_DESTROYED;
1413         pThis->m_hWnd = NULL;
1414         pThis->OnFinalMessage(hWnd);
1415     }
1416     return lResult;
1417 }
1418 
1419 void CShellBrowser::RepositionBars()
1420 {
1421     RECT                                    clientRect;
1422     RECT                                    statusRect;
1423     int                                     x;
1424 
1425     GetClientRect(&clientRect);
1426 
1427     if (fStatusBarVisible && fStatusBar)
1428     {
1429         ::GetWindowRect(fStatusBar, &statusRect);
1430         ::SetWindowPos(fStatusBar, NULL, clientRect.left, clientRect.bottom - (statusRect.bottom - statusRect.top),
1431                             clientRect.right - clientRect.left,
1432                             statusRect.bottom - statusRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER);
1433         clientRect.bottom -= statusRect.bottom - statusRect.top;
1434     }
1435 
1436     for (x = 0; x < 3; x++)
1437     {
1438         HWND hwnd = fClientBars[x].hwnd;
1439         RECT borderSpace = fClientBars[x].borderSpace;
1440         if (hwnd == NULL && fClientBars[x].clientBar != NULL)
1441         {
1442             IUnknown_GetWindow(fClientBars[x].clientBar, &hwnd);
1443             fClientBars[x].hwnd = hwnd;
1444         }
1445         if (hwnd != NULL)
1446         {
1447             RECT toolbarRect = clientRect;
1448             if (borderSpace.top != 0)
1449             {
1450                 toolbarRect.bottom = toolbarRect.top + borderSpace.top;
1451             }
1452             else if (borderSpace.bottom != 0)
1453             {
1454                 toolbarRect.top = toolbarRect.bottom - borderSpace.bottom;
1455             }
1456             else if (borderSpace.left != 0)
1457             {
1458                 toolbarRect.right = toolbarRect.left + borderSpace.left;
1459             }
1460             else if (borderSpace.right != 0)
1461             {
1462                 toolbarRect.left = toolbarRect.right - borderSpace.right;
1463             }
1464 
1465             ::SetWindowPos(hwnd, NULL,
1466                 toolbarRect.left,
1467                 toolbarRect.top,
1468                 toolbarRect.right - toolbarRect.left,
1469                 toolbarRect.bottom - toolbarRect.top,
1470                 SWP_NOOWNERZORDER | SWP_NOZORDER);
1471 
1472             if (borderSpace.top != 0)
1473             {
1474                 clientRect.top = toolbarRect.bottom;
1475             }
1476             else if (borderSpace.bottom != 0)
1477             {
1478                 clientRect.bottom = toolbarRect.top;
1479             }
1480             else if (borderSpace.left != 0)
1481             {
1482                 clientRect.left = toolbarRect.right;
1483             }
1484             else if (borderSpace.right != 0)
1485             {
1486                 clientRect.right = toolbarRect.left;
1487             }
1488         }
1489     }
1490     ::SetWindowPos(fCurrentShellViewWindow, NULL, clientRect.left, clientRect.top,
1491                         clientRect.right - clientRect.left,
1492                         clientRect.bottom - clientRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER);
1493 }
1494 
1495 HRESULT CShellBrowser::FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments)
1496 {
1497     DISPPARAMS                          params;
1498     CComDynamicUnkArray                 &vec = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>::m_vec;
1499     CComDynamicUnkArray                 &vec2 = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents>::m_vec;
1500     HRESULT                             hResult;
1501 
1502     params.rgvarg = arguments;
1503     params.rgdispidNamedArgs = NULL;
1504     params.cArgs = argCount;
1505     params.cNamedArgs = 0;
1506     IUnknown** pp = vec.begin();
1507     while (pp < vec.end())
1508     {
1509         if (*pp != NULL)
1510         {
1511             CComPtr<IDispatch>          theDispatch;
1512 
1513             hResult = (*pp)->QueryInterface(IID_PPV_ARG(IDispatch, &theDispatch));
1514             hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
1515         }
1516         pp++;
1517     }
1518     pp = vec2.begin();
1519     while (pp < vec2.end())
1520     {
1521         if (*pp != NULL)
1522         {
1523             CComPtr<IDispatch>          theDispatch;
1524 
1525             hResult = (*pp)->QueryInterface(IID_PPV_ARG(IDispatch, &theDispatch));
1526             hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
1527         }
1528         pp++;
1529     }
1530     return S_OK;
1531 }
1532 
1533 HRESULT CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory)
1534 {
1535     // these two variants intentionally to do use CComVariant because it would double free/release
1536     // or does not need to dispose at all
1537     VARIANT                             varArg[2];
1538     VARIANT                             varArgs;
1539     CComBSTR                            tempString(newDirectory);
1540 
1541     V_VT(&varArgs) = VT_BSTR;
1542     V_BSTR(&varArgs) = tempString.m_str;
1543 
1544     V_VT(&varArg[0]) = VT_VARIANT | VT_BYREF;
1545     V_VARIANTREF(&varArg[0]) = &varArgs;
1546     V_VT(&varArg[1]) = VT_DISPATCH;
1547     V_DISPATCH(&varArg[1]) = (IDispatch *)this;
1548 
1549     return FireEvent(DISPID_NAVIGATECOMPLETE2, 2, varArg);
1550 }
1551 
1552 HRESULT CShellBrowser::FireCommandStateChange(bool newState, int commandID)
1553 {
1554     VARIANT                             varArg[2];
1555 
1556     V_VT(&varArg[0]) = VT_BOOL;
1557     V_BOOL(&varArg[0]) = newState ? VARIANT_TRUE : VARIANT_FALSE;
1558     V_VT(&varArg[1]) = VT_I4;
1559     V_I4(&varArg[1]) = commandID;
1560 
1561     return FireEvent(DISPID_COMMANDSTATECHANGE, 2, varArg);
1562 }
1563 
1564 HRESULT CShellBrowser::FireCommandStateChangeAll()
1565 {
1566     return FireCommandStateChange(false, -1);
1567 }
1568 
1569 HRESULT CShellBrowser::UpdateForwardBackState()
1570 {
1571     CComPtr<ITravelLog>                     travelLog;
1572     CComPtr<ITravelEntry>                   unusedEntry;
1573     bool                                    canGoBack;
1574     bool                                    canGoForward;
1575     HRESULT                                 hResult;
1576 
1577     canGoBack = false;
1578     canGoForward = false;
1579     hResult = GetTravelLog(&travelLog);
1580     if (FAILED_UNEXPECTEDLY(hResult))
1581         return hResult;
1582     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this), TLOG_BACK, &unusedEntry);
1583     if (SUCCEEDED(hResult))
1584     {
1585         canGoBack = true;
1586         unusedEntry.Release();
1587     }
1588     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this), TLOG_FORE, &unusedEntry);
1589     if (SUCCEEDED(hResult))
1590     {
1591         canGoForward = true;
1592         unusedEntry.Release();
1593     }
1594     hResult = FireCommandStateChange(canGoBack, 2);
1595     hResult = FireCommandStateChange(canGoForward, 1);
1596     return S_OK;
1597 }
1598 
1599 HRESULT CShellBrowser::UpdateUpState()
1600 {
1601     bool canGoUp;
1602     HRESULT hResult;
1603 
1604     canGoUp = true;
1605     if (_ILIsDesktop(fCurrentDirectoryPIDL))
1606         canGoUp = false;
1607     hResult = FireCommandStateChange(canGoUp, 3);
1608     return S_OK;
1609 }
1610 
1611 void CShellBrowser::UpdateGotoMenu(HMENU theMenu)
1612 {
1613     CComPtr<ITravelLog>                     travelLog;
1614     CComPtr<ITravelEntry>                   unusedEntry;
1615     int                                     position;
1616     MENUITEMINFO                            menuItemInfo;
1617     HRESULT                                 hResult;
1618 
1619     DeleteMenuItems(theMenu, IDM_GOTO_TRAVEL_FIRST, IDM_GOTO_TRAVEL_LAST);
1620 
1621     position = GetMenuItemCount(theMenu);
1622     hResult = GetTravelLog(&travelLog);
1623     if (FAILED_UNEXPECTEDLY(hResult))
1624         return;
1625 
1626     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this),
1627                                         TLOG_BACK,
1628                                         &unusedEntry);
1629 
1630     if (SUCCEEDED(hResult))
1631     {
1632         SHEnableMenuItem(theMenu, IDM_GOTO_BACK, TRUE);
1633         unusedEntry.Release();
1634     }
1635     else
1636         SHEnableMenuItem(theMenu, IDM_GOTO_BACK, FALSE);
1637 
1638     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this),
1639                                         TLOG_FORE,
1640                                         &unusedEntry);
1641 
1642     if (SUCCEEDED(hResult))
1643     {
1644         SHEnableMenuItem(theMenu, IDM_GOTO_FORWARD, TRUE);
1645         unusedEntry.Release();
1646     }
1647     else
1648         SHEnableMenuItem(theMenu, IDM_GOTO_FORWARD, FALSE);
1649 
1650     SHEnableMenuItem(theMenu,
1651                      IDM_GOTO_UPONELEVEL,
1652                      !_ILIsDesktop(fCurrentDirectoryPIDL));
1653 
1654     hResult = travelLog->InsertMenuEntries(static_cast<IDropTarget *>(this), theMenu, position,
1655         IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, TLMENUF_BACKANDFORTH | TLMENUF_CHECKCURRENT);
1656     if (SUCCEEDED(hResult))
1657     {
1658         menuItemInfo.cbSize = sizeof(menuItemInfo);
1659         menuItemInfo.fMask = MIIM_TYPE | MIIM_ID;
1660         menuItemInfo.fType = MF_SEPARATOR;
1661         menuItemInfo.wID = IDM_GOTO_TRAVEL_SEP;
1662         InsertMenuItem(theMenu, position, TRUE, &menuItemInfo);
1663     }
1664 }
1665 
1666 void CShellBrowser::UpdateViewMenu(HMENU theMenu)
1667 {
1668     CComPtr<ITravelLog>                     travelLog;
1669     HMENU                                   gotoMenu;
1670     OLECMD                                  commandList[5];
1671     HMENU                                   toolbarMenuBar;
1672     HMENU                                   toolbarMenu;
1673     MENUITEMINFO                            menuItemInfo;
1674     HRESULT                                 hResult;
1675 
1676     gotoMenu = SHGetMenuFromID(theMenu, FCIDM_MENU_EXPLORE);
1677     if (gotoMenu != NULL)
1678         UpdateGotoMenu(gotoMenu);
1679 
1680     commandList[0].cmdID = ITID_TOOLBARBANDSHOWN;
1681     commandList[1].cmdID = ITID_ADDRESSBANDSHOWN;
1682     commandList[2].cmdID = ITID_LINKSBANDSHOWN;
1683     commandList[3].cmdID = ITID_TOOLBARLOCKED;
1684     commandList[4].cmdID = ITID_CUSTOMIZEENABLED;
1685 
1686     hResult = IUnknown_QueryStatus(fClientBars[BIInternetToolbar].clientBar,
1687                                    CGID_PrivCITCommands, 5, commandList, NULL);
1688     if (FAILED_UNEXPECTEDLY(hResult))
1689         DeleteMenu(theMenu, IDM_VIEW_TOOLBARS, MF_BYCOMMAND);
1690     else
1691     {
1692         menuItemInfo.cbSize = sizeof(menuItemInfo);
1693         menuItemInfo.fMask = MIIM_SUBMENU;
1694         GetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo);
1695         DestroyMenu(menuItemInfo.hSubMenu);
1696 
1697         toolbarMenuBar = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU));
1698         toolbarMenu = GetSubMenu(toolbarMenuBar, 0);
1699         RemoveMenu(toolbarMenuBar, 0, MF_BYPOSITION);
1700         DestroyMenu(toolbarMenuBar);
1701 
1702         // TODO: Implement
1703         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf & OLECMDF_ENABLED);
1704         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_ENABLED);
1705         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_ENABLED);
1706         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, commandList[4].cmdf & OLECMDF_ENABLED);
1707 
1708         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf & OLECMDF_LATCHED);
1709         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_LATCHED);
1710         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_LATCHED);
1711         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LOCKTOOLBARS, commandList[3].cmdf & OLECMDF_LATCHED);
1712         if ((commandList[4].cmdf & OLECMDF_ENABLED) == 0)
1713             DeleteMenu(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND);
1714         DeleteMenu(toolbarMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND);
1715         DeleteMenu(toolbarMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND);
1716 
1717         menuItemInfo.cbSize = sizeof(menuItemInfo);
1718         menuItemInfo.fMask = MIIM_SUBMENU;
1719         menuItemInfo.hSubMenu = toolbarMenu;
1720         SetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo);
1721     }
1722     SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, fStatusBarVisible ? TRUE : FALSE);
1723 }
1724 
1725 HRESULT CShellBrowser::BuildExplorerBandMenu()
1726 {
1727     HMENU                                   hBandsMenu;
1728     UINT                                    nbFound;
1729 
1730     hBandsMenu = SHGetMenuFromID(fCurrentMenuBar, IDM_VIEW_EXPLORERBAR);
1731     if (!hBandsMenu)
1732     {
1733         OutputDebugString(L"No menu !\n");
1734         return E_FAIL;
1735     }
1736     DSA_DeleteAllItems(menuDsa);
1737     BuildExplorerBandCategory(hBandsMenu, CATID_InfoBand, 4, NULL);
1738     BuildExplorerBandCategory(hBandsMenu, CATID_CommBand, 20, &nbFound);
1739     if (!nbFound)
1740     {
1741         // Remove separator
1742         DeleteMenu(hBandsMenu, IDM_EXPLORERBAR_SEPARATOR, MF_BYCOMMAND);
1743     }
1744     // Remove media menu since XP does it (according to API Monitor)
1745     DeleteMenu(hBandsMenu, IDM_EXPLORERBAR_MEDIA, MF_BYCOMMAND);
1746     return S_OK;
1747 }
1748 
1749 HRESULT CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu, CATID category, DWORD dwPos, UINT *nbFound)
1750 {
1751     HRESULT                                 hr;
1752     CComPtr<IEnumGUID>                      pEnumGUID;
1753     WCHAR                                   wszBandName[MAX_PATH];
1754     WCHAR                                   wszBandGUID[MAX_PATH];
1755     WCHAR                                   wRegKey[MAX_PATH];
1756     UINT                                    cBands;
1757     DWORD                                   dwRead;
1758     DWORD                                   dwDataSize;
1759     GUID                                    iter;
1760     MenuBandInfo                            mbi;
1761 
1762     mbi.fVertical = IsEqualGUID(category, CATID_InfoBand);
1763     cBands = 0;
1764     hr = SHEnumClassesOfCategories(1, &category, 0, NULL, &pEnumGUID);
1765     if (FAILED_UNEXPECTEDLY(hr))
1766     {
1767         return hr;
1768     }
1769     do
1770     {
1771         pEnumGUID->Next(1, &iter, &dwRead);
1772         if (dwRead)
1773         {
1774             // Get the band name
1775             if (IsBuiltinBand(iter))
1776                 continue;
1777             if (!StringFromGUID2(iter, wszBandGUID, MAX_PATH))
1778                 continue;
1779             StringCchPrintfW(wRegKey, MAX_PATH, L"CLSID\\%s", wszBandGUID);
1780             dwDataSize = MAX_PATH;
1781             SHGetValue(HKEY_CLASSES_ROOT, wRegKey, NULL, NULL, wszBandName, &dwDataSize);
1782 
1783             mbi.barGuid = iter;
1784             InsertMenu(hBandsMenu, dwPos + cBands, MF_BYPOSITION, IDM_EXPLORERBAND_BEGINCUSTOM + DSA_GetItemCount(menuDsa), wszBandName);
1785             DSA_AppendItem(menuDsa, &mbi);
1786             cBands++;
1787         }
1788     }
1789     while (dwRead > 0);
1790     if (nbFound)
1791         *nbFound = cBands;
1792     return S_OK;
1793 }
1794 
1795 BOOL CShellBrowser::IsBuiltinBand(CLSID &bandID)
1796 {
1797     if (IsEqualCLSID(bandID, CLSID_ExplorerBand))
1798         return TRUE;
1799     if (IsEqualCLSID(bandID, CLSID_SH_SearchBand) || IsEqualCLSID(bandID, CLSID_SearchBand))
1800         return TRUE;
1801     if (IsEqualCLSID(bandID, CLSID_IE_SearchBand) || IsEqualCLSID(bandID, CLSID_FileSearchBand))
1802         return TRUE;
1803     if (IsEqualCLSID(bandID, CLSID_SH_HistBand))
1804         return TRUE;
1805     if (IsEqualCLSID(bandID, CLSID_SH_FavBand))
1806         return TRUE;
1807     if (IsEqualCLSID(bandID, CLSID_ChannelsBand))
1808         return TRUE;
1809     return FALSE;
1810 }
1811 
1812 HRESULT CShellBrowser::OnSearch()
1813 {
1814     CComPtr<IObjectWithSite>                objectWithSite;
1815     CComPtr<IContextMenu>                   contextMenu;
1816     CMINVOKECOMMANDINFO                     commandInfo;
1817     const char                              *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1818     HRESULT                                 hResult;
1819 
1820     // TODO: Query shell if this command is enabled first
1821 
1822     memset(&commandInfo, 0, sizeof(commandInfo));
1823     commandInfo.cbSize = sizeof(commandInfo);
1824     commandInfo.hwnd = m_hWnd;
1825     commandInfo.lpParameters = searchGUID;
1826     commandInfo.nShow = SW_SHOWNORMAL;
1827 
1828     hResult = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
1829         IID_PPV_ARG(IContextMenu, &contextMenu));
1830     if (FAILED_UNEXPECTEDLY(hResult))
1831         return 0;
1832     hResult = contextMenu->QueryInterface(IID_PPV_ARG(IObjectWithSite, &objectWithSite));
1833     if (FAILED_UNEXPECTEDLY(hResult))
1834         return 0;
1835     hResult = objectWithSite->SetSite(dynamic_cast<IShellBrowser*>(this));
1836     if (FAILED_UNEXPECTEDLY(hResult))
1837         return 0;
1838     hResult = contextMenu->InvokeCommand(&commandInfo);
1839     hResult = objectWithSite->SetSite(NULL);
1840     return hResult;
1841 }
1842 
1843 bool IUnknownIsEqual(IUnknown *int1, IUnknown *int2)
1844 {
1845     CComPtr<IUnknown>                       int1Retry;
1846     CComPtr<IUnknown>                       int2Retry;
1847     HRESULT                                 hResult;
1848 
1849     if (int1 == int2)
1850         return true;
1851     if (int1 == NULL || int2 == NULL)
1852         return false;
1853     hResult = int1->QueryInterface(IID_PPV_ARG(IUnknown, &int1Retry));
1854     if (FAILED_UNEXPECTEDLY(hResult))
1855         return false;
1856     hResult = int2->QueryInterface(IID_PPV_ARG(IUnknown, &int2Retry));
1857     if (FAILED_UNEXPECTEDLY(hResult))
1858         return false;
1859     if (int1Retry == int2Retry)
1860         return true;
1861     return false;
1862 }
1863 
1864 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBorderDW(IUnknown *punkObj, LPRECT prcBorder)
1865 {
1866     static const INT excludeItems[] = { 1, 1, 1, 0xa001, 0, 0 };
1867 
1868     RECT availableBounds;
1869 
1870     GetEffectiveClientRect(m_hWnd, &availableBounds, excludeItems);
1871     for (INT x = 0; x < 3; x++)
1872     {
1873         if (fClientBars[x].clientBar.p != NULL && !IUnknownIsEqual(fClientBars[x].clientBar, punkObj))
1874         {
1875             availableBounds.top += fClientBars[x].borderSpace.top;
1876             availableBounds.left += fClientBars[x].borderSpace.left;
1877             availableBounds.bottom -= fClientBars[x].borderSpace.bottom;
1878             availableBounds.right -= fClientBars[x].borderSpace.right;
1879         }
1880     }
1881     *prcBorder = availableBounds;
1882     return S_OK;
1883 }
1884 
1885 HRESULT STDMETHODCALLTYPE CShellBrowser::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw)
1886 {
1887     return S_OK;
1888 }
1889 
1890 HRESULT STDMETHODCALLTYPE CShellBrowser::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw)
1891 {
1892     for (INT x = 0; x < 3; x++)
1893     {
1894         if (IUnknownIsEqual(fClientBars[x].clientBar, punkObj))
1895         {
1896             fClientBars[x].borderSpace = *pbw;
1897             // if this bar changed size, it cascades and forces all subsequent bars to resize
1898             RepositionBars();
1899             return S_OK;
1900         }
1901     }
1902     return E_INVALIDARG;
1903 }
1904 
1905 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatus(const GUID *pguidCmdGroup,
1906     ULONG cCmds, OLECMD prgCmds[  ], OLECMDTEXT *pCmdText)
1907 {
1908     CComPtr<IOleCommandTarget>              commandTarget;
1909     HRESULT                                 hResult;
1910 
1911     if (prgCmds == NULL)
1912         return E_INVALIDARG;
1913     if (pguidCmdGroup == NULL)
1914     {
1915         if (fCurrentShellView.p != NULL)
1916         {
1917             hResult = fCurrentShellView->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &commandTarget));
1918             if (SUCCEEDED(hResult) && commandTarget.p != NULL)
1919                 return commandTarget->QueryStatus(NULL, 1, prgCmds, pCmdText);
1920         }
1921         while (cCmds != 0)
1922         {
1923             prgCmds->cmdf = 0;
1924             prgCmds++;
1925             cCmds--;
1926         }
1927     }
1928     else if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
1929     {
1930         while (cCmds != 0)
1931         {
1932             switch (prgCmds->cmdID)
1933             {
1934                 case 0x1c:  // search
1935                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
1936                     break;
1937                 case 0x1d:  // history
1938                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
1939                     break;
1940                 case 0x1e:  // favorites
1941                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
1942                     break;
1943                 case 0x23:  // folders
1944                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED | OLECMDF_LATCHED;
1945                     break;
1946                 default:
1947                     prgCmds->cmdf = 0;
1948                     break;
1949             }
1950             prgCmds++;
1951             cCmds--;
1952         }
1953     }
1954     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser))
1955     {
1956         while (cCmds != 0)
1957         {
1958             switch (prgCmds->cmdID)
1959             {
1960                 case 0xa022:    // up level
1961                     prgCmds->cmdf = OLECMDF_SUPPORTED;
1962                     if (fCurrentDirectoryPIDL->mkid.cb != 0)
1963                         prgCmds->cmdf |= OLECMDF_ENABLED;
1964                     break;
1965             }
1966             prgCmds++;
1967             cCmds--;
1968         }
1969     }
1970     return S_OK;
1971 }
1972 
1973 HRESULT STDMETHODCALLTYPE CShellBrowser::Exec(const GUID *pguidCmdGroup, DWORD nCmdID,
1974     DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
1975 {
1976     HRESULT                                 hResult;
1977 
1978     if (!pguidCmdGroup)
1979     {
1980         TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID, nCmdexecopt, pvaIn, pvaOut);
1981         return E_NOTIMPL;
1982     }
1983     if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
1984     {
1985         switch (nCmdID)
1986         {
1987             case 0x23:
1988                 hResult = ShowBand(CLSID_ExplorerBand, true);
1989                 return S_OK;
1990             case 0x27:
1991                 if (nCmdexecopt == 1)
1992                 {
1993                     // pvaIn is a VT_UNKNOWN with a band that is being hidden
1994                 }
1995                 else
1996                 {
1997                     // update zones part of the status bar
1998                 }
1999                 return S_OK;
2000             case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2001                 V_VT(pvaOut) = VT_INT_PTR;
2002                 V_INTREF(pvaOut) = reinterpret_cast<INT *>(
2003                     LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU)));
2004                 return S_OK;
2005             case 0x38:
2006                 // indicate if this cabinet was opened as a browser
2007                 return S_FALSE;
2008             default:
2009                 return E_NOTIMPL;
2010         }
2011     }
2012     else if (IsEqualIID(*pguidCmdGroup, CGID_InternetButtons))
2013     {
2014         switch (nCmdID)
2015         {
2016             case 0x23:
2017                 // placeholder
2018                 return S_OK;
2019         }
2020     }
2021     else if (IsEqualIID(*pguidCmdGroup, CGID_Theater))
2022     {
2023         switch (nCmdID)
2024         {
2025             case 6:
2026                 // what is theater mode and why do we receive this?
2027                 return E_NOTIMPL;
2028         }
2029     }
2030     else if (IsEqualIID(*pguidCmdGroup, CGID_MenuBand))
2031     {
2032         switch (nCmdID)
2033         {
2034             case 14:
2035                 // initialize favorites menu
2036                 return S_OK;
2037         }
2038     }
2039     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellDocView))
2040     {
2041         switch (nCmdID)
2042         {
2043             case 0x12:
2044                 // refresh on toolbar clicked
2045                 return S_OK;
2046             case 0x26:
2047                 // called for unknown bands ?
2048                 return S_OK;
2049             case 0x4d:
2050                 // tell the view if it should hide the task pane or not
2051                 return (fClientBars[BIVerticalBaseBar].clientBar.p == NULL) ? S_FALSE : S_OK;
2052         }
2053     }
2054     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser))
2055     {
2056         switch (nCmdID)
2057         {
2058             case 40994:
2059                 return NavigateToParent();
2060         }
2061     }
2062     else if (IsEqualIID(*pguidCmdGroup, CGID_IExplorerToolbar))
2063     {
2064         switch (nCmdID)
2065         {
2066             case 0x7063:
2067                 return DoFolderOptions();
2068         }
2069     }
2070     else if (IsEqualIID(*pguidCmdGroup, CGID_DefView))
2071     {
2072         switch (nCmdID)
2073         {
2074             case 1:
2075                 // Reset All Folders option in Folder Options
2076                 break;
2077         }
2078     }
2079     else if (IsEqualIID(*pguidCmdGroup, CLSID_CommonButtons))
2080     {
2081         // Windows seems to use this as proxy for toolbar buttons.
2082         // We use it for search band for now to remove code duplication,
2083         // let's see if it could be useful in the future.
2084         switch (nCmdID)
2085         {
2086             case 0x123:
2087                 // Show search band from toolbar
2088                 OnSearch();
2089                 return S_OK;
2090         }
2091         return E_NOTIMPL;
2092     }
2093     else
2094     {
2095         return E_NOTIMPL;
2096     }
2097     return E_NOTIMPL;
2098 }
2099 
2100 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindow(HWND *lphwnd)
2101 {
2102     if (lphwnd == NULL)
2103         return E_POINTER;
2104     *lphwnd = m_hWnd;
2105     return S_OK;
2106 }
2107 
2108 HRESULT STDMETHODCALLTYPE CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode)
2109 {
2110     return E_NOTIMPL;
2111 }
2112 
2113 HRESULT STDMETHODCALLTYPE CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
2114 {
2115     HMENU mainMenu = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU));
2116 
2117     Shell_MergeMenus(hmenuShared, mainMenu, 0, 0, FCIDM_BROWSERLAST, MM_SUBMENUSHAVEIDS);
2118 
2119     int GCCU(itemCount3) = GetMenuItemCount(hmenuShared);
2120     Unused(itemCount3);
2121 
2122     DestroyMenu(mainMenu);
2123 
2124     lpMenuWidths->width[0] = 2;
2125     lpMenuWidths->width[2] = 3;
2126     lpMenuWidths->width[4] = 1;
2127     return S_OK;
2128 }
2129 
2130 HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject)
2131 {
2132     CComPtr<IShellMenu>                     shellMenu;
2133     HRESULT                                 hResult;
2134 
2135     if (hmenuShared && IsMenu(hmenuShared) == FALSE)
2136         return E_FAIL;
2137     hResult = GetMenuBand(IID_PPV_ARG(IShellMenu, &shellMenu));
2138     if (FAILED_UNEXPECTEDLY(hResult))
2139         return hResult;
2140 
2141     if (!hmenuShared)
2142     {
2143         hmenuShared = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU));
2144     }
2145     // FIXME: Figure out the proper way to do this.
2146     HMENU hMenuFavs = GetSubMenu(hmenuShared, 3);
2147     if (hMenuFavs)
2148     {
2149         DeleteMenu(hMenuFavs, IDM_FAVORITES_EMPTY, MF_BYCOMMAND);
2150     }
2151 
2152     hResult = shellMenu->SetMenu(hmenuShared, m_hWnd, SMSET_DONTOWN);
2153     if (FAILED_UNEXPECTEDLY(hResult))
2154         return hResult;
2155     fCurrentMenuBar = hmenuShared;
2156     BuildExplorerBandMenu();
2157     return S_OK;
2158 }
2159 
2160 HRESULT STDMETHODCALLTYPE CShellBrowser::RemoveMenusSB(HMENU hmenuShared)
2161 {
2162     if (hmenuShared == fCurrentMenuBar)
2163     {
2164         //DestroyMenu(fCurrentMenuBar);
2165         SetMenuSB(NULL, NULL, NULL);
2166     }
2167     return S_OK;
2168 }
2169 
2170 HRESULT STDMETHODCALLTYPE CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText)
2171 {
2172     //
2173     if (pszStatusText)
2174     {
2175         ::SetWindowText(fStatusBar, pszStatusText);
2176     }
2177     else
2178     {
2179 
2180     }
2181     return S_OK;
2182 }
2183 
2184 HRESULT STDMETHODCALLTYPE CShellBrowser::EnableModelessSB(BOOL fEnable)
2185 {
2186     return E_NOTIMPL;
2187 }
2188 
2189 HRESULT STDMETHODCALLTYPE CShellBrowser::TranslateAcceleratorSB(MSG *pmsg, WORD wID)
2190 {
2191     if (!::TranslateAcceleratorW(m_hWnd, m_hAccel, pmsg))
2192         return S_FALSE;
2193     return S_OK;
2194 }
2195 
2196 HRESULT STDMETHODCALLTYPE CShellBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags)
2197 {
2198     if ((wFlags & SBSP_EXPLOREMODE) != NULL)
2199         ShowBand(CLSID_ExplorerBand, true);
2200 
2201     return BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
2202 }
2203 
2204 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)
2205 {
2206     return E_NOTIMPL;
2207 }
2208 
2209 HRESULT STDMETHODCALLTYPE CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd)
2210 {
2211     if (lphwnd == NULL)
2212         return E_POINTER;
2213     *lphwnd = NULL;
2214     switch (id)
2215     {
2216         case FCW_TOOLBAR:
2217             *lphwnd = fToolbarProxy.m_hWnd;
2218             return S_OK;
2219         case FCW_STATUS:
2220             *lphwnd = fStatusBar;
2221             return S_OK;
2222         case FCW_TREE:
2223             // find the directory browser and return it
2224             // this should be used only to determine if a tree is present
2225             return S_OK;
2226         case FCW_PROGRESS:
2227             // is this a progress dialog?
2228             return S_OK;
2229     }
2230     return S_OK;
2231 }
2232 
2233 HRESULT STDMETHODCALLTYPE CShellBrowser::SendControlMsg(
2234     UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
2235 {
2236     LPARAM                                  result;
2237 
2238     if (pret != NULL)
2239         *pret = 0;
2240     switch (id)
2241     {
2242         case FCW_TOOLBAR:
2243             result = fToolbarProxy.SendMessage(uMsg, wParam, lParam);
2244             if (pret != NULL)
2245                 *pret = result;
2246             break;
2247         case FCW_STATUS:
2248             result = SendMessage(fStatusBar, uMsg, wParam, lParam);
2249             if (pret != NULL)
2250                 *pret = result;
2251             break;
2252     }
2253     return S_OK;
2254 }
2255 
2256 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryActiveShellView(IShellView **ppshv)
2257 {
2258     if (ppshv == NULL)
2259         return E_POINTER;
2260     *ppshv = fCurrentShellView;
2261     if (fCurrentShellView.p != NULL)
2262         fCurrentShellView.p->AddRef();
2263     return S_OK;
2264 }
2265 
2266 HRESULT STDMETHODCALLTYPE CShellBrowser::OnViewWindowActive(IShellView *ppshv)
2267 {
2268     return E_NOTIMPL;
2269 }
2270 
2271 HRESULT STDMETHODCALLTYPE CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags)
2272 {
2273     return E_NOTIMPL;
2274 }
2275 
2276 HRESULT STDMETHODCALLTYPE CShellBrowser::DragEnter(
2277     IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2278 {
2279     return E_NOTIMPL;
2280 }
2281 
2282 HRESULT STDMETHODCALLTYPE CShellBrowser::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2283 {
2284     return E_NOTIMPL;
2285 }
2286 
2287 HRESULT STDMETHODCALLTYPE CShellBrowser::DragLeave()
2288 {
2289     return E_NOTIMPL;
2290 }
2291 
2292 HRESULT STDMETHODCALLTYPE CShellBrowser::Drop(
2293     IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2294 {
2295     return E_NOTIMPL;
2296 }
2297 
2298 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
2299 {
2300     // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2301     // the returned interface has a method GetPropertyBag on it
2302     if (IsEqualIID(guidService, SID_STopLevelBrowser))
2303         return this->QueryInterface(riid, ppvObject);
2304     if (IsEqualIID(guidService, SID_SShellBrowser))
2305         return this->QueryInterface(riid, ppvObject);
2306     if (IsEqualIID(guidService, SID_ITargetFrame2))
2307         return this->QueryInterface(riid, ppvObject);
2308     if (IsEqualIID(guidService, SID_IWebBrowserApp))        // without this, the internet toolbar won't reflect notifications
2309         return this->QueryInterface(riid, ppvObject);
2310     if (IsEqualIID(guidService, SID_SProxyBrowser))
2311         return this->QueryInterface(riid, ppvObject);
2312     if (IsEqualIID(guidService, SID_IExplorerToolbar))
2313         return fClientBars[BIInternetToolbar].clientBar->QueryInterface(riid, ppvObject);
2314     if (IsEqualIID(riid, IID_IShellBrowser))
2315         return this->QueryInterface(riid, ppvObject);
2316     return E_NOINTERFACE;
2317 }
2318 
2319 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPropertyBag(long flags, REFIID riid, void **ppvObject)
2320 {
2321     if (ppvObject == NULL)
2322         return E_POINTER;
2323     *ppvObject = NULL;
2324     return E_NOTIMPL;
2325 }
2326 
2327 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfoCount(UINT *pctinfo)
2328 {
2329     return E_NOTIMPL;
2330 }
2331 
2332 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
2333 {
2334     return E_NOTIMPL;
2335 }
2336 
2337 HRESULT STDMETHODCALLTYPE CShellBrowser::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames,
2338     UINT cNames, LCID lcid, DISPID *rgDispId)
2339 {
2340     return E_NOTIMPL;
2341 }
2342 
2343 HRESULT STDMETHODCALLTYPE CShellBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
2344     WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2345 {
2346     return E_NOTIMPL;
2347 }
2348 
2349 HRESULT STDMETHODCALLTYPE CShellBrowser::GetParentSite(IOleInPlaceSite **ppipsite)
2350 {
2351     return E_NOTIMPL;
2352 }
2353 
2354 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTitle(IShellView *psv, LPCWSTR pszName)
2355 {
2356     return E_NOTIMPL;
2357 }
2358 
2359 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName)
2360 {
2361     return E_NOTIMPL;
2362 }
2363 
2364 HRESULT STDMETHODCALLTYPE CShellBrowser::GetOleObject(IOleObject **ppobjv)
2365 {
2366     return E_NOTIMPL;
2367 }
2368 
2369 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTravelLog(ITravelLog **pptl)
2370 {
2371     HRESULT                                 hResult;
2372 
2373     // called by toolbar when displaying tooltips
2374     if (pptl == NULL)
2375         return E_FAIL;
2376 
2377     *pptl = NULL;
2378     if (fTravelLog.p == NULL)
2379     {
2380         hResult = CTravelLog_CreateInstance(IID_PPV_ARG(ITravelLog, &fTravelLog));
2381         if (FAILED_UNEXPECTEDLY(hResult))
2382             return hResult;
2383     }
2384     *pptl = fTravelLog.p;
2385     fTravelLog.p->AddRef();
2386     return S_OK;
2387 }
2388 
2389 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowControlWindow(UINT id, BOOL fShow)
2390 {
2391     return E_NOTIMPL;
2392 }
2393 
2394 HRESULT STDMETHODCALLTYPE CShellBrowser::IsControlWindowShown(UINT id, BOOL *pfShown)
2395 {
2396     return E_NOTIMPL;
2397 }
2398 
2399 HRESULT STDMETHODCALLTYPE CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags)
2400 {
2401     return E_NOTIMPL;
2402 }
2403 
2404 HRESULT STDMETHODCALLTYPE CShellBrowser::IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPITEMIDLIST *ppidlOut)
2405 {
2406     return E_NOTIMPL;
2407 }
2408 
2409 HRESULT STDMETHODCALLTYPE CShellBrowser::DisplayParseError(HRESULT hres, LPCWSTR pwszPath)
2410 {
2411     return E_NOTIMPL;
2412 }
2413 
2414 HRESULT STDMETHODCALLTYPE CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF)
2415 {
2416     return E_NOTIMPL;
2417 }
2418 
2419 HRESULT STDMETHODCALLTYPE CShellBrowser::SetNavigateState(BNSTATE bnstate)
2420 {
2421     return E_NOTIMPL;
2422 }
2423 
2424 HRESULT STDMETHODCALLTYPE CShellBrowser::GetNavigateState(BNSTATE *pbnstate)
2425 {
2426     return E_NOTIMPL;
2427 }
2428 
2429 HRESULT STDMETHODCALLTYPE CShellBrowser::NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse)
2430 {
2431     return E_NOTIMPL;
2432 }
2433 
2434 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateWindowList()
2435 {
2436     return E_NOTIMPL;
2437 }
2438 
2439 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateBackForwardState()
2440 {
2441     return E_NOTIMPL;
2442 }
2443 
2444 HRESULT STDMETHODCALLTYPE CShellBrowser::SetFlags(DWORD dwFlags, DWORD dwFlagMask)
2445 {
2446     return E_NOTIMPL;
2447 }
2448 
2449 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFlags(DWORD *pdwFlags)
2450 {
2451     return E_NOTIMPL;
2452 }
2453 
2454 HRESULT STDMETHODCALLTYPE CShellBrowser::CanNavigateNow()
2455 {
2456     return E_NOTIMPL;
2457 }
2458 
2459 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPidl(LPITEMIDLIST *ppidl)
2460 {
2461     // called by explorer bar to get current pidl
2462     if (ppidl == NULL)
2463         return E_POINTER;
2464     *ppidl = ILClone(fCurrentDirectoryPIDL);
2465     return S_OK;
2466 }
2467 
2468 HRESULT STDMETHODCALLTYPE CShellBrowser::SetReferrer(LPCITEMIDLIST pidl)
2469 {
2470     return E_NOTIMPL;
2471 }
2472 
2473 DWORD STDMETHODCALLTYPE CShellBrowser::GetBrowserIndex()
2474 {
2475     return -1;
2476 }
2477 
2478 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBrowserByIndex(DWORD dwID, IUnknown **ppunk)
2479 {
2480     return E_NOTIMPL;
2481 }
2482 
2483 HRESULT STDMETHODCALLTYPE CShellBrowser::GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc)
2484 {
2485     if (ppole == NULL || pstm == NULL || ppbc == NULL)
2486         return E_INVALIDARG;
2487     *ppole = fHistoryObject;
2488     if (fHistoryObject != NULL)
2489         fHistoryObject->AddRef();
2490     *pstm = fHistoryStream;
2491     if (fHistoryStream != NULL)
2492         fHistoryStream->AddRef();
2493     *ppbc = fHistoryBindContext;
2494     if (fHistoryBindContext != NULL)
2495         fHistoryBindContext->AddRef();
2496     fHistoryObject = NULL;
2497     fHistoryStream = NULL;
2498     fHistoryBindContext = NULL;
2499     if (*ppole == NULL)
2500         return E_FAIL;
2501     return S_OK;
2502 }
2503 
2504 HRESULT STDMETHODCALLTYPE CShellBrowser::SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor)
2505 {
2506     return E_NOTIMPL;
2507 }
2508 
2509 HRESULT STDMETHODCALLTYPE CShellBrowser::CacheOLEServer(IOleObject *pole)
2510 {
2511     return E_NOTIMPL;
2512 }
2513 
2514 HRESULT STDMETHODCALLTYPE CShellBrowser::GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut)
2515 {
2516     return E_NOTIMPL;
2517 }
2518 
2519 HRESULT STDMETHODCALLTYPE CShellBrowser::OnHttpEquiv(
2520     IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut)
2521 {
2522     return E_NOTIMPL;
2523 }
2524 
2525 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPalette(HPALETTE *hpal)
2526 {
2527     return E_NOTIMPL;
2528 }
2529 
2530 HRESULT STDMETHODCALLTYPE CShellBrowser::RegisterWindow(BOOL fForceRegister, int swc)
2531 {
2532     return E_NOTIMPL;
2533 }
2534 
2535 LRESULT STDMETHODCALLTYPE CShellBrowser::WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2536 {
2537     return E_NOTIMPL;
2538 }
2539 
2540 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAsDefFolderSettings()
2541 {
2542     return E_NOTIMPL;
2543 }
2544 
2545 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewRect(RECT *prc)
2546 {
2547     return E_NOTIMPL;
2548 }
2549 
2550 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSize(WPARAM wParam)
2551 {
2552     return E_NOTIMPL;
2553 }
2554 
2555 HRESULT STDMETHODCALLTYPE CShellBrowser::OnCreate(struct tagCREATESTRUCTW *pcs)
2556 {
2557     m_hAccel = LoadAcceleratorsW(GetModuleHandle(L"browseui.dll"), MAKEINTRESOURCEW(256));
2558     return S_OK;
2559 }
2560 
2561 LRESULT STDMETHODCALLTYPE CShellBrowser::OnCommand(WPARAM wParam, LPARAM lParam)
2562 {
2563     return 0;
2564 }
2565 
2566 HRESULT STDMETHODCALLTYPE CShellBrowser::OnDestroy()
2567 {
2568     return E_NOTIMPL;
2569 }
2570 
2571 LRESULT STDMETHODCALLTYPE CShellBrowser::OnNotify(struct tagNMHDR *pnm)
2572 {
2573     return 0;
2574 }
2575 
2576 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSetFocus()
2577 {
2578     return E_NOTIMPL;
2579 }
2580 
2581 HRESULT STDMETHODCALLTYPE CShellBrowser::OnFrameWindowActivateBS(BOOL fActive)
2582 {
2583     return E_NOTIMPL;
2584 }
2585 
2586 HRESULT STDMETHODCALLTYPE CShellBrowser::ReleaseShellView()
2587 {
2588     return E_NOTIMPL;
2589 }
2590 
2591 HRESULT STDMETHODCALLTYPE CShellBrowser::ActivatePendingView()
2592 {
2593     return E_NOTIMPL;
2594 }
2595 
2596 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateViewWindow(
2597     IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd)
2598 {
2599     return E_NOTIMPL;
2600 }
2601 
2602 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateBrowserPropSheetExt(REFIID riid, void **ppv)
2603 {
2604     return E_NOTIMPL;
2605 }
2606 
2607 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewWindow(HWND *phwndView)
2608 {
2609     return E_NOTIMPL;
2610 }
2611 
2612 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd)
2613 {
2614     return E_NOTIMPL;
2615 }
2616 
2617 LPBASEBROWSERDATA STDMETHODCALLTYPE CShellBrowser::PutBaseBrowserData()
2618 {
2619     return NULL;
2620 }
2621 
2622 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTravelLog(ITravelLog *ptl, DWORD dw)
2623 {
2624     return E_NOTIMPL;
2625 }
2626 
2627 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTopBrowser()
2628 {
2629     return E_NOTIMPL;
2630 }
2631 
2632 HRESULT STDMETHODCALLTYPE CShellBrowser::Offline(int iCmd)
2633 {
2634     return E_NOTIMPL;
2635 }
2636 
2637 HRESULT STDMETHODCALLTYPE CShellBrowser::AllowViewResize(BOOL f)
2638 {
2639     return E_NOTIMPL;
2640 }
2641 
2642 HRESULT STDMETHODCALLTYPE CShellBrowser::SetActivateState(UINT u)
2643 {
2644     return E_NOTIMPL;
2645 }
2646 
2647 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateSecureLockIcon(int eSecureLock)
2648 {
2649     return E_NOTIMPL;
2650 }
2651 
2652 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeDownloadManager()
2653 {
2654     return E_NOTIMPL;
2655 }
2656 
2657 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTransitionSite()
2658 {
2659     return E_NOTIMPL;
2660 }
2661 
2662 HRESULT STDMETHODCALLTYPE CShellBrowser::_Initialize(HWND hwnd, IUnknown *pauto)
2663 {
2664     return E_NOTIMPL;
2665 }
2666 
2667 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingNavigationAsync()
2668 {
2669     return E_NOTIMPL;
2670 }
2671 
2672 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingView()
2673 {
2674     return E_NOTIMPL;
2675 }
2676 
2677 HRESULT STDMETHODCALLTYPE CShellBrowser::_MaySaveChanges()
2678 {
2679     return E_NOTIMPL;
2680 }
2681 
2682 HRESULT STDMETHODCALLTYPE CShellBrowser::_PauseOrResumeView(BOOL fPaused)
2683 {
2684     return E_NOTIMPL;
2685 }
2686 
2687 HRESULT STDMETHODCALLTYPE CShellBrowser::_DisableModeless()
2688 {
2689     return E_NOTIMPL;
2690 }
2691 
2692 HRESULT STDMETHODCALLTYPE CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags)
2693 {
2694     return E_NOTIMPL;
2695 }
2696 
2697 HRESULT STDMETHODCALLTYPE CShellBrowser::_TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew)
2698 {
2699     return E_NOTIMPL;
2700 }
2701 
2702 HRESULT STDMETHODCALLTYPE CShellBrowser::_SwitchActivationNow()
2703 {
2704     return E_NOTIMPL;
2705 }
2706 
2707 HRESULT STDMETHODCALLTYPE CShellBrowser::_ExecChildren(IUnknown *punkBar, BOOL fBroadcast,
2708     const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut)
2709 {
2710     return E_NOTIMPL;
2711 }
2712 
2713 HRESULT STDMETHODCALLTYPE CShellBrowser::_SendChildren(
2714     HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam)
2715 {
2716     return E_NOTIMPL;
2717 }
2718 
2719 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFolderSetData(struct tagFolderSetData *pfsd)
2720 {
2721     return E_NOTIMPL;
2722 }
2723 
2724 HRESULT STDMETHODCALLTYPE CShellBrowser::_OnFocusChange(UINT itb)
2725 {
2726     return E_NOTIMPL;
2727 }
2728 
2729 HRESULT STDMETHODCALLTYPE CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly)
2730 {
2731     return E_NOTIMPL;
2732 }
2733 
2734 UINT STDMETHODCALLTYPE CShellBrowser::_get_itbLastFocus()
2735 {
2736     return 0;
2737 }
2738 
2739 HRESULT STDMETHODCALLTYPE CShellBrowser::_put_itbLastFocus(UINT itbLastFocus)
2740 {
2741     return E_NOTIMPL;
2742 }
2743 
2744 HRESULT STDMETHODCALLTYPE CShellBrowser::_UIActivateView(UINT uState)
2745 {
2746     return E_NOTIMPL;
2747 }
2748 
2749 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetViewBorderRect(RECT *prc)
2750 {
2751     return E_NOTIMPL;
2752 }
2753 
2754 HRESULT STDMETHODCALLTYPE CShellBrowser::_UpdateViewRectSize()
2755 {
2756     return E_NOTIMPL;
2757 }
2758 
2759 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorder(UINT itb)
2760 {
2761     return E_NOTIMPL;
2762 }
2763 
2764 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeView()
2765 {
2766     return E_NOTIMPL;
2767 }
2768 
2769 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon)
2770 {
2771     return E_NOTIMPL;
2772 }
2773 
2774 IStream *STDMETHODCALLTYPE CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName)
2775 {
2776     return NULL;
2777 }
2778 
2779 LRESULT STDMETHODCALLTYPE CShellBrowser::ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
2780 {
2781     return 0;
2782 }
2783 
2784 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAcceleratorMenu(HACCEL hacc)
2785 {
2786     return E_NOTIMPL;
2787 }
2788 
2789 int STDMETHODCALLTYPE CShellBrowser::_GetToolbarCount()
2790 {
2791     return 0;
2792 }
2793 
2794 LPTOOLBARITEM STDMETHODCALLTYPE CShellBrowser::_GetToolbarItem(int itb)
2795 {
2796     return NULL;
2797 }
2798 
2799 HRESULT STDMETHODCALLTYPE CShellBrowser::_SaveToolbars(IStream *pstm)
2800 {
2801     return E_NOTIMPL;
2802 }
2803 
2804 HRESULT STDMETHODCALLTYPE CShellBrowser::_LoadToolbars(IStream *pstm)
2805 {
2806     return E_NOTIMPL;
2807 }
2808 
2809 HRESULT STDMETHODCALLTYPE CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose)
2810 {
2811     return E_NOTIMPL;
2812 }
2813 
2814 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayGetNextToolbarFocus(
2815     LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd)
2816 {
2817     return E_NOTIMPL;
2818 }
2819 
2820 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor)
2821 {
2822     return E_NOTIMPL;
2823 }
2824 
2825 UINT STDMETHODCALLTYPE CShellBrowser::_FindTBar(IUnknown *punkSrc)
2826 {
2827     return 0;
2828 }
2829 
2830 HRESULT STDMETHODCALLTYPE CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg)
2831 {
2832     return E_NOTIMPL;
2833 }
2834 
2835 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayTranslateAccelerator(MSG *pmsg)
2836 {
2837     for (int i = 0; i < 3; i++)
2838     {
2839         if (IUnknown_TranslateAcceleratorIO(fClientBars[i].clientBar, pmsg) == S_OK)
2840             return S_OK;
2841     }
2842 
2843     if (!fCurrentShellView)
2844         return S_FALSE;
2845 
2846     return fCurrentShellView->TranslateAcceleratorW(pmsg);
2847 }
2848 
2849 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor)
2850 {
2851     return E_NOTIMPL;
2852 }
2853 
2854 HRESULT STDMETHODCALLTYPE CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl)
2855 {
2856     return E_NOTIMPL;
2857 }
2858 
2859 HRESULT STDMETHODCALLTYPE CShellBrowser::GoBack()
2860 {
2861     CComPtr<ITravelLog> travelLog;
2862     HRESULT hResult = GetTravelLog(&travelLog);
2863     if (FAILED_UNEXPECTEDLY(hResult))
2864         return hResult;
2865     return travelLog->Travel(static_cast<IDropTarget *>(this), TLOG_BACK);
2866 }
2867 
2868 HRESULT STDMETHODCALLTYPE CShellBrowser::GoForward()
2869 {
2870     CComPtr<ITravelLog> travelLog;
2871     HRESULT hResult = GetTravelLog(&travelLog);
2872     if (FAILED_UNEXPECTEDLY(hResult))
2873         return hResult;
2874     return travelLog->Travel(static_cast<IDropTarget *>(this), TLOG_FORE);
2875 }
2876 
2877 HRESULT STDMETHODCALLTYPE CShellBrowser::GoHome()
2878 {
2879     return E_NOTIMPL;
2880 }
2881 
2882 HRESULT STDMETHODCALLTYPE CShellBrowser::GoSearch()
2883 {
2884     return E_NOTIMPL;
2885 }
2886 
2887 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate(BSTR URL, VARIANT *Flags,
2888     VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
2889 {
2890     CComHeapPtr<ITEMIDLIST> pidl;
2891     HRESULT hResult;
2892     CComPtr<IShellFolder> pDesktop;
2893 
2894     hResult = SHGetDesktopFolder(&pDesktop);
2895     if (FAILED_UNEXPECTEDLY(hResult))
2896         return hResult;
2897     hResult = pDesktop->ParseDisplayName(NULL, NULL, URL, NULL, &pidl, NULL);
2898     if (FAILED_UNEXPECTEDLY(hResult))
2899         return hResult;
2900     return BrowseObject(pidl, 1);
2901 }
2902 
2903 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh()
2904 {
2905     VARIANT                                 level;
2906 
2907     V_VT(&level) = VT_I4;
2908     V_I4(&level) = 4;
2909     return Refresh2(&level);
2910 }
2911 
2912 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh2(VARIANT *Level)
2913 {
2914     CComPtr<IOleCommandTarget>              oleCommandTarget;
2915     HRESULT                                 hResult;
2916 
2917     hResult = fCurrentShellView->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &oleCommandTarget));
2918     if (FAILED_UNEXPECTEDLY(hResult))
2919         return hResult;
2920     return oleCommandTarget->Exec(NULL, 22, 1, Level, NULL);
2921 }
2922 
2923 HRESULT STDMETHODCALLTYPE CShellBrowser::Stop()
2924 {
2925     return E_NOTIMPL;
2926 }
2927 
2928 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Application(IDispatch **ppDisp)
2929 {
2930     return E_NOTIMPL;
2931 }
2932 
2933 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Parent(IDispatch **ppDisp)
2934 {
2935     return E_NOTIMPL;
2936 }
2937 
2938 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Container(IDispatch **ppDisp)
2939 {
2940     return E_NOTIMPL;
2941 }
2942 
2943 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Document(IDispatch **ppDisp)
2944 {
2945     return E_NOTIMPL;
2946 }
2947 
2948 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TopLevelContainer(VARIANT_BOOL *pBool)
2949 {
2950     return E_NOTIMPL;
2951 }
2952 
2953 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Type(BSTR *Type)
2954 {
2955     return E_NOTIMPL;
2956 }
2957 #ifdef __exdisp_h__
2958 #define long LONG
2959 #endif
2960 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Left(long *pl)
2961 {
2962     return E_NOTIMPL;
2963 }
2964 
2965 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Left(long Left)
2966 {
2967     return E_NOTIMPL;
2968 }
2969 
2970 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Top(long *pl)
2971 {
2972     return E_NOTIMPL;
2973 }
2974 
2975 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Top(long Top)
2976 {
2977     return E_NOTIMPL;
2978 }
2979 
2980 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Width(long *pl)
2981 {
2982     return E_NOTIMPL;
2983 }
2984 
2985 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Width(long Width)
2986 {
2987     return E_NOTIMPL;
2988 }
2989 
2990 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Height(long *pl)
2991 {
2992     return E_NOTIMPL;
2993 }
2994 
2995 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Height(long Height)
2996 {
2997     return E_NOTIMPL;
2998 }
2999 #ifdef __exdisp_h__
3000 #undef long
3001 #endif
3002 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationName(BSTR *LocationName)
3003 {
3004     return E_NOTIMPL;
3005 }
3006 
3007 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationURL(BSTR *LocationURL)
3008 {
3009     return E_NOTIMPL;
3010 }
3011 
3012 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Busy(VARIANT_BOOL *pBool)
3013 {
3014     return E_NOTIMPL;
3015 }
3016 
3017 HRESULT STDMETHODCALLTYPE CShellBrowser::Quit()
3018 {
3019     return E_NOTIMPL;
3020 }
3021 
3022 HRESULT STDMETHODCALLTYPE CShellBrowser::ClientToWindow(int *pcx, int *pcy)
3023 {
3024     return E_NOTIMPL;
3025 }
3026 
3027 HRESULT STDMETHODCALLTYPE CShellBrowser::PutProperty(BSTR Property, VARIANT vtValue)
3028 {
3029     return E_NOTIMPL;
3030 }
3031 
3032 HRESULT STDMETHODCALLTYPE CShellBrowser::GetProperty(BSTR Property, VARIANT *pvtValue)
3033 {
3034     return E_NOTIMPL;
3035 }
3036 
3037 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Name(BSTR *Name)
3038 {
3039     return E_NOTIMPL;
3040 }
3041 
3042 HRESULT STDMETHODCALLTYPE CShellBrowser::get_HWND(SHANDLE_PTR *pHWND)
3043 {
3044     return E_NOTIMPL;
3045 }
3046 
3047 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullName(BSTR *FullName)
3048 {
3049     return E_NOTIMPL;
3050 }
3051 
3052 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Path(BSTR *Path)
3053 {
3054     return E_NOTIMPL;
3055 }
3056 
3057 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Visible(VARIANT_BOOL *pBool)
3058 {
3059     return E_NOTIMPL;
3060 }
3061 
3062 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Visible(VARIANT_BOOL Value)
3063 {
3064     return E_NOTIMPL;
3065 }
3066 
3067 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusBar(VARIANT_BOOL *pBool)
3068 {
3069     return E_NOTIMPL;
3070 }
3071 
3072 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusBar(VARIANT_BOOL Value)
3073 {
3074     return E_NOTIMPL;
3075 }
3076 
3077 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusText(BSTR *StatusText)
3078 {
3079     return E_NOTIMPL;
3080 }
3081 
3082 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusText(BSTR StatusText)
3083 {
3084     return E_NOTIMPL;
3085 }
3086 
3087 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ToolBar(int *Value)
3088 {
3089     return E_NOTIMPL;
3090 }
3091 
3092 HRESULT STDMETHODCALLTYPE CShellBrowser::put_ToolBar(int Value)
3093 {
3094     return E_NOTIMPL;
3095 }
3096 
3097 HRESULT STDMETHODCALLTYPE CShellBrowser::get_MenuBar(VARIANT_BOOL *Value)
3098 {
3099     return E_NOTIMPL;
3100 }
3101 
3102 HRESULT STDMETHODCALLTYPE CShellBrowser::put_MenuBar(VARIANT_BOOL Value)
3103 {
3104     return E_NOTIMPL;
3105 }
3106 
3107 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullScreen(VARIANT_BOOL *pbFullScreen)
3108 {
3109     return E_NOTIMPL;
3110 }
3111 
3112 HRESULT STDMETHODCALLTYPE CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen)
3113 {
3114     return E_NOTIMPL;
3115 }
3116 
3117 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate2(VARIANT *URL, VARIANT *Flags,
3118     VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
3119 {
3120     LPITEMIDLIST pidl = NULL;
3121     HRESULT hResult;
3122     // called from drive combo box to navigate to a directory
3123     // Also called by search band to display shell results folder view
3124 
3125     if (V_VT(URL) == VT_BSTR)
3126     {
3127         return this->Navigate(V_BSTR(URL), Flags, TargetFrameName, PostData, Headers);
3128     }
3129     if (V_VT(URL) == (VT_ARRAY | VT_UI1))
3130     {
3131         if (V_ARRAY(URL)->cDims != 1 || V_ARRAY(URL)->cbElements != 1)
3132             return E_INVALIDARG;
3133 
3134         pidl = static_cast<LPITEMIDLIST>(V_ARRAY(URL)->pvData);
3135     }
3136     hResult = BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
3137     if (FAILED_UNEXPECTEDLY(hResult))
3138         return hResult;
3139     return S_OK;
3140 }
3141 
3142 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf)
3143 {
3144     return E_NOTIMPL;
3145 }
3146 
3147 HRESULT STDMETHODCALLTYPE CShellBrowser::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,
3148     VARIANT *pvaIn, VARIANT *pvaOut)
3149 {
3150     return E_NOTIMPL;
3151 }
3152 
3153 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize)
3154 {
3155     CLSID                                   classID;
3156     bool                                    vertical;
3157 
3158     // called to show search bar
3159     if (V_VT(pvaClsid) != VT_BSTR)
3160         return E_INVALIDARG;
3161     CLSIDFromString(V_BSTR(pvaClsid), &classID);
3162     // TODO: properly compute the value of vertical
3163     vertical = true;
3164     return ShowBand(classID, vertical);
3165 }
3166 
3167 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ReadyState(READYSTATE *plReadyState)
3168 {
3169     return E_NOTIMPL;
3170 }
3171 
3172 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Offline(VARIANT_BOOL *pbOffline)
3173 {
3174     return E_NOTIMPL;
3175 }
3176 
3177 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Offline(VARIANT_BOOL bOffline)
3178 {
3179     return E_NOTIMPL;
3180 }
3181 
3182 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Silent(VARIANT_BOOL *pbSilent)
3183 {
3184     return E_NOTIMPL;
3185 }
3186 
3187 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Silent(VARIANT_BOOL bSilent)
3188 {
3189     return E_NOTIMPL;
3190 }
3191 
3192 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL *pbRegister)
3193 {
3194     return E_NOTIMPL;
3195 }
3196 
3197 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister)
3198 {
3199     return E_NOTIMPL;
3200 }
3201 
3202 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister)
3203 {
3204     return E_NOTIMPL;
3205 }
3206 
3207 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister)
3208 {
3209     return E_NOTIMPL;
3210 }
3211 
3212 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TheaterMode(VARIANT_BOOL *pbRegister)
3213 {
3214     return E_NOTIMPL;
3215 }
3216 
3217 HRESULT STDMETHODCALLTYPE CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister)
3218 {
3219     return E_NOTIMPL;
3220 }
3221 
3222 HRESULT STDMETHODCALLTYPE CShellBrowser::get_AddressBar(VARIANT_BOOL *Value)
3223 {
3224     return E_NOTIMPL;
3225 }
3226 
3227 HRESULT STDMETHODCALLTYPE CShellBrowser::put_AddressBar(VARIANT_BOOL Value)
3228 {
3229     return E_NOTIMPL;
3230 }
3231 
3232 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Resizable(VARIANT_BOOL *Value)
3233 {
3234     return E_NOTIMPL;
3235 }
3236 
3237 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Resizable(VARIANT_BOOL Value)
3238 {
3239     return E_NOTIMPL;
3240 }
3241 
3242 HRESULT STDMETHODCALLTYPE CShellBrowser::FindWindowByIndex(DWORD dwID, IUnknown **ppunk)
3243 {
3244     return E_NOTIMPL;
3245 }
3246 
3247 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindowData(IStream *pStream, LPWINDOWDATA pWinData)
3248 {
3249     if (pWinData == NULL)
3250         return E_POINTER;
3251 
3252     pWinData->dwWindowID = -1;
3253     pWinData->uiCP = 0;
3254     pWinData->pidl = ILClone(fCurrentDirectoryPIDL);
3255     pWinData->lpszUrl = NULL;
3256     pWinData->lpszUrlLocation = NULL;
3257     pWinData->lpszTitle = NULL;
3258     return S_OK;
3259 }
3260 
3261 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition)
3262 {
3263     return E_NOTIMPL;
3264 }
3265 
3266 HRESULT STDMETHODCALLTYPE CShellBrowser::GetClassID(CLSID *pClassID)
3267 {
3268     return E_NOTIMPL;
3269 }
3270 
3271 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistory(IStream *pStream, IBindCtx *pbc)
3272 {
3273     CComPtr<IPersistHistory>                viewPersistHistory;
3274     CComPtr<IOleObject>                     viewHistoryObject;
3275     persistState                            oldState;
3276     ULONG                                   numRead;
3277     LPITEMIDLIST                            pidl;
3278     HRESULT                                 hResult;
3279 
3280     hResult = pStream->Read(&oldState, sizeof(oldState), &numRead);
3281     if (FAILED_UNEXPECTEDLY(hResult))
3282         return hResult;
3283     if (numRead != sizeof(oldState) || oldState.dwSize != sizeof(oldState))
3284         return E_FAIL;
3285     if (oldState.browseType != 2)
3286         return E_FAIL;
3287     pidl = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(oldState.pidlSize));
3288     if (pidl == NULL)
3289         return E_OUTOFMEMORY;
3290     hResult = pStream->Read(pidl, oldState.pidlSize, &numRead);
3291     if (FAILED_UNEXPECTEDLY(hResult))
3292     {
3293         ILFree(pidl);
3294         return hResult;
3295     }
3296     if (numRead != oldState.pidlSize)
3297     {
3298         ILFree(pidl);
3299         return E_FAIL;
3300     }
3301     hResult = CoCreateInstance(oldState.persistClass, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER,
3302         IID_PPV_ARG(IOleObject, &viewHistoryObject));
3303     fHistoryObject = viewHistoryObject;
3304     fHistoryStream = pStream;
3305     fHistoryBindContext = pbc;
3306     hResult = BrowseToPIDL(pidl, BTP_DONT_UPDATE_HISTORY);
3307     fHistoryObject = NULL;
3308     fHistoryStream = NULL;
3309     fHistoryBindContext = NULL;
3310     ILFree(pidl);
3311     if (FAILED_UNEXPECTEDLY(hResult))
3312         return hResult;
3313     return S_OK;
3314 }
3315 
3316 HRESULT STDMETHODCALLTYPE CShellBrowser::SaveHistory(IStream *pStream)
3317 {
3318     CComPtr<IPersistHistory>                viewPersistHistory;
3319     persistState                            newState;
3320     HRESULT                                 hResult;
3321 
3322     hResult = fCurrentShellView->GetItemObject(
3323         SVGIO_BACKGROUND, IID_PPV_ARG(IPersistHistory, &viewPersistHistory));
3324     memset(&newState, 0, sizeof(newState));
3325     newState.dwSize = sizeof(newState);
3326     newState.browseType = 2;
3327     newState.browserIndex = GetBrowserIndex();
3328     if (viewPersistHistory.p != NULL)
3329     {
3330         hResult = viewPersistHistory->GetClassID(&newState.persistClass);
3331         if (FAILED_UNEXPECTEDLY(hResult))
3332             return hResult;
3333     }
3334     newState.pidlSize = ILGetSize(fCurrentDirectoryPIDL);
3335     hResult = pStream->Write(&newState, sizeof(newState), NULL);
3336     if (FAILED_UNEXPECTEDLY(hResult))
3337         return hResult;
3338     hResult = pStream->Write(fCurrentDirectoryPIDL, newState.pidlSize, NULL);
3339     if (FAILED_UNEXPECTEDLY(hResult))
3340         return hResult;
3341     if (viewPersistHistory.p != NULL)
3342     {
3343         hResult = viewPersistHistory->SaveHistory(pStream);
3344         if (FAILED_UNEXPECTEDLY(hResult))
3345             return hResult;
3346     }
3347     return S_OK;
3348 }
3349 
3350 HRESULT STDMETHODCALLTYPE CShellBrowser::SetPositionCookie(DWORD dwPositioncookie)
3351 {
3352     return E_NOTIMPL;
3353 }
3354 
3355 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPositionCookie(DWORD *pdwPositioncookie)
3356 {
3357     return E_NOTIMPL;
3358 }
3359 
3360 LRESULT CShellBrowser::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3361 {
3362     OnCreate(reinterpret_cast<LPCREATESTRUCT> (lParam));
3363     return 0;
3364 }
3365 
3366 LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3367 {
3368     HRESULT hr;
3369 
3370     /* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
3371     OleFlushClipboard();
3372 
3373     // TODO: rip down everything
3374     {
3375         fToolbarProxy.Destroy();
3376 
3377         fCurrentShellView->DestroyViewWindow();
3378         fCurrentShellView->UIActivate(SVUIA_DEACTIVATE);
3379 
3380         for (int i = 0; i < 3; i++)
3381         {
3382             CComPtr<IDockingWindow> pdw;
3383             CComPtr<IDeskBar> bar;
3384             CComPtr<IUnknown> pBarSite;
3385             CComPtr<IDeskBarClient> pClient;
3386 
3387             if (fClientBars[i].clientBar == NULL)
3388                 continue;
3389 
3390             hr = fClientBars[i].clientBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &pdw));
3391             if (FAILED_UNEXPECTEDLY(hr))
3392                 continue;
3393 
3394             /* We should destroy our basebarsite too */
3395             hr = pdw->QueryInterface(IID_PPV_ARG(IDeskBar, &bar));
3396             if (SUCCEEDED(hr))
3397             {
3398                 hr = bar->GetClient(&pBarSite);
3399                 if (SUCCEEDED(hr) && pBarSite)
3400                 {
3401                     hr = pBarSite->QueryInterface(IID_PPV_ARG(IDeskBarClient, &pClient));
3402                     if (SUCCEEDED(hr))
3403                         pClient->SetDeskBarSite(NULL);
3404                 }
3405             }
3406             pdw->CloseDW(0);
3407 
3408             pClient = NULL;
3409             pBarSite = NULL;
3410             pdw = NULL;
3411             bar = NULL;
3412             ReleaseCComPtrExpectZero(fClientBars[i].clientBar);
3413         }
3414         ReleaseCComPtrExpectZero(fCurrentShellView);
3415         ReleaseCComPtrExpectZero(fTravelLog);
3416 
3417         fCurrentShellFolder.Release();
3418         ILFree(fCurrentDirectoryPIDL);
3419         ::DestroyWindow(fStatusBar);
3420         DestroyMenu(fCurrentMenuBar);
3421     }
3422     PostQuitMessage(0);
3423     return 0;
3424 }
3425 
3426 LRESULT CShellBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3427 {
3428     CComPtr<IDockingWindow>                 dockingWindow;
3429     RECT                                    availableBounds;
3430     static const INT                        excludeItems[] = {1, 1, 1, 0xa001, 0, 0};
3431     HRESULT                                 hResult;
3432 
3433     if (wParam != SIZE_MINIMIZED)
3434     {
3435         GetEffectiveClientRect(m_hWnd, &availableBounds, excludeItems);
3436         for (INT x = 0; x < 3; x++)
3437         {
3438             if (fClientBars[x].clientBar != NULL)
3439             {
3440                 hResult = fClientBars[x].clientBar->QueryInterface(
3441                     IID_PPV_ARG(IDockingWindow, &dockingWindow));
3442                 if (SUCCEEDED(hResult) && dockingWindow != NULL)
3443                 {
3444                     hResult = dockingWindow->ResizeBorderDW(
3445                         &availableBounds, static_cast<IDropTarget *>(this), TRUE);
3446                     break;
3447                 }
3448             }
3449         }
3450         RepositionBars();
3451     }
3452     return 1;
3453 }
3454 
3455 LRESULT CShellBrowser::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3456 {
3457     HMENU  theMenu;
3458     LPARAM menuIndex = lParam;
3459 
3460     theMenu = reinterpret_cast<HMENU>(wParam);
3461 
3462     if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_FILE))
3463     {
3464         menuIndex = 0;
3465     }
3466     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_EDIT))
3467     {
3468         menuIndex = 1;
3469     }
3470     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_VIEW))
3471     {
3472         UpdateViewMenu(theMenu);
3473         menuIndex = 2;
3474     }
3475     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_FAVORITES))
3476     {
3477         menuIndex = 3;
3478     }
3479     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_TOOLS))
3480     {
3481         // FIXME: Remove once implemented
3482         SHEnableMenuItem(theMenu, IDM_TOOLS_MAPNETWORKDRIVE, FALSE);
3483         SHEnableMenuItem(theMenu, IDM_TOOLS_DISCONNECTNETWORKDRIVE, FALSE);
3484         SHEnableMenuItem(theMenu, IDM_TOOLS_SYNCHRONIZE, FALSE);
3485         FIXME("Folder options dialog is stubbed: CORE-11141\n");
3486         SHEnableMenuItem(theMenu, IDM_TOOLS_FOLDEROPTIONS, FALSE);  // Remove when CORE-11141 is fixed.
3487         menuIndex = 4;
3488     }
3489     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_HELP))
3490     {
3491         menuIndex = 5;
3492     }
3493 
3494     LRESULT ret = RelayMsgToShellView(uMsg, wParam, menuIndex, bHandled);
3495 
3496     return ret;
3497 }
3498 
3499 LRESULT CShellBrowser::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3500 {
3501     ::SetFocus(fCurrentShellViewWindow);
3502     return 0;
3503 }
3504 
3505 LRESULT CShellBrowser::RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3506 {
3507     if (fCurrentShellViewWindow != NULL)
3508         return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam);
3509     return 0;
3510 }
3511 
3512 LRESULT CShellBrowser::PropagateMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3513 {
3514     SHPropagateMessage(m_hWnd, uMsg, wParam, lParam, TRUE);
3515     return 0;
3516 }
3517 
3518 LRESULT CShellBrowser::OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3519 {
3520     return SendMessage(WM_CLOSE);
3521 }
3522 
3523 LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3524 {
3525     HRESULT hResult = DoFolderOptions();
3526     if (FAILED(hResult))
3527         TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult);
3528     return 0;
3529 }
3530 
3531 LRESULT CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3532 {
3533 #ifndef __REACTOS__
3534     WNetConnectionDialog(m_hWnd, RESOURCETYPE_DISK);
3535 #endif /* __REACTOS__ */
3536     return 0;
3537 }
3538 
3539 LRESULT CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3540 {
3541 #ifndef __REACTOS__
3542     WNetDisconnectDialog(m_hWnd, RESOURCETYPE_DISK);
3543 #endif /* __REACTOS__ */
3544     return 0;
3545 }
3546 
3547 LRESULT CShellBrowser::OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3548 {
3549     ShellAbout(m_hWnd, _T("ReactOS"), _T(""), NULL);
3550     return 0;
3551 }
3552 
3553 LRESULT CShellBrowser::OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3554 {
3555     HRESULT hResult = GoBack();
3556     if (FAILED(hResult))
3557         TRACE("GoBack failed with hResult=%08lx\n", hResult);
3558     return 0;
3559 }
3560 
3561 LRESULT CShellBrowser::OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3562 {
3563     HRESULT hResult = GoForward();
3564     if (FAILED(hResult))
3565         TRACE("GoForward failed with hResult=%08lx\n", hResult);
3566     return 0;
3567 }
3568 
3569 LRESULT CShellBrowser::OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3570 {
3571     HRESULT hResult = NavigateToParent();
3572     if (FAILED(hResult))
3573         TRACE("NavigateToParent failed with hResult=%08lx\n", hResult);
3574     return 0;
3575 }
3576 
3577 LRESULT CShellBrowser::OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3578 {
3579     HRESULT hResult = GoHome();
3580     if (FAILED(hResult))
3581         TRACE("GoHome failed with hResult=%08lx\n", hResult);
3582     return 0;
3583 }
3584 
3585 LRESULT CShellBrowser::OnBackspace(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3586 {
3587     // FIXME: This does not appear to be what windows does.
3588     HRESULT hResult = NavigateToParent();
3589     if (FAILED(hResult))
3590         TRACE("NavigateToParent failed with hResult=%08lx\n", hResult);
3591     return 0;
3592 }
3593 
3594 LRESULT CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3595 {
3596     CComPtr<IShellFolder> psfDesktop;
3597     LPITEMIDLIST pidlFavs;
3598     HRESULT hr;
3599     hr = SHGetSpecialFolderLocation(m_hWnd, CSIDL_FAVORITES, &pidlFavs);
3600     if (FAILED(hr))
3601     {
3602         hr = SHGetSpecialFolderLocation(m_hWnd, CSIDL_COMMON_FAVORITES, &pidlFavs);
3603         if (FAILED(hr))
3604             return 0;
3605     }
3606 
3607     hr = SHGetDesktopFolder(&psfDesktop);
3608     if (FAILED_UNEXPECTEDLY(hr))
3609         return 0;
3610 
3611     hr = SHInvokeDefaultCommand(m_hWnd, psfDesktop, pidlFavs);
3612     if (FAILED_UNEXPECTEDLY(hr))
3613         return 0;
3614 
3615     return 0;
3616 }
3617 
3618 LRESULT CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3619 {
3620     fStatusBarVisible = !fStatusBarVisible;
3621     if (fStatusBar)
3622     {
3623         ::ShowWindow(fStatusBar, fStatusBarVisible ? SW_SHOW : SW_HIDE);
3624         RepositionBars();
3625     }
3626     return 0;
3627 }
3628 
3629 LRESULT CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3630 {
3631     HRESULT hResult;
3632     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3633                             CGID_PrivCITCommands, ITID_TOOLBARLOCKED, 0, NULL, NULL);
3634     return 0;
3635 }
3636 
3637 LRESULT CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3638 {
3639     HRESULT hResult;
3640     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3641                             CGID_PrivCITCommands, ITID_TOOLBARBANDSHOWN, 0, NULL, NULL);
3642     return 0;
3643 }
3644 
3645 LRESULT CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3646 {
3647     HRESULT hResult;
3648     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3649                             CGID_PrivCITCommands, ITID_ADDRESSBANDSHOWN, 0, NULL, NULL);
3650     return 0;
3651 }
3652 
3653 LRESULT CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3654 {
3655     HRESULT hResult;
3656     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3657                             CGID_PrivCITCommands, ITID_LINKSBANDSHOWN, 0, NULL, NULL);
3658     return 0;
3659 }
3660 
3661 LRESULT CShellBrowser::OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3662 {
3663     HRESULT hResult;
3664     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3665                             CGID_PrivCITCommands, ITID_TEXTLABELS, 0, NULL, NULL);
3666     return 0;
3667 }
3668 
3669 LRESULT CShellBrowser::OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3670 {
3671     HRESULT hResult;
3672     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3673                             CGID_PrivCITCommands, ITID_CUSTOMIZEENABLED, 0, NULL, NULL);
3674     return 0;
3675 }
3676 
3677 LRESULT CShellBrowser::OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3678 {
3679     if (fCurrentShellView)
3680         fCurrentShellView->Refresh();
3681     return 0;
3682 }
3683 
3684 LRESULT CShellBrowser::OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3685 {
3686     return 0;
3687 }
3688 
3689 LRESULT CShellBrowser::OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3690 {
3691     // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3692     if (wID >= IDM_EXPLORERBAND_BEGINCUSTOM && wID <= IDM_EXPLORERBAND_ENDCUSTOM)
3693     {
3694         MenuBandInfo *mbi;
3695         mbi = (MenuBandInfo*)DSA_GetItemPtr(menuDsa, (wID - IDM_EXPLORERBAND_BEGINCUSTOM));
3696         if (!mbi)
3697             return 0;
3698         ShowBand(mbi->barGuid, mbi->fVertical);
3699         bHandled = TRUE;
3700         return 1;
3701     }
3702     switch (wID)
3703     {
3704     case IDM_EXPLORERBAR_SEARCH:
3705         Exec(&CLSID_CommonButtons, 0x123, 1, NULL, NULL);
3706         break;
3707     case IDM_EXPLORERBAR_FOLDERS:
3708         ShowBand(CLSID_ExplorerBand, true);
3709         break;
3710     case IDM_EXPLORERBAR_HISTORY:
3711         ShowBand(CLSID_SH_HistBand, true);
3712         break;
3713     case IDM_EXPLORERBAR_FAVORITES:
3714         ShowBand(CLSID_SH_FavBand, true);
3715         break;
3716     default:
3717         WARN("Unknown id %x\n", wID);
3718     }
3719     bHandled = TRUE;
3720     return 1;
3721 }
3722 
3723 LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3724 {
3725     if (HIWORD(wParam) == 0 && LOWORD(wParam) < FCIDM_SHVIEWLAST && fCurrentShellViewWindow != NULL)
3726         return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam);
3727     return 0;
3728 }
3729 
3730 HRESULT CShellBrowser_CreateInstance(LPITEMIDLIST pidl, DWORD dwFlags, REFIID riid, void **ppv)
3731 {
3732     return ShellObjectCreatorInit<CShellBrowser>(pidl, dwFlags, riid, ppv);
3733 }
3734