Improved error handling.

SHELL32_GetItemAttributes(): support for SFGAO_LINK attribute.
This commit is contained in:
Martin Fuchs 2004-01-23 20:43:18 +00:00 committed by Alexandre Julliard
parent 4cc64c8e5e
commit fc69e4cf1b

View File

@ -108,7 +108,7 @@ LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut)
HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc,
LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes) LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes)
{ {
HRESULT hr = E_OUTOFMEMORY; HRESULT hr = E_INVALIDARG;
LPITEMIDLIST pidlOut = NULL, LPITEMIDLIST pidlOut = NULL,
pidlTemp = NULL; pidlTemp = NULL;
IShellFolder *psfChild; IShellFolder *psfChild;
@ -124,6 +124,9 @@ HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc,
pidlTemp = ILCombine (*pidlInOut, pidlOut); pidlTemp = ILCombine (*pidlInOut, pidlOut);
if (!pidlTemp)
hr = E_OUTOFMEMORY;
if (pidlOut) if (pidlOut)
ILFree (pidlOut); ILFree (pidlOut);
} }
@ -150,17 +153,18 @@ HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot,
TRACE ("%p %p\n", pidlRoot, pidlChild); TRACE ("%p %p\n", pidlRoot, pidlChild);
if (SUCCEEDED ((hr = SHCoCreateInstance (NULL, clsid, NULL, iid, ppvOut)))) { if (SUCCEEDED ((hr = SHCoCreateInstance (NULL, clsid, NULL, iid, ppvOut)))) {
IPersistFolder *pPF; IPersistFolder *pPF;
if (SUCCEEDED ((hr = IUnknown_QueryInterface ((IUnknown *) * ppvOut, &IID_IPersistFolder, (LPVOID *) & pPF)))) { if (SUCCEEDED ((hr = IUnknown_QueryInterface ((IUnknown *) * ppvOut, &IID_IPersistFolder, (LPVOID *) & pPF)))) {
LPITEMIDLIST pidlAbsolute; LPITEMIDLIST pidlAbsolute;
pidlAbsolute = ILCombine (pidlRoot, pidlChild); pidlAbsolute = ILCombine (pidlRoot, pidlChild);
IPersistFolder_Initialize (pPF, pidlAbsolute); IPersistFolder_Initialize (pPF, pidlAbsolute);
IPersistFolder_Release (pPF); IPersistFolder_Release (pPF);
SHFree (pidlAbsolute); SHFree (pidlAbsolute);
if (!pidlAbsolute)
hr = E_OUTOFMEMORY;
} }
} }
@ -207,8 +211,14 @@ HRESULT SHELL32_CoCreateInitSFEx (LPCITEMIDLIST pidlRoot,
szDestPath[0] = '\0'; szDestPath[0] = '\0';
} }
if (pidlChild) if (pidlChild) {
lstrcatA (szDestPath, _ILGetTextPointer (pidlChild)); LPSTR pszChild = _ILGetTextPointer(pidlChild);
if (pszChild)
lstrcatA (szDestPath, pszChild);
else
hr = E_INVALIDARG;
}
/* fill the PERSIST_FOLDER_TARGET_INFO */ /* fill the PERSIST_FOLDER_TARGET_INFO */
ppfti.dwAttributes = -1; ppfti.dwAttributes = -1;
@ -289,7 +299,7 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf,
LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut, DWORD dwOutLen) LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut, DWORD dwOutLen)
{ {
LPITEMIDLIST pidlFirst; LPITEMIDLIST pidlFirst;
HRESULT hr = E_OUTOFMEMORY; HRESULT hr = E_INVALIDARG;
TRACE ("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n", psf, pidl, dwFlags, szOut, dwOutLen); TRACE ("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n", psf, pidl, dwFlags, szOut, dwOutLen);
pdump (pidl); pdump (pidl);
@ -310,7 +320,8 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf,
IShellFolder_Release (psfChild); IShellFolder_Release (psfChild);
} }
ILFree (pidlFirst); ILFree (pidlFirst);
} } else
hr = E_OUTOFMEMORY;
TRACE ("-- ret=0x%08lx %s\n", hr, szOut); TRACE ("-- ret=0x%08lx %s\n", hr, szOut);
@ -346,6 +357,7 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO
SFGAO_CANDELETE | /*0x00000020 */ SFGAO_CANDELETE | /*0x00000020 */
SFGAO_HASPROPSHEET | /*0x00000040 */ SFGAO_HASPROPSHEET | /*0x00000040 */
SFGAO_DROPTARGET | /*0x00000100 */ SFGAO_DROPTARGET | /*0x00000100 */
SFGAO_LINK | /*0x00010000 */
SFGAO_READONLY | /*0x00040000 */ SFGAO_READONLY | /*0x00040000 */
SFGAO_HIDDEN | /*0x00080000 */ SFGAO_HIDDEN | /*0x00080000 */
SFGAO_FILESYSANCESTOR | /*0x10000000 */ SFGAO_FILESYSANCESTOR | /*0x10000000 */
@ -381,6 +393,13 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO
if ((SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY)) if ((SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY))
*pdwAttributes &= ~SFGAO_READONLY; *pdwAttributes &= ~SFGAO_READONLY;
if (SFGAO_LINK & *pdwAttributes) {
char ext[MAX_PATH];
if (!_ILGetExtension(pidl, ext, MAX_PATH) || strcasecmp(ext, "lnk"))
*pdwAttributes &= ~SFGAO_LINK;
}
} else { } else {
*pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK; *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK;
} }