]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filename.cpp
correct GetBestSize() to return correct best size, i.e. the same size as AutoSize...
[wxWidgets.git] / src / common / filename.cpp
index 98af00ab43c0631cb18ae03c9a0c8652fd3008d9..234ac801380c964f309a0d55bb62e051da451650 100644 (file)
@@ -619,7 +619,7 @@ static int wxOpenWithDeleteOnClose(const wxString& filename)
     HANDLE h = ::CreateFile(filename, access, 0, NULL,
                             disposition, attributes, NULL);
 
-    return wxOpenOSFHandle(h, 0);
+    return wxOpenOSFHandle(h, wxO_BINARY);
 }
 #endif // wxOpenOSFHandle
 
@@ -649,7 +649,7 @@ static bool wxTempOpen(wxFFile *file, const wxString& path, bool *deleteOnClose)
     return file->Open(path, _T("w+b"));
 #else // wx_fdopen
     int fd = wxTempOpen(path, deleteOnClose);
-    if (fd != -1)
+    if (fd == -1)
         return false;
     file->Attach(wx_fdopen(fd, "w+b"));
     return file->IsOpened();
@@ -1131,7 +1131,7 @@ bool wxFileName::Normalize(int flags,
 
     format = GetFormat(format);
 
-    // make the path absolute
+    // set up the directory to use for making the path absolute later
     if ( (flags & wxPATH_NORM_ABSOLUTE) && !IsAbsolute(format) )
     {
         if ( cwd.empty() )
@@ -1142,20 +1142,6 @@ bool wxFileName::Normalize(int flags,
         {
             curDir.AssignDir(cwd);
         }
-
-        // the path may be not absolute because it doesn't have the volume name
-        // but in this case we shouldn't modify the directory components of it
-        // but just set the current volume
-        if ( !HasVolume() && curDir.HasVolume() )
-        {
-            SetVolume(curDir.GetVolume());
-
-            if ( !m_relative )
-            {
-                // yes, it was the case - we don't need curDir then
-                curDir.Clear();
-            }
-        }
     }
 
     // handle ~ stuff under Unix only
@@ -1166,8 +1152,18 @@ bool wxFileName::Normalize(int flags,
             wxString dir = dirs[0u];
             if ( !dir.empty() && dir[0u] == _T('~') )
             {
+                // to make the path absolute use the home directory
                 curDir.AssignDir(wxGetUserHome(dir.c_str() + 1));
 
+                // if we are expanding the tilde, then this path
+                // *should* be already relative (since we checked for
+                // the tilde only in the first char of the first dir);
+                // if m_relative==false, it's because it was initialized
+                // from a string which started with /~; in that case
+                // we reach this point but then need m_relative=true
+                // for relative->absolute expansion later
+                m_relative = true;
+
                 dirs.RemoveAt(0u);
             }
         }
@@ -1176,14 +1172,34 @@ bool wxFileName::Normalize(int flags,
     // transform relative path into abs one
     if ( curDir.IsOk() )
     {
-        wxArrayString dirsNew = curDir.GetDirs();
-        size_t count = dirs.GetCount();
-        for ( size_t n = 0; n < count; n++ )
+        // this path may be relative because it doesn't have the volume name
+        // and still have m_relative=true; in this case we shouldn't modify
+        // our directory components but just set the current volume
+        if ( !HasVolume() && curDir.HasVolume() )
         {
-            dirsNew.Add(dirs[n]);
+            SetVolume(curDir.GetVolume());
+
+            if ( !m_relative )
+        {
+                // yes, it was the case - we don't need curDir then
+                curDir.Clear();
+            }
         }
 
-        dirs = dirsNew;
+        // finally, prepend curDir to the dirs array
+        wxArrayString dirsNew = curDir.GetDirs();
+        WX_PREPEND_ARRAY(dirs, dirsNew);
+
+        // if we used e.g. tilde expansion previously and wxGetUserHome didn't
+        // return for some reason an absolute path, then curDir maybe not be absolute!
+        if ( curDir.IsAbsolute(format) )
+        {
+            // we have prepended an absolute path and thus we are now an absolute
+            // file name too
+            m_relative = false;
+        }
+        // else if (flags & wxPATH_NORM_ABSOLUTE):
+        //   should we warn the user that we didn't manage to make the path absolute?
     }
 
     // now deal with ".", ".." and the rest
@@ -1249,11 +1265,6 @@ bool wxFileName::Normalize(int flags,
         m_ext.MakeLower();
     }
 
-    // we do have the path now
-    //
-    // NB: need to do this before (maybe) calling Assign() below
-    m_relative = false;
-
 #if defined(__WIN32__)
     if ( (flags & wxPATH_NORM_LONG) && (format == wxPATH_DOS) )
     {
@@ -1782,7 +1793,7 @@ wxString wxFileName::GetLongPath() const
     wxString pathOut,
              path = GetFullPath();
 
-#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+#if defined(__WIN32__) && !defined(__WXWINCE__) && !defined(__WXMICROWIN__)
 
 #if wxUSE_DYNAMIC_LOADER
     typedef DWORD (WINAPI *GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD);
@@ -2205,7 +2216,7 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess,
     // not 9x
     bool ok;
     FILETIME ftAccess, ftCreate, ftWrite;
-    if ( IsDir() )
+    if ( IsDir() ) 
     {
         // implemented in msw/dir.cpp
         extern bool wxGetDirectoryTimes(const wxString& dirname,
@@ -2244,6 +2255,7 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess,
         return true;
     }
 #elif defined(__UNIX_LIKE__) || defined(__WXMAC__) || defined(__OS2__) || (defined(__DOS__) && defined(__WATCOMC__))
+    // no need to test for IsDir() here
     wxStructStat stBuf;
     if ( wxStat( GetFullPath().c_str(), &stBuf) == 0 )
     {