Author: gadamopoulos
Date: Mon Aug 17 11:41:15 2015
New Revision: 68730

URL: http://svn.reactos.org/svn/reactos?rev=68730&view=rev
Log:
[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.

Modified:
    trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp

Modified: trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp?rev=68730&r1=68729&r2=68730&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp     
[iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp     
[iso-8859-1] Mon Aug 17 11:41:15 2015
@@ -388,9 +388,7 @@
     REFIID riid,
     LPVOID *ppvOut)
 {
-    TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, 
shdebugstr_guid(&riid), ppvOut);
-
-    return SHELL32_BindToChild(pidlRoot, NULL, pidl, riid, ppvOut);
+    return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
 }
 
 /**************************************************************************
@@ -484,7 +482,7 @@
             if (_ILIsCPanelStruct(*apidl))
                 *rgfInOut &= SFGAO_CANLINK;
             else if (_ILIsSpecialFolder(*apidl))
-                SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
+                SHELL32_GetGuidItemAttributes(this, *apidl, rgfInOut);
             else
                 ERR("Got an unkown pidl here!\n");
             apidl++;
@@ -574,69 +572,24 @@
 */
 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)
         return S_FALSE;
 
-    pCPanel = _ILGetCPanelPointer(pidl);
+    PIDLCPanelStruct *pCPanel = _ILGetCPanelPointer(pidl);
 
     if (pCPanel)
     {
         /* copy display name from pidl - it was retrived from applet before;
            SHGDN_FORPARSING does not need special handling */
-        lstrcpyA(szName, pCPanel->szName + pCPanel->offsDispName);
-    }
-    /* take names of special folders only if it's only this folder */
+        strRet->uType = STRRET_CSTR;
+        lstrcpyA(strRet->cStr, pCPanel->szName + pCPanel->offsDispName);
+    }
     else if (_ILIsSpecialFolder(pidl))
     {
-        BOOL bSimplePidl = _ILIsPidlSimple(pidl);
-        SFGAOF Attr = SFGAO_FILESYSTEM;
-
-        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);
+        static const WCHAR* pszCPanelPath = 
L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}";
+        return SHELL32_GetDisplayNameOfGUIDItem(this, pszCPanelPath, pidl, 
dwFlags, strRet);
+    }
+
     return S_OK;
 }
 

Modified: trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp?rev=68730&r1=68729&r2=68730&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp   [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp   [iso-8859-1] 
Mon Aug 17 11:41:15 2015
@@ -263,6 +263,9 @@
     TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
           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);
 }
 
@@ -376,7 +379,7 @@
             else if (_ILIsControlPanel(apidl[i]))
                 *rgfInOut &= dwControlPanelAttributes;
             else if (_ILIsSpecialFolder(*apidl))
-                SHELL32_GetItemAttributes(this, apidl[i], rgfInOut);
+                SHELL32_GetGuidItemAttributes(this, apidl[i], rgfInOut);
             else
                 ERR("Got unknown pidl type!\n");
         }
@@ -493,91 +496,10 @@
     }
     else if (_ILIsPidlSimple(pidl))
     {
-        /* take names of special folders only if its only this folder */
         if (_ILIsSpecialFolder(pidl))
-        {
-            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);
-            }
-        }
+            return SHELL32_GetDisplayNameOfGUIDItem(this, 
L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", pidl, dwFlags, strRet);
         else if (_ILIsDrive(pidl))
         {
-
             _ILSimpleGetTextW(pidl, pszPath, MAX_PATH);    /* append my own 
path */
             /* long view "lw_name (C:)" */
             if (!(dwFlags & SHGDN_FORPARSING))

Modified: trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp?rev=68730&r1=68729&r2=68730&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp       [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp       [iso-8859-1] 
Mon Aug 17 11:41:15 2015
@@ -233,7 +233,7 @@
             {
                 /* it's the last element */
                 if (pdwAttributes && *pdwAttributes)
-                    hr = SHELL32_GetItemAttributes(this, pidlTemp, 
pdwAttributes);
+                    hr = SHELL32_GetFSItemAttributes(this, pidlTemp, 
pdwAttributes);
             }
         }
     }
@@ -369,12 +369,6 @@
         PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut)
 {
     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)
         return E_INVALIDARG;
@@ -386,20 +380,25 @@
 
     if(cidl == 0)
     {
-        IShellFolder *psfParent = NULL;
-        LPCITEMIDLIST rpidl = NULL;
-
-        hr = SHBindToParent(pidlRoot, IID_PPV_ARG(IShellFolder, &psfParent), 
&rpidl);
-        if(SUCCEEDED(hr))
-        {
-            if (_ILIsDrive(rpidl))
-                *rgfInOut &= dwDriveAttributes;
-            if (_ILIsFolder(rpidl) || _ILIsValue(rpidl))
-                SHELL32_GetItemAttributes(this, rpidl, rgfInOut);
-            else
-                ERR("Got an unknown type of pidl!!!\n");
-
-            psfParent->Release();
+        LPCITEMIDLIST rpidl = ILFindLastID(pidlRoot);
+
+        if (_ILIsFolder(rpidl) || _ILIsValue(rpidl))
+        {
+            SHELL32_GetFSItemAttributes(this, rpidl, rgfInOut);
+        }
+        else if (_ILIsDrive(rpidl))
+        {
+            IShellFolder *psfParent = NULL;
+            hr = SHBindToParent(pidlRoot, IID_PPV_ARG(IShellFolder, 
&psfParent), NULL);
+            if(SUCCEEDED(hr))
+            {
+                hr = psfParent->GetAttributesOf(1, &rpidl, (SFGAOF*)rgfInOut);
+                psfParent->Release();
+            }
+        }
+        else
+        {
+            DPRINT1("Got and unknown pidl!\n");
         }
     }
     else
@@ -408,7 +407,7 @@
         {
             pdump(*apidl);
             if(_ILIsFolder(*apidl) || _ILIsValue(*apidl))
-                SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
+                SHELL32_GetFSItemAttributes(this, *apidl, rgfInOut);
             else
                 ERR("Got an unknown type of pidl!!!\n");
             apidl++;


Reply via email to