LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
{
CComPtr<IShellFolder> parentFolder;
- LPITEMIDLIST childPIDL;
+ LPITEMIDLIST childPIDL = NULL;
STRRET L108;
HRESULT hResult;
hResult = SHBindToFolderIDListParent(NULL, pidl, &IID_PPV_ARG(IShellFolder, &parentFolder), &childPIDL);
if (FAILED(hResult))
- return hResult;
+ goto cleanup;
hResult = parentFolder->GetDisplayNameOf(childPIDL, uFlags, &L108);
if (FAILED(hResult))
- return hResult;
+ goto cleanup;
StrRetToBufW(&L108, childPIDL, pszBuf, cchBuf);
if (rgfInOut)
{
hResult = parentFolder->GetAttributesOf(1, const_cast<LPCITEMIDLIST *>(&childPIDL), rgfInOut);
if (FAILED(hResult))
- return hResult;
+ goto cleanup;
}
- ILFree(childPIDL);
- return S_OK;
+ hResult = S_OK;
+
+cleanup:
+ if (childPIDL)
+ ILFree(childPIDL);
+ return hResult;
}
long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
HICON icSmall = ImageList_GetIcon(himlSmall, indexOpen, 0);
HICON icLarge = ImageList_GetIcon(himlLarge, indexOpen, 0);
+ /* Hack to make it possible to release the old icons */
+ /* Something seems to go wrong with WM_SETICON */
+ HICON oldSmall = (HICON)SendMessage(WM_GETICON, ICON_SMALL, 0);
+ HICON oldLarge = (HICON)SendMessage(WM_GETICON, ICON_BIG, 0);
+
SendMessage(WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(icSmall));
SendMessage(WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(icLarge));
- }
- // TODO: Update the window icon
+ DestroyIcon(oldSmall);
+ DestroyIcon(oldLarge);
+ }
FireCommandStateChangeAll();
hResult = UpdateForwardBackState();
HRESULT CShellBrowser::GetMenuBand(REFIID riid, void **shellMenu)
{
- CComPtr<IServiceProvider> serviceProvider;
CComPtr<IBandSite> bandSite;
CComPtr<IDeskBand> deskBand;
HRESULT hResult;
CComPtr<IUnknown> newBaseBar;
CComPtr<IDeskBar> deskBar;
CComPtr<IUnknown> newBaseBarSite;
- CComPtr<IObjectWithSite> objectWithSite;
CComPtr<IDeskBarClient> deskBarClient;
IUnknown **cache;
HRESULT hResult;
return hResult;
// tell the new base bar about the shell browser
- hResult = newBaseBar->QueryInterface(IID_PPV_ARG(IObjectWithSite, &objectWithSite));
- if (FAILED_UNEXPECTEDLY(hResult))
- return hResult;
- hResult = objectWithSite->SetSite(static_cast<IDropTarget *>(this));
+ hResult = IUnknown_SetSite(newBaseBar, static_cast<IDropTarget *>(this));
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical)
{
CComPtr<IDockingWindow> dockingWindow;
- CComPtr<IOleCommandTarget> oleCommandTarget;
CComPtr<IUnknown> baseBarSite;
CComPtr<IUnknown> newBand;
CComPtr<IUnknown> theBaseBar;
VARIANT vaIn;
HRESULT hResult;
- __debugbreak();
-
hResult = GetBaseBar(vertical, (IUnknown **)&theBaseBar);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
hResult = theBaseBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow));
- if (FAILED_UNEXPECTEDLY(hResult))
- return hResult;
- hResult = baseBarSite->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &oleCommandTarget));
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
V_VT(&vaIn) = VT_UNKNOWN;
V_UNKNOWN(&vaIn) = newBand.p;
- hResult = oleCommandTarget->Exec(&CGID_IDeskBand, 1, 1, &vaIn, NULL);
+ hResult = IUnknown_Exec(baseBarSite, CGID_IDeskBand, 1, 1, &vaIn, NULL);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
hResult = dockingWindow->ShowDW(TRUE);
HRESULT CShellBrowser::NavigateToParent()
{
- LPITEMIDLIST newDirectory;
- HRESULT hResult;
-
- newDirectory = ILClone(fCurrentDirectoryPIDL);
+ LPITEMIDLIST newDirectory = ILClone(fCurrentDirectoryPIDL);
if (newDirectory == NULL)
return E_OUTOFMEMORY;
ILRemoveLastID(newDirectory);
- hResult = BrowseToPIDL(newDirectory, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
+ HRESULT hResult = BrowseToPIDL(newDirectory, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
ILFree(newDirectory);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
BOOL CALLBACK AddFolderOptionsPage(HPROPSHEETPAGE thePage, LPARAM lParam)
{
- PROPSHEETHEADER *sheetInfo;
-
- sheetInfo = (PROPSHEETHEADER *)lParam;
+ PROPSHEETHEADER* sheetInfo = reinterpret_cast<PROPSHEETHEADER*>(lParam);
if (sheetInfo->nPages >= folderOptionsPageCountMax)
return FALSE;
sheetInfo->phpage[sheetInfo->nPages] = thePage;
HRESULT CShellBrowser::DoFolderOptions()
{
CComPtr<IShellPropSheetExt> folderOptionsSheet;
- CComPtr<IObjectWithSite> objectWithSite;
PROPSHEETHEADER m_PropSheet;
HPROPSHEETPAGE m_psp[folderOptionsPageCountMax];
// CComPtr<IGlobalFolderSettings> globalSettings;
return E_FAIL;
// must set site in order for Apply to all Folders on Advanced page to be enabled
- hResult = folderOptionsSheet->QueryInterface(IID_PPV_ARG(IObjectWithSite, &objectWithSite));
- if (SUCCEEDED(hResult) && objectWithSite.p != NULL)
- hResult = objectWithSite->SetSite(static_cast<IDispatch *>(this));
+ hResult = IUnknown_SetSite(folderOptionsSheet, static_cast<IDispatch *>(this));
m_PropSheet.phpage = m_psp;
#if 0
void CShellBrowser::UpdateViewMenu(HMENU theMenu)
{
- CComPtr<IOleCommandTarget> oleCommandTarget;
CComPtr<ITravelLog> travelLog;
HMENU gotoMenu;
OLECMD commandList[5];
commandList[3].cmdID = ITID_TOOLBARLOCKED;
commandList[4].cmdID = ITID_CUSTOMIZEENABLED;
- hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
- IID_PPV_ARG(IOleCommandTarget, &oleCommandTarget));
- if (SUCCEEDED(hResult))
- hResult = oleCommandTarget->QueryStatus(&CGID_PrivCITCommands, 5, commandList, NULL);
+ hResult = IUnknown_QueryStatus(fClientBars[BIInternetToolbar].clientBar,
+ CGID_PrivCITCommands, 5, commandList, NULL);
if (FAILED_UNEXPECTEDLY(hResult))
DeleteMenu(theMenu, IDM_VIEW_TOOLBARS, MF_BYCOMMAND);
else
RemoveMenu(toolbarMenuBar, 0, MF_BYPOSITION);
DestroyMenu(toolbarMenuBar);
- SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf);
- SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_ENABLED);
- SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_ENABLED);
- SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LOCKTOOLBARS, commandList[3].cmdf & OLECMDF_ENABLED);
+ // TODO: Implement
+ SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf & OLECMDF_ENABLED);
+ SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_ENABLED);
+ SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_ENABLED);
+ SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, commandList[4].cmdf & OLECMDF_ENABLED);
+
+ SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf & OLECMDF_LATCHED);
+ SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_LATCHED);
+ SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_LATCHED);
+ SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LOCKTOOLBARS, commandList[3].cmdf & OLECMDF_LATCHED);
if ((commandList[4].cmdf & OLECMDF_ENABLED) == 0)
DeleteMenu(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND);
DeleteMenu(toolbarMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND);
SetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo);
}
SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, fStatusBarVisible ? TRUE : FALSE);
+
+ // TODO: Implement
+ SHEnableMenuItem(theMenu, IDM_VIEW_EXPLORERBAR, FALSE);
}
bool IUnknownIsEqual(IUnknown *int1, IUnknown *int2)
return S_OK;
}
+ if (!fCurrentShellView)
+ return S_FALSE;
+
return fCurrentShellView->TranslateAcceleratorW(pmsg);
}
HRESULT STDMETHODCALLTYPE CShellBrowser::GoBack()
{
- CComPtr<ITravelLog> travelLog;
- HRESULT hResult;
-
- hResult = GetTravelLog(&travelLog);
+ CComPtr<ITravelLog> travelLog;
+ HRESULT hResult = GetTravelLog(&travelLog);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
return travelLog->Travel(static_cast<IDropTarget *>(this), TLOG_BACK);
HRESULT STDMETHODCALLTYPE CShellBrowser::GoForward()
{
- CComPtr<ITravelLog> travelLog;
- HRESULT hResult;
-
- hResult = GetTravelLog(&travelLog);
+ CComPtr<ITravelLog> travelLog;
+ HRESULT hResult = GetTravelLog(&travelLog);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
return travelLog->Travel(static_cast<IDropTarget *>(this), TLOG_FORE);
HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate2(VARIANT *URL, VARIANT *Flags,
VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
{
- LPITEMIDLIST pidl;
- HRESULT hResult;
-
// called from drive combo box to navigate to a directory
if (V_VT(URL) != (VT_ARRAY | VT_UI1))
return E_INVALIDARG;
if (V_ARRAY(URL)->cDims != 1 || V_ARRAY(URL)->cbElements != 1)
return E_INVALIDARG;
- pidl = (LPITEMIDLIST)V_ARRAY(URL)->pvData;
- hResult = BrowseToPIDL((LPITEMIDLIST)pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
+
+ LPITEMIDLIST pidl = static_cast<LPITEMIDLIST>(V_ARRAY(URL)->pvData);
+ HRESULT hResult = BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
return S_OK;
return 0;
}
-template<class T>
-void ReleaseCComPtrExpectZero(CComPtr<T>& cptr, BOOL forceRelease = FALSE)
-{
- if (cptr.p != NULL)
- {
- int nrc = cptr->Release();
- if (nrc > 0)
- {
- DbgPrint("WARNING: Unexpected RefCount > 0!\n");
- if (forceRelease)
- {
- while (nrc > 0)
- {
- nrc = cptr->Release();
- }
- }
- }
- cptr.Detach();
- }
-}
-
LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
HRESULT hr;
}
else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_TOOLS))
{
+ // FIXME: Remove once implemented
+ SHEnableMenuItem(theMenu, IDM_TOOLS_MAPNETWORKDRIVE, FALSE);
+ SHEnableMenuItem(theMenu, IDM_TOOLS_DISCONNECTNETWORKDRIVE, FALSE);
+ SHEnableMenuItem(theMenu, IDM_TOOLS_SYNCHRONIZE, FALSE);
+ SHEnableMenuItem(theMenu, IDM_TOOLS_FOLDEROPTIONS, FALSE);
menuIndex = 4;
}
else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_HELP))
LRESULT CShellBrowser::OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- return 0;
+ return SendMessage(WM_CLOSE);
}
LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- HRESULT hResult;
-
- hResult = DoFolderOptions();
+ HRESULT hResult = DoFolderOptions();
+ if (FAILED(hResult))
+ TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult);
return 0;
}
LRESULT CShellBrowser::OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- HRESULT hResult;
-
- hResult = GoBack();
+ HRESULT hResult = GoBack();
+ if (FAILED(hResult))
+ TRACE("GoBack failed with hResult=%08lx\n", hResult);
return 0;
}
LRESULT CShellBrowser::OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- HRESULT hResult;
-
- hResult = GoForward();
+ HRESULT hResult = GoForward();
+ if (FAILED(hResult))
+ TRACE("GoForward failed with hResult=%08lx\n", hResult);
return 0;
}
LRESULT CShellBrowser::OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- HRESULT hResult;
-
- hResult = NavigateToParent();
+ HRESULT hResult = NavigateToParent();
+ if (FAILED(hResult))
+ TRACE("NavigateToParent failed with hResult=%08lx\n", hResult);
return 0;
}
LRESULT CShellBrowser::OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- HRESULT hResult;
-
- hResult = GoHome();
+ HRESULT hResult = GoHome();
+ if (FAILED(hResult))
+ TRACE("GoHome failed with hResult=%08lx\n", hResult);
return 0;
}
LRESULT CShellBrowser::OnBackspace(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- HRESULT hResult;
-
// FIXME: This does not appear to be what windows does.
- hResult = NavigateToParent();
+ HRESULT hResult = NavigateToParent();
+ if (FAILED(hResult))
+ TRACE("NavigateToParent failed with hResult=%08lx\n", hResult);
return 0;
}
LRESULT CShellBrowser::OnIsThisLegal(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- HRESULT hResult;
-
- typedef HRESULT (WINAPI *PSHOpenNewFrame)(LPITEMIDLIST pidl, IUnknown *b, long c, long d);
- PSHOpenNewFrame Func = NULL;
- HMODULE Module = GetModuleHandle(TEXT("browseui.dll"));
- if (Module != NULL)
- Func = reinterpret_cast<PSHOpenNewFrame>(GetProcAddress(Module, (LPCSTR) 103));
- if (Func != NULL)
- {
- LPITEMIDLIST desktopPIDL;
-
- hResult = SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &desktopPIDL);
- if (SUCCEEDED(hResult))
- {
- hResult = Func(desktopPIDL, NULL, -1, 1);
- }
- }
+ ShellExecute(m_hWnd, NULL, L"https://reactos.org/user-faq", NULL, NULL, SW_SHOWNORMAL);
return 0;
}
LRESULT CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- CComPtr<IOleCommandTarget> commandTarget;
- HRESULT hResult;
-
- hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
- IID_PPV_ARG(IOleCommandTarget, &commandTarget));
- if (FAILED_UNEXPECTEDLY(hResult))
- return 0;
- hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARLOCKED, 0, NULL, NULL);
+ HRESULT hResult;
+ hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
+ CGID_PrivCITCommands, ITID_TOOLBARLOCKED, 0, NULL, NULL);
return 0;
}
LRESULT CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- CComPtr<IOleCommandTarget> commandTarget;
- HRESULT hResult;
-
- hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
- IID_PPV_ARG(IOleCommandTarget, &commandTarget));
- if (FAILED_UNEXPECTEDLY(hResult))
- return 0;
- hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARBANDSHOWN, 0, NULL, NULL);
+ HRESULT hResult;
+ hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
+ CGID_PrivCITCommands, ITID_TOOLBARBANDSHOWN, 0, NULL, NULL);
return 0;
}
LRESULT CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- CComPtr<IOleCommandTarget> commandTarget;
- HRESULT hResult;
-
- hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
- IID_PPV_ARG(IOleCommandTarget, &commandTarget));
- if (FAILED_UNEXPECTEDLY(hResult))
- return 0;
- hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_ADDRESSBANDSHOWN, 0, NULL, NULL);
+ HRESULT hResult;
+ hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
+ CGID_PrivCITCommands, ITID_ADDRESSBANDSHOWN, 0, NULL, NULL);
return 0;
}
LRESULT CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- CComPtr<IOleCommandTarget> commandTarget;
- HRESULT hResult;
-
- hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
- IID_PPV_ARG(IOleCommandTarget, &commandTarget));
- if (FAILED_UNEXPECTEDLY(hResult))
- return 0;
- hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_LINKSBANDSHOWN, 0, NULL, NULL);
+ HRESULT hResult;
+ hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
+ CGID_PrivCITCommands, ITID_LINKSBANDSHOWN, 0, NULL, NULL);
return 0;
}
LRESULT CShellBrowser::OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- CComPtr<IOleCommandTarget> commandTarget;
- HRESULT hResult;
-
- hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
- IID_PPV_ARG(IOleCommandTarget, &commandTarget));
- if (FAILED_UNEXPECTEDLY(hResult))
- return 0;
- hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TEXTLABELS, 0, NULL, NULL);
+ HRESULT hResult;
+ hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
+ CGID_PrivCITCommands, ITID_TEXTLABELS, 0, NULL, NULL);
return 0;
}
LRESULT CShellBrowser::OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
{
- CComPtr<IOleCommandTarget> commandTarget;
- HRESULT hResult;
-
- hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
- IID_PPV_ARG(IOleCommandTarget, &commandTarget));
- if (FAILED_UNEXPECTEDLY(hResult))
- return 0;
- hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_CUSTOMIZEENABLED, 0, NULL, NULL);
+ HRESULT hResult;
+ hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
+ CGID_PrivCITCommands, ITID_CUSTOMIZEENABLED, 0, NULL, NULL);
return 0;
}
DispatchMessage(&Msg);
}
}
-
- //TerminateProcess(GetCurrentProcess(), hResult);
int nrc = theCabinet->Release();
if (nrc > 0)
{
- DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked, process will never terminate. Terminating forcefully.\n", nrc);
-
- //TerminateProcess(GetCurrentProcess(), 1);
+ DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc);
}
theCabinet.Detach();