[SHELL32] -CDrivesFolder: Implement returning the appropriate type string in GetDetai...
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Sun, 11 Jun 2017 14:02:14 +0000 (14:02 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Sun, 11 Jun 2017 14:02:14 +0000 (14:02 +0000)
svn path=/trunk/; revision=75005

reactos/dll/win32/shell32/folders/CDrivesFolder.cpp

index 5f0fa0a..0db02a2 100644 (file)
@@ -35,6 +35,24 @@ CDrivesFolderEnum is only responsible for returning the physical items.
 3. The parsing name returned for my computer is incorrect. It should be "My Computer"
 */
 
+static int iDriveIconIds[7] = { IDI_SHELL_DRIVE,       /* DRIVE_UNKNOWN */
+                                IDI_SHELL_CDROM,       /* DRIVE_NO_ROOT_DIR*/
+                                IDI_SHELL_3_14_FLOPPY, /* DRIVE_REMOVABLE*/
+                                IDI_SHELL_DRIVE,       /* DRIVE_FIXED*/
+                                IDI_SHELL_NETDRIVE,    /* DRIVE_REMOTE*/
+                                IDI_SHELL_CDROM,       /* DRIVE_CDROM*/
+                                IDI_SHELL_RAMDISK      /* DRIVE_RAMDISK*/
+                                };
+
+static int iDriveTypeIds[7] = { IDS_DRIVE_FIXED,       /* DRIVE_UNKNOWN */
+                                IDS_DRIVE_FIXED,       /* DRIVE_NO_ROOT_DIR*/
+                                IDS_DRIVE_FLOPPY,      /* DRIVE_REMOVABLE*/
+                                IDS_DRIVE_FIXED,       /* DRIVE_FIXED*/
+                                IDS_DRIVE_NETWORK,     /* DRIVE_REMOTE*/
+                                IDS_DRIVE_CDROM,       /* DRIVE_CDROM*/
+                                IDS_DRIVE_FIXED        /* DRIVE_RAMDISK*/
+                                };
+
 /***********************************************************************
 *   IShellFolder implementation
 */
@@ -125,41 +143,21 @@ HRESULT CDrivesExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl
         return hr;
 
     CHAR* pszDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
-    WCHAR wTemp[MAX_PATH];
-    int icon_idx = -1;
-
-    if (pszDrive)
-    {
-        switch(GetDriveTypeA(pszDrive))
-        {
-            case DRIVE_REMOVABLE:
-                icon_idx = IDI_SHELL_3_14_FLOPPY;
-                break;
-            case DRIVE_CDROM:
-                icon_idx = IDI_SHELL_CDROM;
-                break;
-            case DRIVE_REMOTE:
-                icon_idx = IDI_SHELL_NETDRIVE;
-                break;
-            case DRIVE_RAMDISK:
-                icon_idx = IDI_SHELL_RAMDISK;
-                break;
-            case DRIVE_NO_ROOT_DIR:
-                icon_idx = IDI_SHELL_CDROM;
-                break;
-        }
-    }
+    UINT DriveType = GetDriveTypeA(pszDrive);
+    if (DriveType > DRIVE_RAMDISK)
+        DriveType = DRIVE_FIXED;
 
-    if (icon_idx != -1)
+    WCHAR wTemp[MAX_PATH];
+    int icon_idx;
+    if ((DriveType == DRIVE_FIXED || DriveType == DRIVE_UNKNOWN) &&
+        (HCR_GetIconW(L"Drive", wTemp, NULL, MAX_PATH, &icon_idx)))
     {
-        initIcon->SetNormalIcon(swShell32Name, -icon_idx);
+        initIcon->SetNormalIcon(wTemp, icon_idx);
     }
     else
     {
-        if (HCR_GetIconW(L"Drive", wTemp, NULL, MAX_PATH, &icon_idx))
-            initIcon->SetNormalIcon(wTemp, icon_idx);
-        else
-            initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DRIVE);
+        icon_idx = iDriveIconIds[DriveType];
+        initIcon->SetNormalIcon(swShell32Name, -icon_idx);
     }
 
     return initIcon->QueryInterface(riid, ppvOut);
@@ -827,43 +825,41 @@ HRESULT WINAPI CDrivesFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, S
         psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
         return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
     }
-    else if (_ILIsSpecialFolder(pidl))
+    else if (!_ILIsDrive(pidl))
     {
         return m_regFolder->GetDetailsOf(pidl, iColumn, psd);
     }
     else
     {
-        char szPath[MAX_PATH];
-        ULARGE_INTEGER ulBytes;
+        ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
+        CHAR* pszDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
+        UINT DriveType = GetDriveTypeA(pszDrive);
+        if (DriveType > DRIVE_RAMDISK)
+            DriveType = DRIVE_FIXED;
 
-        psd->str.cStr[0] = 0x00;
-        psd->str.uType = STRRET_CSTR;
         switch (iColumn)
         {
             case 0:        /* name */
                 hr = GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
                 break;
             case 1:        /* type */
-                _ILGetFileType(pidl, psd->str.cStr, MAX_PATH);
+                hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
                 break;
             case 2:        /* total size */
-                _ILSimpleGetText (pidl, szPath, MAX_PATH);
-                if (GetVolumeInformationA(szPath, NULL, 0, NULL, NULL, NULL, NULL, 0))
-                {
-                    GetDiskFreeSpaceExA(szPath, NULL, &ulBytes, NULL);
-                    StrFormatByteSize64A(ulBytes.QuadPart, psd->str.cStr, MAX_PATH);
-                }
-                break;
             case 3:        /* free size */
-                _ILSimpleGetText (pidl, szPath, MAX_PATH);
-                if (GetVolumeInformationA(szPath, NULL, 0, NULL, NULL, NULL, NULL, 0))
+                psd->str.cStr[0] = 0x00;
+                psd->str.uType = STRRET_CSTR;
+                if (GetVolumeInformationA(pszDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
                 {
-                    GetDiskFreeSpaceExA(szPath, &ulBytes, NULL, NULL);
-                    StrFormatByteSize64A(ulBytes.QuadPart, psd->str.cStr, MAX_PATH);
+                    GetDiskFreeSpaceExA(pszDrive, &ulFreeBytes, &ulTotalBytes, NULL);
+                    if (iColumn == 2)
+                        StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
+                    else
+                        StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
                 }
+                hr = S_OK;
                 break;
         }
-        hr = S_OK;
     }
 
     return hr;