// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "fsvolume.h"
-#endif
-
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#if wxUSE_FSVOLUME
+#include "wx/volume.h"
+
#ifndef WX_PRECOMP
#if wxUSE_GUI
#include "wx/icon.h"
#endif
#include "wx/intl.h"
+ #include "wx/hashmap.h"
+ #include "wx/filefn.h"
#endif // WX_PRECOMP
#include "wx/dir.h"
-#include "wx/hashmap.h"
#include "wx/dynlib.h"
#include "wx/arrimpl.cpp"
-#include "wx/volume.h"
-
#include <shellapi.h>
#include <shlobj.h>
#include "wx/msw/missing.h"
// Dynamic library function defs.
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+#if wxUSE_DYNLIB_CLASS
static wxDynamicLibrary s_mprLib;
+#endif
typedef DWORD (WINAPI* WNetOpenEnumPtr)(DWORD, DWORD, DWORD, LPNETRESOURCE, LPHANDLE);
typedef DWORD (WINAPI* WNetEnumResourcePtr)(HANDLE, LPDWORD, LPVOID, LPDWORD);
}
//-----------------------------------------------------------------------
- // The following will most likely will not modify anything not set above,
+ // The following most likely will not modify anything not set above,
// and will not work at all for network shares or empty CD ROM drives.
// But it is a good check if the Win API ever gets better about reporting
// this information.
//-----------------------------------------------------------------------
SHFILEINFO fi;
- long rc;
- rc = SHGetFileInfo(filename, 0, &fi, sizeof(fi), SHGFI_ATTRIBUTES );
+ long rc = SHGetFileInfo(filename, 0, &fi, sizeof(fi), SHGFI_ATTRIBUTES);
if (!rc)
{
- wxLogError(_("Cannot read typename from '%s'!"), filename);
+ // this error is not fatal, so don't show a message to the user about
+ // it, otherwise it would appear every time a generic directory picker
+ // dialog is used and there is a connected network drive
+ wxLogLastError(_T("SHGetFileInfo"));
}
else
{
{
wxString filename(pRes->lpRemoteName);
- if (filename.Len())
+ // if the drive is unavailable, FilteredAdd() can hang for
+ // a long time and, moreover, its failure appears to be not
+ // cached so this will happen every time we use it, so try
+ // a much quicker wxDirExists() test (which still hangs but
+ // for much shorter time) for locally mapped drives first
+ // to try to avoid this
+ if ( pRes->lpLocalName &&
+ *pRes->lpLocalName &&
+ !wxDirExists(pRes->lpLocalName) )
+ continue;
+
+ if (!filename.empty())
{
if (filename.Last() != '\\')
filename.Append('\\');
// The filter function will not know mounted from unmounted, and neither do we unless
// we are iterating using RESOURCE_CONNECTED, in which case they all are mounted.
// Volumes on disconnected servers, however, will correctly show as unmounted.
- FilteredAdd(list, filename, flagsSet, flagsUnset&~wxFS_VOL_MOUNTED);
+ FilteredAdd(list, filename.wx_str(), flagsSet, flagsUnset&~wxFS_VOL_MOUNTED);
if (scope == RESOURCE_GLOBALNET)
s_fileInfo[filename].m_flags &= ~wxFS_VOL_MOUNTED;
}
mounted.Sort(CompareFcn);
// apply list from bottom to top to preserve indexes if removing items.
- int iList = list.GetCount()-1;
- int iMounted;
- for (iMounted = mounted.GetCount()-1; iMounted >= 0 && iList >= 0; iMounted--)
+ ssize_t iList = list.GetCount()-1;
+ for (ssize_t iMounted = mounted.GetCount()-1; iMounted >= 0 && iList >= 0; iMounted--)
{
int compare;
wxString all(list[iList]);
{
::InterlockedExchange(&s_cancelSearch, FALSE); // reset
+#if wxUSE_DYNLIB_CLASS
if (!s_mprLib.IsLoaded() && s_mprLib.Load(_T("mpr.dll")))
{
#ifdef UNICODE
#endif
s_pWNetCloseEnum = (WNetCloseEnumPtr)s_mprLib.GetSymbol(_T("WNetCloseEnum"));
}
+#endif
wxArrayString list;
// Local and mapped drives first.
//-------------------------------
// Allocate the required space for the API call.
- size_t chars = GetLogicalDriveStrings(0, 0);
+ const DWORD chars = GetLogicalDriveStrings(0, NULL);
TCHAR* buf = new TCHAR[chars+1];
// Get the list of drives.
// Display name.
SHFILEINFO fi;
- long rc = SHGetFileInfo(m_volName, 0, &fi, sizeof(fi), SHGFI_DISPLAYNAME);
+ long rc = SHGetFileInfo(m_volName.wx_str(), 0, &fi, sizeof(fi), SHGFI_DISPLAYNAME);
if (!rc)
{
wxLogError(_("Cannot read typename from '%s'!"), m_volName.c_str());
}
SHFILEINFO fi;
- long rc = SHGetFileInfo(m_volName, 0, &fi, sizeof(fi), flags);
+ long rc = SHGetFileInfo(m_volName.wx_str(), 0, &fi, sizeof(fi), flags);
m_icons[type].SetHICON((WXHICON)fi.hIcon);
if (!rc || !fi.hIcon)
wxLogError(_("Cannot load icon from '%s'."), m_volName.c_str());
#endif // wxUSE_GUI
#endif // wxUSE_FSVOLUME
-