]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/volume.cpp
Return non-const pointer from wxDataViewRendererBase::GetView().
[wxWidgets.git] / src / msw / volume.cpp
index fb471ddf5ff157dc25cc79c379151b381345e9ef..3ea20ccae4a7c4083df78632a96d5acf68ca5c5f 100644 (file)
         #include "wx/icon.h"
     #endif
     #include "wx/intl.h"
         #include "wx/icon.h"
     #endif
     #include "wx/intl.h"
+    #include "wx/log.h"
     #include "wx/hashmap.h"
     #include "wx/hashmap.h"
+    #include "wx/filefn.h"
 #endif // WX_PRECOMP
 
 #include "wx/dir.h"
 #include "wx/dynlib.h"
 #include "wx/arrimpl.cpp"
 
 #endif // WX_PRECOMP
 
 #include "wx/dir.h"
 #include "wx/dynlib.h"
 #include "wx/arrimpl.cpp"
 
+// some compilers require including <windows.h> before <shellapi.h> so do it
+// even if this is not necessary with most of them
+#include "wx/msw/wrapwin.h"
 #include <shellapi.h>
 #include <shlobj.h>
 #include "wx/msw/missing.h"
 #include <shellapi.h>
 #include <shlobj.h>
 #include "wx/msw/missing.h"
@@ -157,7 +162,7 @@ static unsigned GetBasicFlags(const wxChar* 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
         // 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"));
+        wxLogLastError(wxT("SHGetFileInfo"));
     }
     else
     {
     }
     else
     {
@@ -264,6 +269,17 @@ static void BuildListFromNN(wxArrayString& list, NETRESOURCE* pResSrc,
                 {
                     wxString filename(pRes->lpRemoteName);
 
                 {
                     wxString filename(pRes->lpRemoteName);
 
+                    // 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() != '\\')
                     if (!filename.empty())
                     {
                         if (filename.Last() != '\\')
@@ -383,16 +399,16 @@ wxArrayString wxFSVolumeBase::GetVolumes(int flagsSet, int flagsUnset)
     ::InterlockedExchange(&s_cancelSearch, FALSE);     // reset
 
 #if wxUSE_DYNLIB_CLASS
     ::InterlockedExchange(&s_cancelSearch, FALSE);     // reset
 
 #if wxUSE_DYNLIB_CLASS
-    if (!s_mprLib.IsLoaded() && s_mprLib.Load(_T("mpr.dll")))
+    if (!s_mprLib.IsLoaded() && s_mprLib.Load(wxT("mpr.dll")))
     {
 #ifdef UNICODE
     {
 #ifdef UNICODE
-        s_pWNetOpenEnum = (WNetOpenEnumPtr)s_mprLib.GetSymbol(_T("WNetOpenEnumW"));
-        s_pWNetEnumResource = (WNetEnumResourcePtr)s_mprLib.GetSymbol(_T("WNetEnumResourceW"));
+        s_pWNetOpenEnum = (WNetOpenEnumPtr)s_mprLib.GetSymbol(wxT("WNetOpenEnumW"));
+        s_pWNetEnumResource = (WNetEnumResourcePtr)s_mprLib.GetSymbol(wxT("WNetEnumResourceW"));
 #else
 #else
-        s_pWNetOpenEnum = (WNetOpenEnumPtr)s_mprLib.GetSymbol(_T("WNetOpenEnumA"));
-        s_pWNetEnumResource = (WNetEnumResourcePtr)s_mprLib.GetSymbol(_T("WNetEnumResourceA"));
+        s_pWNetOpenEnum = (WNetOpenEnumPtr)s_mprLib.GetSymbol(wxT("WNetOpenEnumA"));
+        s_pWNetEnumResource = (WNetEnumResourcePtr)s_mprLib.GetSymbol(wxT("WNetEnumResourceA"));
 #endif
 #endif
-        s_pWNetCloseEnum = (WNetCloseEnumPtr)s_mprLib.GetSymbol(_T("WNetCloseEnum"));
+        s_pWNetCloseEnum = (WNetCloseEnumPtr)s_mprLib.GetSymbol(wxT("WNetCloseEnum"));
     }
 #endif
 
     }
 #endif
 
@@ -566,7 +582,7 @@ void wxFSVolume::InitIcons()
 wxIcon wxFSVolume::GetIcon(wxFSIconType type) const
 {
     wxCHECK_MSG( type >= 0 && (size_t)type < m_icons.GetCount(), wxNullIcon,
 wxIcon wxFSVolume::GetIcon(wxFSIconType type) const
 {
     wxCHECK_MSG( type >= 0 && (size_t)type < m_icons.GetCount(), wxNullIcon,
-                 _T("wxFSIconType::GetIcon(): invalid icon index") );
+                 wxT("wxFSIconType::GetIcon(): invalid icon index") );
 
     // Load on demand.
     if (m_icons[type].IsNull())
 
     // Load on demand.
     if (m_icons[type].IsNull())
@@ -591,7 +607,7 @@ wxIcon wxFSVolume::GetIcon(wxFSIconType type) const
             break;
 
         case wxFS_VOL_ICO_MAX:
             break;
 
         case wxFS_VOL_ICO_MAX:
-            wxFAIL_MSG(_T("wxFS_VOL_ICO_MAX is not valid icon type"));
+            wxFAIL_MSG(wxT("wxFS_VOL_ICO_MAX is not valid icon type"));
             break;
         }
 
             break;
         }
 
@@ -599,7 +615,9 @@ wxIcon wxFSVolume::GetIcon(wxFSIconType type) const
         long rc = SHGetFileInfo(m_volName.wx_str(), 0, &fi, sizeof(fi), flags);
         m_icons[type].SetHICON((WXHICON)fi.hIcon);
         if (!rc || !fi.hIcon)
         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());
             wxLogError(_("Cannot load icon from '%s'."), m_volName.c_str());
+        }
     }
 
     return m_icons[type];
     }
 
     return m_icons[type];