]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filename.cpp
compilation fix for Windows
[wxWidgets.git] / src / common / filename.cpp
index 17525840a4fa79db8d31feada702994e401c9c6f..d5fcbb54953e44e5a01a338c749f063e843b221e 100644 (file)
@@ -80,6 +80,7 @@
 #include "wx/tokenzr.h"
 #include "wx/config.h"          // for wxExpandEnvVars
 #include "wx/utils.h"
+#include "wx/file.h"
 
 #if wxUSE_DYNLIB_CLASS
     #include "wx/dynlib.h"
@@ -271,7 +272,7 @@ void wxFileName::Assign(const wxString& volume,
                 m_relative = ( (my_path[0u] != wxT('/')) && (my_path[0u] != wxT('\\')) );
                 break;
             default:
-                wxFAIL_MSG( "error" );
+                wxFAIL_MSG( wxT("error") );
                 break;
         }
         
@@ -456,9 +457,9 @@ wxString wxFileName::GetHomeDir()
     return ::wxGetHomeDir();
 }
 
-void wxFileName::AssignTempFileName( const wxString& prefix )
+void wxFileName::AssignTempFileName(const wxString& prefix, wxFile *fileTemp)
 {
-    wxString tempname = CreateTempFileName(prefix);
+    wxString tempname = CreateTempFileName(prefix, fileTemp);
     if ( tempname.empty() )
     {
         // error, failed to get temp file name
@@ -471,7 +472,8 @@ void wxFileName::AssignTempFileName( const wxString& prefix )
 }
 
 /* static */
-wxString wxFileName::CreateTempFileName(const wxString& prefix)
+wxString
+wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp)
 {
     wxString path, dir, name;
 
@@ -558,13 +560,25 @@ wxString wxFileName::CreateTempFileName(const wxString& prefix)
 
     // can use the cast here because the length doesn't change and the string
     // is not shared
-    if ( mkstemp((char *)path.mb_str()) == -1 )
+    int fdTemp = mkstemp((char *)path.mb_str());
+    if ( fdTemp == -1 )
     {
         // this might be not necessary as mkstemp() on most systems should have
         // already done it but it doesn't hurt neither...
         path.clear();
     }
-    //else: file already created
+    else // mkstemp() succeeded
+    {
+        // avoid leaking the fd
+        if ( fileTemp )
+        {
+            fileTemp->Attach(fdTemp);
+        }
+        else
+        {
+            close(fdTemp);
+        }
+    }
 #else // !HAVE_MKSTEMP
 
 #ifdef HAVE_MKTEMP
@@ -601,10 +615,20 @@ wxString wxFileName::CreateTempFileName(const wxString& prefix)
 
     if ( !path.empty() )
     {
-        // create the file - of course, there is a race condition here, this is
+    }
+#endif // HAVE_MKSTEMP/!HAVE_MKSTEMP
+
+#endif // Windows/!Windows
+
+    if ( path.empty() )
+    {
+        wxLogSysError(_("Failed to create a temporary file name"));
+    }
+    else if ( fileTemp && !fileTemp->IsOpened() )
+    {
+        // open the file - of course, there is a race condition here, this is
         // why we always prefer using mkstemp()...
-        wxFile file;
-        if ( !file.Open(path, wxFile::write_excl, wxS_IRUSR | wxS_IWUSR) )
+        if ( !fileTemp->Open(path, wxFile::write_excl, wxS_IRUSR | wxS_IWUSR) )
         {
             // FIXME: If !ok here should we loop and try again with another
             //        file name?  That is the standard recourse if open(O_EXCL)
@@ -616,14 +640,6 @@ wxString wxFileName::CreateTempFileName(const wxString& prefix)
             path.clear();
         }
     }
-#endif // HAVE_MKSTEMP/!HAVE_MKSTEMP
-
-#endif // Windows/!Windows
-
-    if ( path.empty() )
-    {
-        wxLogSysError(_("Failed to create a temporary file name"));
-    }
 
     return path;
 }
@@ -728,6 +744,7 @@ bool wxFileName::Normalize(wxPathNormalize flags,
             }
         }
 #endif
+        m_relative = FALSE;
     }
 
     // handle ~ stuff under Unix only
@@ -1070,7 +1087,7 @@ wxString wxFileName::GetPath( bool add_separator, wxPathFormat format ) const
                 }
                 default:
                 {
-                    wxFAIL_MSG( "error" );
+                    wxFAIL_MSG( wxT("error") );
                 }
             }
         }
@@ -1090,18 +1107,18 @@ wxString wxFileName::GetFullPath( wxPathFormat format ) const
     // first put the volume
     if ( !m_volume.empty() )
     {
-       {
-               // Special Windows UNC paths hack, part 2: undo what we did in
-               // SplitPath() and make an UNC path if we have a drive which is not a
-               // single letter (hopefully the network shares can't be one letter only
-               // although I didn't find any authoritative docs on this)
-               if ( format == wxPATH_DOS && m_volume.length() > 1 )
-               {
-               fullpath << wxFILE_SEP_PATH_DOS << wxFILE_SEP_PATH_DOS << m_volume;
-               }
-               else if  ( format == wxPATH_DOS || format == wxPATH_VMS )
-               {
-               fullpath << m_volume << GetVolumeSeparator(format);
+        {
+            // Special Windows UNC paths hack, part 2: undo what we did in
+            // SplitPath() and make an UNC path if we have a drive which is not a
+            // single letter (hopefully the network shares can't be one letter only
+            // although I didn't find any authoritative docs on this)
+            if ( format == wxPATH_DOS && m_volume.length() > 1 )
+            {
+                fullpath << wxFILE_SEP_PATH_DOS << wxFILE_SEP_PATH_DOS << m_volume;
+            }
+            else if  ( format == wxPATH_DOS || format == wxPATH_VMS )
+            {
+                fullpath << m_volume << GetVolumeSeparator(format);
             }
             // else ignore
         }
@@ -1172,7 +1189,7 @@ wxString wxFileName::GetFullPath( wxPathFormat format ) const
                 }
                 default:
                 {
-                    wxFAIL_MSG( "error" );
+                    wxFAIL_MSG( wxT("error") );
                 }
             }
         }