mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 00:23:10 +00:00
[SHELL32]
- Use SHELL32_GetGuidItemAttributes, SHELL32_GetFSItemAttributes, SHELL32_BindToGuidItem and SHELL32_GetDisplayNameOfGUIDItem in CControlPanelFolder, CDrivesFolder and CFSFolder instead of using functions that accept all sorts of pidl types. svn path=/trunk/; revision=68730
This commit is contained in:
parent
8faea71a4d
commit
078e6f5d12
3 changed files with 31 additions and 157 deletions
|
@ -388,9 +388,7 @@ HRESULT WINAPI CControlPanelFolder::BindToObject(
|
||||||
REFIID riid,
|
REFIID riid,
|
||||||
LPVOID *ppvOut)
|
LPVOID *ppvOut)
|
||||||
{
|
{
|
||||||
TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
|
return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
|
||||||
|
|
||||||
return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -484,7 +482,7 @@ HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_A
|
||||||
if (_ILIsCPanelStruct(*apidl))
|
if (_ILIsCPanelStruct(*apidl))
|
||||||
*rgfInOut &= SFGAO_CANLINK;
|
*rgfInOut &= SFGAO_CANLINK;
|
||||||
else if (_ILIsSpecialFolder(*apidl))
|
else if (_ILIsSpecialFolder(*apidl))
|
||||||
SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
|
SHELL32_GetGuidItemAttributes(this, *apidl, rgfInOut);
|
||||||
else
|
else
|
||||||
ERR("Got an unkown pidl here!\n");
|
ERR("Got an unkown pidl here!\n");
|
||||||
apidl++;
|
apidl++;
|
||||||
|
@ -574,69 +572,24 @@ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner,
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
|
HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
|
||||||
{
|
{
|
||||||
CHAR szName[MAX_PATH];
|
|
||||||
WCHAR wszName[MAX_PATH+1]; /* +1 for potential backslash */
|
|
||||||
PIDLCPanelStruct *pCPanel;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
*szName = '\0';
|
|
||||||
|
|
||||||
TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
|
|
||||||
pdump(pidl);
|
|
||||||
|
|
||||||
if (!pidl)
|
if (!pidl)
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
|
|
||||||
pCPanel = _ILGetCPanelPointer(pidl);
|
PIDLCPanelStruct *pCPanel = _ILGetCPanelPointer(pidl);
|
||||||
|
|
||||||
if (pCPanel)
|
if (pCPanel)
|
||||||
{
|
{
|
||||||
/* copy display name from pidl - it was retrived from applet before;
|
/* copy display name from pidl - it was retrived from applet before;
|
||||||
SHGDN_FORPARSING does not need special handling */
|
SHGDN_FORPARSING does not need special handling */
|
||||||
lstrcpyA(szName, pCPanel->szName + pCPanel->offsDispName);
|
strRet->uType = STRRET_CSTR;
|
||||||
|
lstrcpyA(strRet->cStr, pCPanel->szName + pCPanel->offsDispName);
|
||||||
}
|
}
|
||||||
/* take names of special folders only if it's only this folder */
|
|
||||||
else if (_ILIsSpecialFolder(pidl))
|
else if (_ILIsSpecialFolder(pidl))
|
||||||
{
|
{
|
||||||
BOOL bSimplePidl = _ILIsPidlSimple(pidl);
|
static const WCHAR* pszCPanelPath = L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}";
|
||||||
SFGAOF Attr = SFGAO_FILESYSTEM;
|
return SHELL32_GetDisplayNameOfGUIDItem(this, pszCPanelPath, pidl, dwFlags, strRet);
|
||||||
|
|
||||||
SHELL32_GetItemAttributes(this, pidl, &Attr);
|
|
||||||
if (Attr & SFGAO_FILESYSTEM)
|
|
||||||
{
|
|
||||||
hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName, sizeof(wszName));
|
|
||||||
if (FAILED(hr))
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
else if (bSimplePidl)
|
|
||||||
{
|
|
||||||
_ILSimpleGetTextW(pidl, wszName, MAX_PATH); /* append my own path */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FIXME("special pidl\n");
|
|
||||||
if (dwFlags & SHGDN_FORPARSING)
|
|
||||||
{
|
|
||||||
/* go deeper if needed */
|
|
||||||
int cchName;
|
|
||||||
|
|
||||||
PathAddBackslashW(wszName);
|
|
||||||
cchName = wcslen(wszName);
|
|
||||||
|
|
||||||
hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName + cchName, MAX_PATH + 1 - cchName);
|
|
||||||
if (FAILED(hr))
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL))
|
|
||||||
szName[0] = '\0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
strRet->uType = STRRET_CSTR;
|
|
||||||
lstrcpynA(strRet->cStr, szName, MAX_PATH);
|
|
||||||
|
|
||||||
TRACE("--(%p)->(%s)\n", this, szName);
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -263,6 +263,9 @@ HRESULT WINAPI CDrivesFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcRese
|
||||||
TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
|
TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
|
||||||
pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
|
pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
|
||||||
|
|
||||||
|
if (_ILIsSpecialFolder(pidl))
|
||||||
|
return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
|
||||||
|
|
||||||
return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut);
|
return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +379,7 @@ HRESULT WINAPI CDrivesFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY a
|
||||||
else if (_ILIsControlPanel(apidl[i]))
|
else if (_ILIsControlPanel(apidl[i]))
|
||||||
*rgfInOut &= dwControlPanelAttributes;
|
*rgfInOut &= dwControlPanelAttributes;
|
||||||
else if (_ILIsSpecialFolder(*apidl))
|
else if (_ILIsSpecialFolder(*apidl))
|
||||||
SHELL32_GetItemAttributes(this, apidl[i], rgfInOut);
|
SHELL32_GetGuidItemAttributes(this, apidl[i], rgfInOut);
|
||||||
else
|
else
|
||||||
ERR("Got unknown pidl type!\n");
|
ERR("Got unknown pidl type!\n");
|
||||||
}
|
}
|
||||||
|
@ -493,91 +496,10 @@ HRESULT WINAPI CDrivesFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFla
|
||||||
}
|
}
|
||||||
else if (_ILIsPidlSimple(pidl))
|
else if (_ILIsPidlSimple(pidl))
|
||||||
{
|
{
|
||||||
/* take names of special folders only if its only this folder */
|
|
||||||
if (_ILIsSpecialFolder(pidl))
|
if (_ILIsSpecialFolder(pidl))
|
||||||
{
|
return SHELL32_GetDisplayNameOfGUIDItem(this, L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", pidl, dwFlags, strRet);
|
||||||
GUID const *clsid;
|
|
||||||
|
|
||||||
clsid = _ILGetGUIDPointer (pidl);
|
|
||||||
if (clsid)
|
|
||||||
{
|
|
||||||
if (GET_SHGDN_FOR (dwFlags) == SHGDN_FORPARSING)
|
|
||||||
{
|
|
||||||
static const WCHAR clsidW[] = L"CLSID\\";
|
|
||||||
static const WCHAR shellfolderW[] = L"\\shellfolder";
|
|
||||||
static const WCHAR wantsForParsingW[] = L"WantsForParsing";
|
|
||||||
BOOL bWantsForParsing = FALSE;
|
|
||||||
WCHAR szRegPath[100];
|
|
||||||
LONG r;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We can only get a filesystem path from a shellfolder
|
|
||||||
* if the value WantsFORPARSING exists in
|
|
||||||
* CLSID\\{...}\\shellfolder
|
|
||||||
* exception: the MyComputer folder has this keys not
|
|
||||||
* but like any filesystem backed
|
|
||||||
* folder it needs these behaviour
|
|
||||||
*
|
|
||||||
* Get the "WantsFORPARSING" flag from the registry
|
|
||||||
*/
|
|
||||||
|
|
||||||
wcscpy(szRegPath, clsidW);
|
|
||||||
SHELL32_GUIDToStringW(*clsid, &szRegPath[6]);
|
|
||||||
wcscat(szRegPath, shellfolderW);
|
|
||||||
r = SHGetValueW(HKEY_CLASSES_ROOT, szRegPath,
|
|
||||||
wantsForParsingW, NULL, NULL, NULL);
|
|
||||||
if (r == ERROR_SUCCESS)
|
|
||||||
bWantsForParsing = TRUE;
|
|
||||||
|
|
||||||
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
|
|
||||||
bWantsForParsing)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* We need the filesystem path to the destination folder
|
|
||||||
* Only the folder itself can know it
|
|
||||||
*/
|
|
||||||
hr = SHELL32_GetDisplayNameOfChild (this, pidl,
|
|
||||||
dwFlags, pszPath, MAX_PATH);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LPWSTR p = pszPath;
|
|
||||||
|
|
||||||
/* parsing name like ::{...} */
|
|
||||||
p[0] = ':';
|
|
||||||
p[1] = ':';
|
|
||||||
p += 2;
|
|
||||||
p += SHELL32_GUIDToStringW(CLSID_MyComputer, p);
|
|
||||||
|
|
||||||
/* \:: */
|
|
||||||
p[0] = '\\';
|
|
||||||
p[1] = ':';
|
|
||||||
p[2] = ':';
|
|
||||||
p += 3;
|
|
||||||
SHELL32_GUIDToStringW(*clsid, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* user friendly name */
|
|
||||||
|
|
||||||
if (_ILIsMyComputer(pidl) && sName)
|
|
||||||
wcscpy(pszPath, sName);
|
|
||||||
else
|
|
||||||
HCR_GetClassNameW (*clsid, pszPath, MAX_PATH);
|
|
||||||
|
|
||||||
TRACE("pszPath %s\n", debugstr_w(pszPath));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* append my own path */
|
|
||||||
_ILSimpleGetTextW(pidl, pszPath, MAX_PATH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (_ILIsDrive(pidl))
|
else if (_ILIsDrive(pidl))
|
||||||
{
|
{
|
||||||
|
|
||||||
_ILSimpleGetTextW(pidl, pszPath, MAX_PATH); /* append my own path */
|
_ILSimpleGetTextW(pidl, pszPath, MAX_PATH); /* append my own path */
|
||||||
/* long view "lw_name (C:)" */
|
/* long view "lw_name (C:)" */
|
||||||
if (!(dwFlags & SHGDN_FORPARSING))
|
if (!(dwFlags & SHGDN_FORPARSING))
|
||||||
|
|
|
@ -233,7 +233,7 @@ HRESULT WINAPI CFSFolder::ParseDisplayName(HWND hwndOwner,
|
||||||
{
|
{
|
||||||
/* it's the last element */
|
/* it's the last element */
|
||||||
if (pdwAttributes && *pdwAttributes)
|
if (pdwAttributes && *pdwAttributes)
|
||||||
hr = SHELL32_GetItemAttributes(this, pidlTemp, pdwAttributes);
|
hr = SHELL32_GetFSItemAttributes(this, pidlTemp, pdwAttributes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,12 +369,6 @@ HRESULT WINAPI CFSFolder::GetAttributesOf(UINT cidl,
|
||||||
PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut)
|
PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
static const DWORD dwDriveAttributes =
|
|
||||||
SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
|
|
||||||
SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANRENAME | SFGAO_CANLINK;
|
|
||||||
|
|
||||||
TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", this, cidl, apidl,
|
|
||||||
rgfInOut, rgfInOut ? *rgfInOut : 0);
|
|
||||||
|
|
||||||
if (!rgfInOut)
|
if (!rgfInOut)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
@ -386,20 +380,25 @@ HRESULT WINAPI CFSFolder::GetAttributesOf(UINT cidl,
|
||||||
|
|
||||||
if(cidl == 0)
|
if(cidl == 0)
|
||||||
{
|
{
|
||||||
IShellFolder *psfParent = NULL;
|
LPCITEMIDLIST rpidl = ILFindLastID(pidlRoot);
|
||||||
LPCITEMIDLIST rpidl = NULL;
|
|
||||||
|
|
||||||
hr = SHBindToParent(pidlRoot, IID_PPV_ARG(IShellFolder, &psfParent), &rpidl);
|
if (_ILIsFolder(rpidl) || _ILIsValue(rpidl))
|
||||||
if(SUCCEEDED(hr))
|
|
||||||
{
|
{
|
||||||
if (_ILIsDrive(rpidl))
|
SHELL32_GetFSItemAttributes(this, rpidl, rgfInOut);
|
||||||
*rgfInOut &= dwDriveAttributes;
|
}
|
||||||
if (_ILIsFolder(rpidl) || _ILIsValue(rpidl))
|
else if (_ILIsDrive(rpidl))
|
||||||
SHELL32_GetItemAttributes(this, rpidl, rgfInOut);
|
{
|
||||||
else
|
IShellFolder *psfParent = NULL;
|
||||||
ERR("Got an unknown type of pidl!!!\n");
|
hr = SHBindToParent(pidlRoot, IID_PPV_ARG(IShellFolder, &psfParent), NULL);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
psfParent->Release();
|
{
|
||||||
|
hr = psfParent->GetAttributesOf(1, &rpidl, (SFGAOF*)rgfInOut);
|
||||||
|
psfParent->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("Got and unknown pidl!\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -408,7 +407,7 @@ HRESULT WINAPI CFSFolder::GetAttributesOf(UINT cidl,
|
||||||
{
|
{
|
||||||
pdump(*apidl);
|
pdump(*apidl);
|
||||||
if(_ILIsFolder(*apidl) || _ILIsValue(*apidl))
|
if(_ILIsFolder(*apidl) || _ILIsValue(*apidl))
|
||||||
SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
|
SHELL32_GetFSItemAttributes(this, *apidl, rgfInOut);
|
||||||
else
|
else
|
||||||
ERR("Got an unknown type of pidl!!!\n");
|
ERR("Got an unknown type of pidl!!!\n");
|
||||||
apidl++;
|
apidl++;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue