Author: gadamopoulos
Date: Wed Aug 10 18:56:48 2016
New Revision: 72188

URL: http://svn.reactos.org/svn/reactos?rev=72188&view=rev
Log:
[SHELL32]
- Add CRegFolder using the guid item specific functions. So far it is only 
partly implemented with stuff like enumerating still missing.
- Use CRegFolder in CDesktopFolder, CDrivesFolder and CControlPanelFolder and 
stop using guid item specific functions.

Added:
    trunk/reactos/dll/win32/shell32/folders/CRegFolder.cpp   (with props)
Modified:
    trunk/reactos/dll/win32/shell32/CMakeLists.txt
    trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.h
    trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h
    trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp
    trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.h
    trunk/reactos/dll/win32/shell32/precomp.h
    trunk/reactos/dll/win32/shell32/shfldr.h

Modified: trunk/reactos/dll/win32/shell32/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CMakeLists.txt?rev=72188&r1=72187&r2=72188&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/CMakeLists.txt      [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/CMakeLists.txt      [iso-8859-1] Wed Aug 10 
18:56:48 2016
@@ -4,7 +4,7 @@
 add_subdirectory(shellmenu)
 add_subdirectory(shellrecyclebin)
 
-set_cpp(WITH_RUNTIME)
+set_cpp(WITH_RUNTIME WITH_EXCEPTIONS)
 spec2def(shell32.dll shell32.spec ADD_IMPORTLIB)
 
 if(NOT MSVC)
@@ -53,6 +53,7 @@
     folders/CFontsFolder.cpp
     folders/CControlPanelFolder.cpp
     folders/CRecycleBin.cpp
+    folders/CRegFolder.cpp
     droptargets/CexeDropHandler.cpp
     shlexec.cpp
     shlfileop.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=72188&r1=72187&r2=72188&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] Wed Aug 10 18:56:48 2016
@@ -129,9 +129,7 @@
 {
     PIDLCPanelStruct *pData = _ILGetCPanelPointer(pidl);
     if (!pData)
-    {
-        return CGuidItemExtractIcon_CreateInstance(psf, pidl, riid, ppvOut);
-    }
+        return E_FAIL;
 
     CComPtr<IDefaultExtractIconInit> initIcon;
     HRESULT hr = 
SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon));
@@ -305,7 +303,7 @@
     DWORD *pdwAttributes)
 {
     /* We only support parsing guid names */
-    return SH_ParseGuidDisplayName(this, hwndOwner, pbc, lpszDisplayName, 
pchEaten, ppidl, pdwAttributes);
+    return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, 
pchEaten, ppidl, pdwAttributes);
 }
 
 /**************************************************************************
@@ -325,7 +323,7 @@
     REFIID riid,
     LPVOID *ppvOut)
 {
-    return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
+    return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
 }
 
 /**************************************************************************
@@ -435,7 +433,7 @@
             if (_ILIsCPanelStruct(*apidl))
                 *rgfInOut &= SFGAO_CANLINK;
             else if (_ILIsSpecialFolder(*apidl))
-                SHELL32_GetGuidItemAttributes(this, *apidl, rgfInOut);
+                m_regFolder->GetAttributesOf(1, apidl, rgfInOut);
             else
                 ERR("Got an unkown pidl here!\n");
             apidl++;
@@ -492,7 +490,10 @@
         } else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1)) {
             hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, 
(IDataObject **)&pObj);
         } else if ((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, 
IID_IExtractIconW)) && (cidl == 1)) {
-            hr = CCPLExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
+            if (_ILGetCPanelPointer(apidl[0]))
+                hr = CCPLExtractIcon_CreateInstance(this, apidl[0], riid, 
&pObj);
+            else
+                hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, 
prgfInOut, &pObj);
         } else {
             hr = E_NOINTERFACE;
         }
@@ -522,11 +523,10 @@
     }
     else if (_ILIsSpecialFolder(pidl))
     {
-        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;
+        return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
+    }
+
+    return E_FAIL;
 }
 
 /**************************************************************************
@@ -597,7 +597,7 @@
     }
     else if (_ILIsSpecialFolder(pidl))
     {
-        return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
+        return m_regFolder->GetDetailsOf(pidl, iColumn, psd);
     }
     else 
     {
@@ -649,6 +649,17 @@
         SHFree((LPVOID)pidlRoot);
 
     pidlRoot = ILClone(pidl);
+
+    /* Create the inner reg folder */
+    HRESULT hr;
+    static const WCHAR* pszCPanelPath = 
L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}";
+    hr = CRegFolder_CreateInstance(&CLSID_ControlPanel,
+                                   pidlRoot,
+                                   pszCPanelPath, 
+                                   IID_PPV_ARG(IShellFolder2, &m_regFolder));
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
     return S_OK;
 }
 

Modified: trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.h?rev=72188&r1=72187&r2=72188&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.h       
[iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.h       
[iso-8859-1] Wed Aug 10 18:56:48 2016
@@ -32,6 +32,7 @@
         /* both paths are parsible from the desktop */
         LPITEMIDLIST pidlRoot;  /* absolute pidl */
         int dwAttributes;       /* attributes returned by GetAttributesOf 
FIXME: use it */
+        CComPtr<IShellFolder2> m_regFolder;
 
         HRESULT WINAPI ExecuteFromIdList(LPCITEMIDLIST pidl);
 

Modified: trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp?rev=72188&r1=72187&r2=72188&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp  [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp  [iso-8859-1] 
Wed Aug 10 18:56:48 2016
@@ -258,7 +258,8 @@
 
 HRESULT WINAPI CDesktopFolder::FinalConstruct()
 {
-    WCHAR szMyPath[MAX_PATH];    HRESULT hr;
+    WCHAR szMyPath[MAX_PATH];
+    HRESULT hr;
 
     /* Create the root pidl */
     pidlRoot = _ILCreateDesktop();
@@ -285,6 +286,13 @@
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
+    /* Create the inner reg folder */
+    hr = CRegFolder_CreateInstance(&CLSID_ShellDesktop,
+                                   pidlRoot,
+                                   L"", 
+                                   IID_PPV_ARG(IShellFolder2, &m_regFolder));
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
 
     /* Cache the path to the user desktop directory */
     if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE ))
@@ -301,6 +309,9 @@
 HRESULT CDesktopFolder::_GetSFFromPidl(LPCITEMIDLIST pidl, IShellFolder2** psf)
 {
     WCHAR szFileName[MAX_PATH];
+
+    if (_ILIsSpecialFolder(pidl))
+        return m_regFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
 
     lstrcpynW(szFileName, sPathTarget, MAX_PATH - 1);
     PathAddBackslashW(szFileName);
@@ -354,7 +365,7 @@
 
     if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
     {
-        return SH_ParseGuidDisplayName(this, hwndOwner, pbc, lpszDisplayName, 
pchEaten, ppidl, pdwAttributes);
+        return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, 
pchEaten, ppidl, pdwAttributes);
     }
     else if (PathGetDriveNumberW (lpszDisplayName) >= 0)
     {
@@ -445,9 +456,6 @@
     if (!pidl)
         return E_INVALIDARG;
 
-    if (_ILIsSpecialFolder(pidl))
-        return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, 
ppvOut);
-
     CComPtr<IShellFolder2> psf;
     HRESULT hr = _GetSFFromPidl(pidl, &psf);
     if (FAILED_UNEXPECTEDLY(hr))
@@ -491,7 +499,7 @@
         return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2);
 
     if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
-        return SHELL32_CompareGuidItems(this, lParam, pidl1, pidl2);
+        return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
 
     return m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2);
 }
@@ -567,9 +575,7 @@
                 *rgfInOut &= dwMyComputerAttributes;
             else if (_ILIsNetHood(apidl[i]))
                 *rgfInOut &= dwMyNetPlacesAttributes;
-            else if (_ILIsSpecialFolder(apidl[i]))
-                SHELL32_GetGuidItemAttributes(this, apidl[i], rgfInOut);
-            else if (_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]))
+            else if (_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]) || 
_ILIsSpecialFolder(apidl[i]))
             {
                 CComPtr<IShellFolder2> psf;
                 HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
@@ -641,7 +647,7 @@
     }
     else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, 
IID_IExtractIconW)) && (cidl == 1))
     {
-        hr = CGuidItemExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
+        hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, 
prgfInOut, &pObj);
     }
     else
         hr = E_NOINTERFACE;
@@ -671,10 +677,6 @@
     if (!_ILIsPidlSimple (pidl))
     {
         return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
-    }
-    else if (!_ILIsDesktop(pidl) && _ILIsSpecialFolder(pidl))
-    {
-        return SHELL32_GetDisplayNameOfGUIDItem(this, L"", pidl, dwFlags, 
strRet);
     }
     else if (_ILIsDesktop(pidl))
     {
@@ -712,9 +714,6 @@
     DWORD dwFlags,
     PITEMID_CHILD *pPidlOut)
 {
-    if (_ILGetGUIDPointer(pidl))
-        return SHELL32_SetNameOfGuidItem(pidl, lpName, dwFlags, pPidlOut);
-
     CComPtr<IShellFolder2> psf;
     HRESULT hr = _GetSFFromPidl(pidl, &psf);
     if (FAILED_UNEXPECTEDLY(hr))
@@ -783,10 +782,6 @@
         psd->cxChar = DesktopSFHeader[iColumn].cxChar;
         return SHSetStrRet(&psd->str, DesktopSFHeader[iColumn].colnameid);
     }
-    else if (_ILIsSpecialFolder(pidl))
-    {
-        return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
-    }
 
     CComPtr<IShellFolder2> psf;
     HRESULT hr = _GetSFFromPidl(pidl, &psf);

Modified: trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h?rev=72188&r1=72187&r2=72188&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h    [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.h    [iso-8859-1] 
Wed Aug 10 18:56:48 2016
@@ -33,6 +33,7 @@
         /* both paths are parsible from the desktop */
         CComPtr<IShellFolder2> m_DesktopFSFolder;
         CComPtr<IShellFolder2> m_SharedDesktopFSFolder;
+        CComPtr<IShellFolder2> m_regFolder;
 
         LPWSTR sPathTarget;     /* complete path to target used for 
enumeration and ChangeNotify */
         LPITEMIDLIST pidlRoot;  /* absolute pidl */

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=72188&r1=72187&r2=72188&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] 
Wed Aug 10 18:56:48 2016
@@ -41,11 +41,6 @@
 
 HRESULT CDrivesExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST 
pidl, REFIID riid, LPVOID * ppvOut)
 {
-    if (!_ILIsDrive(pidl))
-    {
-        return CGuidItemExtractIcon_CreateInstance(psf, pidl, riid, ppvOut);
-    }
-
     CComPtr<IDefaultExtractIconInit> initIcon;
     HRESULT hr = 
SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon));
     if (FAILED(hr))
@@ -91,6 +86,7 @@
 
     return initIcon->QueryInterface(riid, ppvOut);
 }
+
 class CDrivesFolderEnum :
     public CEnumIDListBase
 {
@@ -230,7 +226,12 @@
     if (pidlRoot == NULL)
         return E_OUTOFMEMORY;
 
-    return S_OK;
+    HRESULT hr = CRegFolder_CreateInstance(&CLSID_MyComputer, 
+                                           pidlRoot, 
+                                           
L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 
+                                           IID_PPV_ARG(IShellFolder2, 
&m_regFolder));
+
+    return hr;
 }
 
 /**************************************************************************
@@ -253,7 +254,7 @@
 
     /* handle CLSID paths */
     if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
-        return SH_ParseGuidDisplayName(this, hwndOwner, pbc, lpszDisplayName, 
pchEaten, ppidl, pdwAttributes);
+        return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, 
pchEaten, ppidl, pdwAttributes);
 
     if (PathGetDriveNumberW(lpszDisplayName) < 0)
         return E_INVALIDARG;
@@ -280,7 +281,7 @@
             if (_ILIsDrive(pidlTemp))
                 *pdwAttributes &= dwDriveAttributes;
             else if (_ILIsSpecialFolder(pidlTemp))
-                SHELL32_GetGuidItemAttributes(this, pidlTemp, pdwAttributes);
+                m_regFolder->GetAttributesOf(1, &pidlTemp, pdwAttributes);
             else
                 ERR("Got an unkown pidl here!\n");
         }
@@ -310,7 +311,7 @@
           pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
 
     if (_ILIsSpecialFolder(pidl))
-        return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, 
ppvOut);
+        return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
 
     LPITEMIDLIST pidlChild = ILCloneFirst (pidl);
     if (!pidlChild)
@@ -364,7 +365,7 @@
     }
 
     if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
-        return SHELL32_CompareGuidItems(this, lParam, pidl1, pidl2);
+        m_regFolder->CompareIDs(lParam, pidl1, pidl2);
 
     if (!_ILIsDrive(pidl1) || !_ILIsDrive(pidl2) || LOWORD(lParam) >= 
MYCOMPUTERSHELLVIEWCOLUMNS)
         return E_INVALIDARG;
@@ -482,7 +483,7 @@
             else if (_ILIsControlPanel(apidl[i]))
                 *rgfInOut &= dwControlPanelAttributes;
             else if (_ILIsSpecialFolder(*apidl))
-                SHELL32_GetGuidItemAttributes(this, apidl[i], rgfInOut);
+                m_regFolder->GetAttributesOf(1, &apidl[i], rgfInOut);
             else
                 ERR("Got unknown pidl type!\n");
         }
@@ -533,7 +534,10 @@
     }
     else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, 
IID_IExtractIconW)) && (cidl == 1))
     {
-        hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
+        if (_ILIsDrive(apidl[0]))
+            hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, 
&pObj);
+        else
+            hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, 
prgfInOut, &pObj);
     }
     else if (IsEqualIID (riid, IID_IDropTarget) && (cidl >= 1))
     {
@@ -570,11 +574,11 @@
     {
         return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
     }
-    else if (!_ILIsDesktop(pidl) && _ILIsSpecialFolder(pidl))
-    {
-        return SHELL32_GetDisplayNameOfGUIDItem(this, 
L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", pidl, dwFlags, strRet);
-    }
-    else if (pidl->mkid.cb && !_ILIsDrive(pidl))
+    else if (_ILIsSpecialFolder(pidl))
+    {
+        return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
+    }
+    else if (!_ILIsDrive(pidl))
     {
         ERR("Wrong pidl type\n");
         return E_INVALIDARG;
@@ -586,61 +590,51 @@
 
     pszPath[0] = 0;
 
-    if (!pidl->mkid.cb)
-    {
-        /* parsing name like ::{...} */
-        pszPath[0] = ':';
-        pszPath[1] = ':';
-        SHELL32_GUIDToStringW(CLSID_MyComputer, &pszPath[2]);
-    }
-    else
-    {
-        _ILSimpleGetTextW(pidl, pszPath, MAX_PATH);    /* append my own path */
-        /* long view "lw_name (C:)" */
-        if (!(dwFlags & SHGDN_FORPARSING))
-        {
-            WCHAR wszDrive[18] = {0};
-            DWORD dwVolumeSerialNumber, dwMaximumComponentLength, 
dwFileSystemFlags;
-            static const WCHAR wszOpenBracket[] = {' ', '(', 0};
-            static const WCHAR wszCloseBracket[] = {')', 0};
-
-            lstrcpynW(wszDrive, pszPath, 4);
-            pszPath[0] = L'\0';
-            GetVolumeInformationW(wszDrive, pszPath,
-                                  MAX_PATH - 7,
-                                  &dwVolumeSerialNumber,
-                                  &dwMaximumComponentLength, 
&dwFileSystemFlags, NULL, 0);
-            pszPath[MAX_PATH-1] = L'\0';
-            if (!wcslen(pszPath))
+    _ILSimpleGetTextW(pidl, pszPath, MAX_PATH);    /* append my own path */
+    /* long view "lw_name (C:)" */
+    if (!(dwFlags & SHGDN_FORPARSING))
+    {
+        WCHAR wszDrive[18] = {0};
+        DWORD dwVolumeSerialNumber, dwMaximumComponentLength, 
dwFileSystemFlags;
+        static const WCHAR wszOpenBracket[] = {' ', '(', 0};
+        static const WCHAR wszCloseBracket[] = {')', 0};
+
+        lstrcpynW(wszDrive, pszPath, 4);
+        pszPath[0] = L'\0';
+        GetVolumeInformationW(wszDrive, pszPath,
+                                MAX_PATH - 7,
+                                &dwVolumeSerialNumber,
+                                &dwMaximumComponentLength, &dwFileSystemFlags, 
NULL, 0);
+        pszPath[MAX_PATH-1] = L'\0';
+        if (!wcslen(pszPath))
+        {
+            UINT DriveType, ResourceId;
+            DriveType = GetDriveTypeW(wszDrive);
+            switch(DriveType)
             {
-                UINT DriveType, ResourceId;
-                DriveType = GetDriveTypeW(wszDrive);
-                switch(DriveType)
-                {
-                    case DRIVE_FIXED:
-                        ResourceId = IDS_DRIVE_FIXED;
-                        break;
-                    case DRIVE_REMOTE:
-                        ResourceId = IDS_DRIVE_NETWORK;
-                        break;
-                    case DRIVE_CDROM:
-                        ResourceId = IDS_DRIVE_CDROM;
-                        break;
-                    default:
-                        ResourceId = 0;
-                }
-                if (ResourceId)
-                {
-                    dwFileSystemFlags = LoadStringW(shell32_hInstance, 
ResourceId, pszPath, MAX_PATH);
-                    if (dwFileSystemFlags > MAX_PATH - 7)
-                        pszPath[MAX_PATH-7] = L'\0';
-                }
+                case DRIVE_FIXED:
+                    ResourceId = IDS_DRIVE_FIXED;
+                    break;
+                case DRIVE_REMOTE:
+                    ResourceId = IDS_DRIVE_NETWORK;
+                    break;
+                case DRIVE_CDROM:
+                    ResourceId = IDS_DRIVE_CDROM;
+                    break;
+                default:
+                    ResourceId = 0;
             }
-            wcscat (pszPath, wszOpenBracket);
-            wszDrive[2] = L'\0';
-            wcscat (pszPath, wszDrive);
-            wcscat (pszPath, wszCloseBracket);
-        }
+            if (ResourceId)
+            {
+                dwFileSystemFlags = LoadStringW(shell32_hInstance, ResourceId, 
pszPath, MAX_PATH);
+                if (dwFileSystemFlags > MAX_PATH - 7)
+                    pszPath[MAX_PATH-7] = L'\0';
+            }
+        }
+        wcscat (pszPath, wszOpenBracket);
+        wszDrive[2] = L'\0';
+        wcscat (pszPath, wszDrive);
+        wcscat (pszPath, wszCloseBracket);
     }
 
     if (SUCCEEDED(hr))
@@ -681,7 +675,7 @@
         return S_OK;
     }
 
-    return SHELL32_SetNameOfGuidItem(pidl, lpName, dwFlags, pPidlOut);
+    return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
 }
 
 HRESULT WINAPI CDrivesFolder::GetDefaultSearchGUID(GUID * pguid)
@@ -740,7 +734,7 @@
     }
     else if (_ILIsSpecialFolder(pidl))
     {
-        return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
+        return m_regFolder->GetDetailsOf(pidl, iColumn, psd);
     }
     else
     {

Modified: trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.h?rev=72188&r1=72187&r2=72188&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.h     [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.h     [iso-8859-1] 
Wed Aug 10 18:56:48 2016
@@ -32,6 +32,8 @@
     private:
         /* both paths are parsible from the desktop */
         LPITEMIDLIST pidlRoot;    /* absolute pidl */
+        CComPtr<IShellFolder2> m_regFolder;
+
     public:
         CDrivesFolder();
         ~CDrivesFolder();

Added: trunk/reactos/dll/win32/shell32/folders/CRegFolder.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/CRegFolder.cpp?rev=72188
==============================================================================
--- trunk/reactos/dll/win32/shell32/folders/CRegFolder.cpp      (added)
+++ trunk/reactos/dll/win32/shell32/folders/CRegFolder.cpp      [iso-8859-1] 
Wed Aug 10 18:56:48 2016
@@ -0,0 +1,256 @@
+/*
+ * ReactOS Shell
+ *
+ * Copyright 2016 Giannis Adamopoulos
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  
USA
+ */
+
+#include <precomp.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL (shell);
+
+class CRegFolder :
+    public CComObjectRootEx<CComMultiThreadModelNoCS>,
+    public IShellFolder2
+{
+    private:
+        GUID m_guid;
+        CAtlStringW m_rootPath;
+        CComHeapPtr<ITEMIDLIST> m_pidlRoot;
+
+    public:
+        CRegFolder();
+        ~CRegFolder();
+        HRESULT WINAPI Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, 
LPCWSTR lpszPath);
+
+        // IShellFolder
+        virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, 
LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG 
*pdwAttributes);
+        virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList);
+        virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC 
pbcReserved, REFIID riid, LPVOID *ppvOut);
+        virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC 
pbcReserved, REFIID riid, LPVOID *ppvOut);
+        virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE 
pidl1, PCUIDLIST_RELATIVE pidl2);
+        virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, 
LPVOID *ppvOut);
+        virtual HRESULT WINAPI GetAttributesOf(UINT cidl, 
PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut);
+        virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, 
PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut);
+        virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD 
dwFlags, LPSTRRET strRet);
+        virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, 
LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut);
+
+        /* ShellFolder2 */
+        virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid);
+        virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum);
+        virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, 
ULONG *pDisplay);
+        virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD 
*pcsFlags);
+        virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const 
SHCOLUMNID *pscid, VARIANT *pv);
+        virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT 
iColumn, SHELLDETAILS *psd);
+        virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid);
+
+        DECLARE_NOT_AGGREGATABLE(CRegFolder)
+
+        DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+        BEGIN_COM_MAP(CRegFolder)
+        COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
+        COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
+        END_COM_MAP()
+};
+
+CRegFolder::CRegFolder()
+{
+}
+
+CRegFolder::~CRegFolder()
+{
+}
+
+HRESULT WINAPI CRegFolder::Initialize(const GUID *pGuid, LPCITEMIDLIST 
pidlRoot, LPCWSTR lpszPath)
+{
+    memcpy(&m_guid, pGuid, sizeof(m_guid));
+
+    m_rootPath = lpszPath;
+    if (!m_rootPath)
+        return E_OUTOFMEMORY;
+
+    m_pidlRoot.Attach(ILClone(pidlRoot));
+    if (!m_pidlRoot)
+        return E_OUTOFMEMORY;
+
+    return S_OK;
+}
+
+HRESULT WINAPI CRegFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR 
lpszDisplayName,
+        ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
+{
+    return SH_ParseGuidDisplayName(this, hwndOwner, pbc, lpszDisplayName, 
pchEaten, ppidl, pdwAttributes);
+}
+
+HRESULT WINAPI CRegFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, 
LPENUMIDLIST *ppEnumIDList)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT WINAPI CRegFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC 
pbcReserved, REFIID riid, LPVOID *ppvOut)
+{
+    return SHELL32_BindToGuidItem(m_pidlRoot, pidl, pbcReserved, riid, ppvOut);
+}
+
+HRESULT WINAPI CRegFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC 
pbcReserved, REFIID riid, LPVOID *ppvOut)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT WINAPI CRegFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, 
PCUIDLIST_RELATIVE pidl2)
+{
+    return SHELL32_CompareGuidItems(this, lParam, pidl1, pidl2);
+}
+
+HRESULT WINAPI CRegFolder::CreateViewObject(HWND hwndOwner, REFIID riid, 
LPVOID *ppvOut)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT WINAPI CRegFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY 
apidl, DWORD *rgfInOut)
+{
+    if (!rgfInOut || !cidl || !apidl)
+        return E_INVALIDARG;
+
+    if (*rgfInOut == 0)
+        *rgfInOut = ~0;
+
+    while(cidl > 0 && *apidl)
+    {
+        if (_ILIsSpecialFolder(*apidl))
+            SHELL32_GetGuidItemAttributes(this, *apidl, rgfInOut);
+        else
+            ERR("Got an unkown pidl here!\n");
+        apidl++;
+        cidl--;
+    }
+
+    /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
+    *rgfInOut &= ~SFGAO_VALIDATE;
+
+    return S_OK;
+}
+
+HRESULT WINAPI CRegFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, 
PCUITEMID_CHILD_ARRAY apidl,
+        REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
+{
+    LPVOID pObj = NULL;
+    HRESULT hr = E_INVALIDARG;
+
+    if (!ppvOut)
+        return hr;
+
+    *ppvOut = NULL;
+
+    if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, 
IID_IExtractIconW)) && (cidl == 1))
+    {
+        hr = CGuidItemExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
+    }
+    else
+        hr = E_NOINTERFACE;
+
+    *ppvOut = pObj;
+    return hr;
+
+}
+
+HRESULT WINAPI CRegFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD 
dwFlags, LPSTRRET strRet)
+{
+    if (!strRet || !_ILIsSpecialFolder(pidl))
+        return E_INVALIDARG;
+
+    if (!pidl->mkid.cb)
+    {
+        LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * 
sizeof(WCHAR));
+        if (!pszPath)
+            return E_OUTOFMEMORY;
+
+        /* parsing name like ::{...} */
+        pszPath[0] = ':';
+        pszPath[1] = ':';
+        SHELL32_GUIDToStringW(m_guid, &pszPath[2]);
+
+        strRet->uType = STRRET_WSTR;
+        strRet->pOleStr = pszPath;
+
+        return S_OK;
+    }
+
+    if (pidl->mkid.cb)
+    {
+        return SHELL32_GetDisplayNameOfGUIDItem(this, m_rootPath, pidl, 
dwFlags, strRet);
+    }
+
+    return E_FAIL;
+}
+
+HRESULT WINAPI CRegFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl,    
/* simple pidl */
+        LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
+{
+    return SHELL32_SetNameOfGuidItem(pidl, lpName, dwFlags, pPidlOut);
+}
+
+HRESULT WINAPI CRegFolder::GetDefaultSearchGUID(GUID *pguid)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT WINAPI CRegFolder::EnumSearches(IEnumExtraSearch ** ppenum)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT WINAPI CRegFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG 
*pDisplay)
+{
+    if (pSort)
+        *pSort = 0;
+    if (pDisplay)
+        *pDisplay = 0;
+
+    return S_OK;
+}
+
+HRESULT WINAPI CRegFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
+{
+    if (iColumn >= 2)
+        return E_INVALIDARG;
+    *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT;
+    return S_OK;
+}
+
+HRESULT WINAPI CRegFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID 
*pscid, VARIANT *pv)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT WINAPI CRegFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, 
SHELLDETAILS *psd)
+{
+    if (!psd || iColumn >= 2)
+        return E_INVALIDARG;
+
+    return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
+}
+
+HRESULT WINAPI CRegFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
+{
+    return E_NOTIMPL;
+}
+
+HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, 
LPCWSTR lpszPath, REFIID riid, void **ppv)
+{
+    return ShellObjectCreatorInit<CRegFolder>(pGuid, pidlRoot, lpszPath, riid, 
ppv);
+}

Propchange: trunk/reactos/dll/win32/shell32/folders/CRegFolder.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/dll/win32/shell32/precomp.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/precomp.h?rev=72188&r1=72187&r2=72188&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/precomp.h   [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/precomp.h   [iso-8859-1] Wed Aug 10 
18:56:48 2016
@@ -27,6 +27,7 @@
 #include <atlbase.h>
 #include <atlcom.h>
 #include <atlwin.h>
+#include <atlstr.h>
 #include <powrprof.h>
 #include <winnetwk.h>
 #include <objsafe.h>

Modified: trunk/reactos/dll/win32/shell32/shfldr.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr.h?rev=72188&r1=72187&r2=72188&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shfldr.h    [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shfldr.h    [iso-8859-1] Wed Aug 10 
18:56:48 2016
@@ -107,6 +107,8 @@
 void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags);
 BOOL SHELL_FS_HideExtension(LPWSTR pwszPath);
 
+HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, 
LPCWSTR lpszPath, REFIID riid, void **ppv);
+
 #ifdef __cplusplus
 
 HRESULT inline SHSetStrRet(LPSTRRET pStrRet, DWORD resId)


Reply via email to