* Fix assumption that the USER folder will always exist and only the COMMON folder may be missing. Allows the Start Menu to work in livecd.

[BROWSEUI]
* Apply the same fix to the Favorites folder, although the LiveCD does not currently have the folder so it will not work regardless.

svn path=/branches/shell-experiments/; revision=65098
This commit is contained in:
David Quintana 2014-10-29 11:52:45 +00:00
parent 4fc224434a
commit a0ec7d507f
2 changed files with 48 additions and 11 deletions

View file

@ -21,6 +21,8 @@
#include "CMergedFolder.h"
WINE_DEFAULT_DEBUG_CHANNEL(CStartMenu);
// TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
IID IID_IAugmentedShellFolder = { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } };
IID IID_IAugmentedShellFolder2 = { 0x8DB3B3F4, 0x6CFE, 0x11D1, { 0x8A, 0xE9, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0 } };
@ -336,15 +338,30 @@ static HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
hr = SHGetSpecialFolderLocation(NULL, CSIDL_STARTMENU, &pidlUserStartMenu);
if (FAILED(hr))
return hr;
if (FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_STARTMENU, &pidlCommonStartMenu)))
{
WARN("Failed to get the USER start menu folder. Trying to run with just the COMMON one.\n");
hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_STARTMENU, &pidlCommonStartMenu);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
TRACE("COMMON start menu obtained.\n");
hr = BindToDesktop(pidlCommonStartMenu, ppsfStartMenu);
ILFree(pidlCommonStartMenu);
return hr;
}
hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_STARTMENU, &pidlCommonStartMenu);
if (FAILED_UNEXPECTEDLY(hr))
{
WARN("Failed to get the COMMON start menu folder. Will use only the USER contents.\n");
hr = BindToDesktop(pidlUserStartMenu, ppsfStartMenu);
ILFree(pidlUserStartMenu);
return hr;
}
TRACE("Both COMMON and USER statr menu folders obtained, merging them...\n");
hr = BindToDesktop(pidlUserStartMenu, &psfUserStartMenu);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -353,7 +370,7 @@ static HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu)
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#if 1
#if !USE_SYSTEM_MERGED_FOLDERS
hr = CMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder, &pasf));
#else
hr = CoCreateInstance(CLSID_MergedFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IAugmentedShellFolder, &pasf));
@ -447,8 +464,13 @@ CStartMenu_Constructor(REFIID riid, void **ppv)
return hr;
hr = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidlProgramsAbsolute);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
if (FAILED(hr))
{
WARN("USER Programs folder not found.");
hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_PROGRAMS, &pidlProgramsAbsolute);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
}
pidlPrograms = ILClone(ILFindLastID(pidlProgramsAbsolute));
ILFree(pidlProgramsAbsolute);

View file

@ -446,15 +446,30 @@ static HRESULT GetFavoritesFolder(IShellFolder ** ppsfFavorites, LPITEMIDLIST *
hr = SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidlUserFavorites);
if (FAILED(hr))
return hr;
if (FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites)))
{
hr = BindToDesktop(pidlUserFavorites, ppsfFavorites);
*ppidl = pidlUserFavorites;
WARN("Failed to get the USER favorites folder. Trying to run with just the COMMON one.\n");
hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
TRACE("COMMON start menu obtained.\n");
*ppidl = pidlCommonFavorites;
hr = BindToDesktop(pidlCommonFavorites, ppsfFavorites);
return hr;
}
hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites);
if (FAILED_UNEXPECTEDLY(hr))
{
WARN("Failed to get the COMMON favorites folder. Will use only the USER contents.\n");
*ppidl = pidlCommonFavorites;
hr = BindToDesktop(pidlUserFavorites, ppsfFavorites);
return hr;
}
TRACE("Both COMMON and USER favorites folders obtained, merging them...\n");
hr = BindToDesktop(pidlUserFavorites, &psfUserFavorites);
if (FAILED_UNEXPECTEDLY(hr))
return hr;