+#ifdef wxHAS_FILESYSTEM_VOLUMES
+
+#ifdef __WXWINCE__
+ // No logical drives; return "\"
+ paths.Add(wxT("\\"));
+ names.Add(wxT("\\"));
+ icon_ids.Add(wxFileIconsTable::computer);
+#elif defined(__WIN32__) && wxUSE_FSVOLUME
+ // TODO: this code (using wxFSVolumeBase) should be used for all platforms
+ // but unfortunately wxFSVolumeBase is not implemented everywhere
+ const wxArrayString as = wxFSVolumeBase::GetVolumes();
+
+ for (size_t i = 0; i < as.GetCount(); i++)
+ {
+ wxString path = as[i];
+ wxFSVolume vol(path);
+ int imageId;
+ switch (vol.GetKind())
+ {
+ case wxFS_VOL_FLOPPY:
+ if ( (path == wxT("a:\\")) || (path == wxT("b:\\")) )
+ imageId = wxFileIconsTable::floppy;
+ else
+ imageId = wxFileIconsTable::removeable;
+ break;
+ case wxFS_VOL_DVDROM:
+ case wxFS_VOL_CDROM:
+ imageId = wxFileIconsTable::cdrom;
+ break;
+ case wxFS_VOL_NETWORK:
+ if (path[0] == wxT('\\'))
+ continue; // skip "\\computer\folder"
+ imageId = wxFileIconsTable::drive;
+ break;
+ case wxFS_VOL_DISK:
+ case wxFS_VOL_OTHER:
+ default:
+ imageId = wxFileIconsTable::drive;
+ break;
+ }
+ paths.Add(path);
+ names.Add(vol.GetDisplayName());
+ icon_ids.Add(imageId);
+ }
+#elif defined(__OS2__)
+ APIRET rc;
+ ULONG ulDriveNum = 0;
+ ULONG ulDriveMap = 0;
+ rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap);
+ if ( rc == 0)
+ {
+ size_t i = 0;
+ while (i < 26)
+ {
+ if (ulDriveMap & ( 1 << i ))
+ {
+ const wxString path = wxFileName::GetVolumeString(
+ 'A' + i, wxPATH_GET_SEPARATOR);
+ const wxString name = wxFileName::GetVolumeString(
+ 'A' + i, wxPATH_NO_SEPARATOR);
+
+ // Note: If _filesys is unsupported by some compilers,
+ // we can always replace it by DosQueryFSAttach
+ char filesysname[20];
+#ifdef __WATCOMC__
+ ULONG cbBuffer = sizeof(filesysname);
+ PFSQBUFFER2 pfsqBuffer = (PFSQBUFFER2)filesysname;
+ APIRET rc = ::DosQueryFSAttach(name.fn_str(),0,FSAIL_QUERYNAME,pfsqBuffer,&cbBuffer);
+ if (rc != NO_ERROR)
+ {
+ filesysname[0] = '\0';
+ }
+#else
+ _filesys(name.fn_str(), filesysname, sizeof(filesysname));
+#endif
+ /* FAT, LAN, HPFS, CDFS, NFS */
+ int imageId;
+ if (path == wxT("A:\\") || path == wxT("B:\\"))
+ imageId = wxFileIconsTable::floppy;
+ else if (!strcmp(filesysname, "CDFS"))
+ imageId = wxFileIconsTable::cdrom;
+ else if (!strcmp(filesysname, "LAN") ||
+ !strcmp(filesysname, "NFS"))
+ imageId = wxFileIconsTable::drive;
+ else
+ imageId = wxFileIconsTable::drive;
+ paths.Add(path);
+ names.Add(name);
+ icon_ids.Add(imageId);
+ }
+ i ++;
+ }
+ }
+#else // !__WIN32__, !__OS2__
+ /* If we can switch to the drive, it exists. */
+ for ( char drive = 'A'; drive <= 'Z'; drive++ )
+ {
+ const wxString
+ path = wxFileName::GetVolumeString(drive, wxPATH_GET_SEPARATOR);