hopefully the last fix for _SHGetPathFromIDListA/W() to be compatible with MS Windows...
authorMartin Fuchs <fuchs.martin@gmail.com>
Tue, 6 Jan 2004 22:40:53 +0000 (22:40 +0000)
committerMartin Fuchs <fuchs.martin@gmail.com>
Tue, 6 Jan 2004 22:40:53 +0000 (22:40 +0000)
svn path=/trunk/; revision=7495

reactos/lib/shell32/pidl.c
reactos/lib/shell32/shlcpanel.c

index fb6f1b0..38269b8 100644 (file)
@@ -1297,16 +1297,17 @@ HRESULT _SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize)
        LPSTR pstr;
        LPSTR end = pszPath + uOutSize;
 
-       if (_ILIsMyComputer(pidl)) { /* optimized loop to retrieve file system paths */
+       /* If the item ID list begins at "My Computer", we can use
+          an optimized loop to retrieve file system paths. */
+       if (_ILIsMyComputer(pidl)) {
            LPCITEMIDLIST p = ILGetNext(pidl);
            LPSTR txt;
 
            pstr = pszPath;
-           end = pszPath + MAX_PATH;
 
            while(p && p->mkid.cb && pstr<end) {
                if (_ILIsSpecialFolder(p))
-                   break;
+                   return E_INVALIDARG;
 
                txt = _ILGetTextPointer(p);
                if (!txt)
@@ -1329,33 +1330,26 @@ HRESULT _SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize)
 
        pstr = pszPath;
 
-       hr = SHGetDesktopFolder(&desktop);
+       /* The only other valid case is a simple PIDL rooted at desktop level */
+        if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
+           hr = SHGetDesktopFolder(&desktop);
 
-       if (SUCCEEDED(hr)) {
-            if (_ILIsValue(pidl)) {
+           if (SUCCEEDED(hr)) {
                hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE);
 
                if (SUCCEEDED(hr)) {
                    pstr = PathAddBackslashA(pszPath);
                    hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
                }
-           }
-           else
-               hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
 
-           IShellFolder_Release(desktop);
-       }
+               IShellFolder_Release(desktop);
+           }
+       } else
+           return E_INVALIDARG;
 
-       if (SUCCEEDED(hr)) {
+       if (SUCCEEDED(hr))
            hr = StrRetToStrNA(pstr, end-pstr, &str, pidl);
 
-           /* don't allow to return displaynames of the form "::{guid}" */
-           if (pstr[0]==':' && pstr[1]==':') {
-               *pszPath = '\0';
-               hr = E_FAIL;
-           }
-       }
-
        TRACE_(shell)("-- %s, 0x%08lx\n",pszPath, hr);
        return hr;
 }
@@ -1401,7 +1395,9 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
        LPWSTR pstr;
        LPWSTR end = pszPath + uOutSize;
 
-       if (_ILIsMyComputer(pidl)) { /* optimized loop to retrieve file system paths */
+       /* If the item ID list begins at "My Computer", we can use
+          an optimized loop to retrieve file system paths. */
+       if (_ILIsMyComputer(pidl)) {
            LPCITEMIDLIST p = ILGetNext(pidl);
            LPSTR txt;
 
@@ -1409,7 +1405,7 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
 
            while(p && p->mkid.cb && pstr<end) {
                if (_ILIsSpecialFolder(p))
-                   break;
+                   return E_INVALIDARG;
 
                txt = _ILGetTextPointer(p);
                if (!txt)
@@ -1433,33 +1429,26 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
 
        pstr = pszPath;
 
-       hr = SHGetDesktopFolder(&desktop);
+       /* The only other valid case is a simple PIDL rooted at desktop level */
+        if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
+           hr = SHGetDesktopFolder(&desktop);
 
-       if (SUCCEEDED(hr)) {
-            if (_ILIsValue(pidl)) {
+           if (SUCCEEDED(hr)) {
                hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE);
 
                if (SUCCEEDED(hr)) {
                    pstr = PathAddBackslashW(pszPath);
                    hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
                }
-           }
-           else
-               hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
 
-           IShellFolder_Release(desktop);
-       }
+               IShellFolder_Release(desktop);
+           }
+       } else
+           return E_INVALIDARG;
 
-       if (SUCCEEDED(hr)) {
+       if (SUCCEEDED(hr))
            hr = StrRetToStrNW(pstr, end-pstr, &str, pidl);
 
-           /* don't allow to return displaynames of the form "::{guid}" */
-           if (pstr[0]==':' && pstr[1]==':') {
-               *pszPath = '\0';
-               hr = E_FAIL;
-           }
-       }
-
        TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr);
        return hr;
 }
index a4458ba..4fb193e 100644 (file)
@@ -76,13 +76,13 @@ static ICOM_VTABLE(IShellExecuteHookW) vt_ShellExecuteHookW;
 static ICOM_VTABLE(IShellExecuteHookA) vt_ShellExecuteHookA;
 
 #define _IPersistFolder2_Offset            ((int)(&(((ICPanelImpl*)0)->lpVtblPersistFolder2)))
-#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This =(class*)(((char*)name)-_IPersistFolder2_Offset);
+#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset);
 
 #define IShellExecuteHookW_Offset   ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookW)))
-#define _ICOM_THIS_From_IShellExecuteHookW(class, name) class* This =(class*)(((char*)name)-IShellExecuteHookW_Offset);
+#define _ICOM_THIS_From_IShellExecuteHookW(class, name) class* This = (class*)(((char*)name)-IShellExecuteHookW_Offset);
 
 #define IShellExecuteHookA_Offset   ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookA)))
-#define _ICOM_THIS_From_IShellExecuteHookA(class, name) class* This =(class*)(((char*)name)-IShellExecuteHookA_Offset);
+#define _ICOM_THIS_From_IShellExecuteHookA(class, name) class* This = (class*)(((char*)name)-IShellExecuteHookA_Offset);
 
 
 /*
@@ -381,19 +381,19 @@ ISF_ControlPanel_fnGetUIObjectOf(IShellFolder2 * iface,
        *ppvOut = NULL;
 
        if (IsEqualIID(riid, &IID_IContextMenu) &&(cidl >= 1)) {
-           pObj =(LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl);
+           pObj = (LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl);
            hr = S_OK;
        } else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1)) {
-           pObj =(LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl);
+           pObj = (LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl);
            hr = S_OK;
        } else if (IsEqualIID(riid, &IID_IExtractIconA) &&(cidl == 1)) {
            pidl = ILCombine(This->pidlRoot, apidl[0]);
-           pObj =(LPUNKNOWN) IExtractIconA_Constructor(pidl);
+           pObj = (LPUNKNOWN) IExtractIconA_Constructor(pidl);
            SHFree(pidl);
            hr = S_OK;
        } else if (IsEqualIID(riid, &IID_IExtractIconW) &&(cidl == 1)) {
            pidl = ILCombine(This->pidlRoot, apidl[0]);
-           pObj =(LPUNKNOWN) IExtractIconW_Constructor(pidl);
+           pObj = (LPUNKNOWN) IExtractIconW_Constructor(pidl);
            SHFree(pidl);
            hr = S_OK;
        } else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA))