#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"
m_relative = ( (my_path[0u] != wxT('/')) && (my_path[0u] != wxT('\\')) );
break;
default:
- wxFAIL_MSG( "error" );
+ wxFAIL_MSG( wxT("error") );
break;
}
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
}
/* static */
-wxString wxFileName::CreateTempFileName(const wxString& prefix)
+wxString
+wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp)
{
wxString path, dir, name;
// 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
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)
path.clear();
}
}
-#endif // HAVE_MKSTEMP/!HAVE_MKSTEMP
-
-#endif // Windows/!Windows
-
- if ( path.empty() )
- {
- wxLogSysError(_("Failed to create a temporary file name"));
- }
return path;
}
}
}
#endif
+ m_relative = FALSE;
}
// handle ~ stuff under Unix only
}
default:
{
- wxFAIL_MSG( "error" );
+ wxFAIL_MSG( wxT("error") );
}
}
}
// 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
}
}
default:
{
- wxFAIL_MSG( "error" );
+ wxFAIL_MSG( wxT("error") );
}
}
}