shell32 patch 15
Martin Fuchs
martin-fuchs at gmx.net
Wed Jan 21 14:07:22 CST 2004
Changelog:
- SHELL32_ParseNextElement(): improved error handling
- SHELL32_CoCreateInitSF(): improved error handling
- SHELL32_CoCreateInitSFEx(): improved error handling
- SHELL32_GetDisplaynameOfChild(): improved error handling
- SHELL32_GetItemAttributes(): support for shell item attribute SFGAO_LINK
Index: shlfolder.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shlfolder.c,v
retrieving revision 1.86
diff -u -p -d -r1.86 shlfolder.c
--- shlfolder.c 16 Jan 2004 21:26:08 -0000 1.86
+++ shlfolder.c 21 Jan 2004 20:06:14 -0000
@@ -108,7 +108,7 @@ LPCWSTR GetNextElementW (LPCWSTR pszNext
HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc,
LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes)
{
- HRESULT hr = E_OUTOFMEMORY;
+ HRESULT hr = E_INVALIDARG;
LPITEMIDLIST pidlOut = NULL,
pidlTemp = NULL;
IShellFolder *psfChild;
@@ -124,6 +124,9 @@ HRESULT SHELL32_ParseNextElement (IShell
pidlTemp = ILCombine (*pidlInOut, pidlOut);
+ if (!pidlTemp)
+ hr = E_OUTOFMEMORY;
+
if (pidlOut)
ILFree (pidlOut);
}
@@ -150,17 +153,18 @@ HRESULT SHELL32_CoCreateInitSF (LPCITEMI
TRACE ("%p %p\n", pidlRoot, pidlChild);
if (SUCCEEDED ((hr = SHCoCreateInstance (NULL, clsid, NULL, iid, ppvOut)))) {
-
IPersistFolder *pPF;
if (SUCCEEDED ((hr = IUnknown_QueryInterface ((IUnknown *) * ppvOut, &IID_IPersistFolder, (LPVOID *) & pPF)))) {
-
LPITEMIDLIST pidlAbsolute;
pidlAbsolute = ILCombine (pidlRoot, pidlChild);
IPersistFolder_Initialize (pPF, pidlAbsolute);
IPersistFolder_Release (pPF);
SHFree (pidlAbsolute);
+
+ if (!pidlAbsolute)
+ hr = E_OUTOFMEMORY;
}
}
@@ -207,8 +211,14 @@ HRESULT SHELL32_CoCreateInitSFEx (LPCITE
szDestPath[0] = '\0';
}
- if (pidlChild)
- lstrcatA (szDestPath, _ILGetTextPointer (pidlChild));
+ if (pidlChild) {
+ LPSTR pszChild = _ILGetTextPointer(pidlChild);
+
+ if (pszChild)
+ lstrcatA (szDestPath, pszChild);
+ else
+ hr = E_INVALIDARG;
+ }
/* fill the PERSIST_FOLDER_TARGET_INFO */
ppfti.dwAttributes = -1;
@@ -289,7 +299,7 @@ HRESULT SHELL32_GetDisplayNameOfChild (I
LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut, DWORD dwOutLen)
{
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);
pdump (pidl);
@@ -310,7 +320,8 @@ HRESULT SHELL32_GetDisplayNameOfChild (I
IShellFolder_Release (psfChild);
}
ILFree (pidlFirst);
- }
+ } else
+ hr = E_OUTOFMEMORY;
TRACE ("-- ret=0x%08lx %s\n", hr, szOut);
@@ -346,6 +357,7 @@ HRESULT SHELL32_GetItemAttributes (IShel
SFGAO_CANDELETE | /*0x00000020 */
SFGAO_HASPROPSHEET | /*0x00000040 */
SFGAO_DROPTARGET | /*0x00000100 */
+ SFGAO_LINK | /*0x00010000 */
SFGAO_READONLY | /*0x00040000 */
SFGAO_HIDDEN | /*0x00080000 */
SFGAO_FILESYSANCESTOR | /*0x10000000 */
@@ -381,6 +393,13 @@ HRESULT SHELL32_GetItemAttributes (IShel
if ((SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY))
*pdwAttributes &= ~SFGAO_READONLY;
+
+ if (SFGAO_LINK & *pdwAttributes) {
+ char ext[MAX_PATH];
+
+ if (!_ILGetExtension(pidl, ext, MAX_PATH) || strcasecmp(ext, "lnk"))
+ *pdwAttributes &= ~SFGAO_READONLY;
+ }
} else {
*pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK;
}
More information about the wine-patches
mailing list