]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filename.cpp
fix memory leak in wxScreenDC, fixes #13249
[wxWidgets.git] / src / common / filename.cpp
index 34d8845668fcbec68e8a8a7db183eb7f32d0a5a9..b70eb4fd8d5896e9102d508d363404c34918a12d 100644 (file)
@@ -98,7 +98,7 @@
     #include "wx/msw/gccpriv.h"
 #endif
 
-#ifdef __WXWINCE__
+#ifdef __WXMSW__
 #include "wx/msw/private.h"
 #endif
 
 extern const wxULongLong wxInvalidSize = (unsigned)-1;
 #endif // wxUSE_LONGLONG
 
-#ifdef __WIN32__
-    // this define is missing from VC6 headers
-    #ifndef INVALID_FILE_ATTRIBUTES
-        #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
-    #endif
-#endif // __WIN32__
-
 namespace
 {
 
@@ -188,7 +181,7 @@ public:
         // access time (see #10567)
         m_hFile = ::CreateFile
                     (
-                     filename.fn_str(),             // name
+                     filename.t_str(),             // name
                      mode == ReadAttr ? FILE_READ_ATTRIBUTES    // access mask
                                       : FILE_WRITE_ATTRIBUTES,
                      FILE_SHARE_READ |              // sharing mode
@@ -613,7 +606,7 @@ bool wxFileName::FileExists( const wxString &filePath )
 #elif defined(__WIN32__) && !defined(__WXMICROWIN__)
     // we must use GetFileAttributes() instead of the ANSI C functions because
     // it can cope with network (UNC) paths unlike them
-    DWORD ret = ::GetFileAttributes(filePath.fn_str());
+    DWORD ret = ::GetFileAttributes(filePath.t_str());
 
     return (ret != INVALID_FILE_ATTRIBUTES) && !(ret & FILE_ATTRIBUTE_DIRECTORY);
 #else // !__WIN32__
@@ -670,7 +663,7 @@ bool wxFileName::DirExists( const wxString &dirPath )
     return false;
 #elif defined(__WIN32__) && !defined(__WXMICROWIN__)
     // stat() can't cope with network paths
-    DWORD ret = ::GetFileAttributes(strPath.fn_str());
+    DWORD ret = ::GetFileAttributes(strPath.t_str());
 
     return (ret != INVALID_FILE_ATTRIBUTES) && (ret & FILE_ATTRIBUTE_DIRECTORY);
 #elif defined(__OS2__)
@@ -876,8 +869,8 @@ static wxString wxCreateTempImpl(
     }
 
 #elif defined(__WINDOWS__) && !defined(__WXMICROWIN__)
-    if ( !::GetTempFileName(dir.fn_str(), name.fn_str(), 0,
-                            wxStringBuffer(path, MAX_PATH + 1)) )
+    if (!::GetTempFileName(dir.t_str(), name.t_str(), 0,
+                           wxStringBuffer(path, MAX_PATH + 1)))
     {
         wxLogLastError(wxT("GetTempFileName"));
 
@@ -1191,9 +1184,24 @@ wxString wxFileName::GetTempDir()
             wxLogLastError(wxT("GetTempPath"));
         }
 #elif defined(__WXMAC__) && wxOSX_USE_CARBON
-        dir = wxMacFindFolder(short(kOnSystemDisk), kTemporaryFolderType, kCreateFolder);
+        dir = wxMacFindFolderNoSeparator(short(kOnSystemDisk), kTemporaryFolderType, kCreateFolder);
 #endif // systems with native way
     }
+    else // we got directory from an environment variable
+    {
+        // remove any trailing path separators, we don't want to ever return
+        // them from this function for consistency
+        const size_t lastNonSep = dir.find_last_not_of(GetPathSeparators());
+        if ( lastNonSep == wxString::npos )
+        {
+            // the string consists entirely of separators, leave only one
+            dir = GetPathSeparator();
+        }
+        else
+        {
+            dir.erase(lastNonSep + 1);
+        }
+    }
 
     // fall back to hard coded value
     if ( dir.empty() )
@@ -1272,7 +1280,11 @@ bool wxFileName::Rmdir(const wxString& dir, int flags)
         SHFILEOPSTRUCT fileop;
         wxZeroMemory(fileop);
         fileop.wFunc = FO_DELETE;
+    #if defined(__CYGWIN__) && defined(wxUSE_UNICODE)
+        fileop.pFrom = path.wc_str();
+    #else
         fileop.pFrom = path.fn_str();
+    #endif
         fileop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION;
     #ifndef __WXWINCE__
         // FOF_NOERRORUI is not defined in WinCE
@@ -1436,15 +1448,24 @@ bool wxFileName::Normalize(int flags,
 
             if ( dir == wxT("..") )
             {
-                if ( m_dirs.IsEmpty() )
+                if ( m_dirs.empty() )
                 {
-                    wxLogError(_("The path '%s' contains too many \"..\"!"),
-                               GetFullPath().c_str());
-                    return false;
-                }
+                    // We have more ".." than directory components so far.
+                    // Don't treat this as an error as the path could have been
+                    // entered by user so try to handle it reasonably: if the
+                    // path is absolute, just ignore the extra ".." because
+                    // "/.." is the same as "/". Otherwise, i.e. for relative
+                    // paths, keep ".." unchanged because removing it would
+                    // modify the file a relative path refers to.
+                    if ( !m_relative )
+                        continue;
 
-                m_dirs.RemoveAt(m_dirs.GetCount() - 1);
-                continue;
+                }
+                else // Normal case, go one step up.
+                {
+                    m_dirs.pop_back();
+                    continue;
+                }
             }
         }
 
@@ -2043,13 +2064,13 @@ wxString wxFileName::GetShortPath() const
     wxString path(GetFullPath());
 
 #if defined(__WXMSW__) && defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
-    DWORD sz = ::GetShortPathName(path.fn_str(), NULL, 0);
+    DWORD sz = ::GetShortPathName(path.t_str(), NULL, 0);
     if ( sz != 0 )
     {
         wxString pathOut;
         if ( ::GetShortPathName
                (
-                path.fn_str(),
+                path.t_str(),
                 wxStringBuffer(pathOut, sz),
                 sz
                ) != 0 )
@@ -2107,12 +2128,12 @@ wxString wxFileName::GetLongPath() const
 
     if ( s_pfnGetLongPathName )
     {
-        DWORD dwSize = (*s_pfnGetLongPathName)(path.fn_str(), NULL, 0);
+        DWORD dwSize = (*s_pfnGetLongPathName)(path.t_str(), NULL, 0);
         if ( dwSize > 0 )
         {
             if ( (*s_pfnGetLongPathName)
                  (
-                  path.fn_str(),
+                  path.t_str(),
                   wxStringBuffer(pathOut, dwSize),
                   dwSize
                  ) != 0 )
@@ -2164,7 +2185,7 @@ wxString wxFileName::GetLongPath() const
             continue;
         }
 
-        hFind = ::FindFirstFile(tmpPath.fn_str(), &findFileData);
+        hFind = ::FindFirstFile(tmpPath.t_str(), &findFileData);
         if (hFind == INVALID_HANDLE_VALUE)
         {
             // Error: most likely reason is that path doesn't exist, so