+bool wxFileName::FileExists( const wxString &file )
+{
+ return ::wxFileExists( file );
+}
+
+bool wxFileName::DirExists() const
+{
+ return wxFileName::DirExists( GetPath() );
+}
+
+bool wxFileName::DirExists( const wxString &dir )
+{
+ return ::wxDirExists( dir );
+}
+
+// ----------------------------------------------------------------------------
+// CWD and HOME stuff
+// ----------------------------------------------------------------------------
+
+void wxFileName::AssignCwd(const wxString& volume)
+{
+ AssignDir(wxFileName::GetCwd(volume));
+}
+
+/* static */
+wxString wxFileName::GetCwd(const wxString& volume)
+{
+ // if we have the volume, we must get the current directory on this drive
+ // and to do this we have to chdir to this volume - at least under Windows,
+ // I don't know how to get the current drive on another volume elsewhere
+ // (TODO)
+ wxString cwdOld;
+ if ( !volume.empty() )
+ {
+ cwdOld = wxGetCwd();
+ SetCwd(volume + GetVolumeSeparator());
+ }
+
+ wxString cwd = ::wxGetCwd();
+
+ if ( !volume.empty() )
+ {
+ SetCwd(cwdOld);
+ }
+
+ return cwd;
+}
+
+bool wxFileName::SetCwd()
+{
+ return wxFileName::SetCwd( GetPath() );
+}
+
+bool wxFileName::SetCwd( const wxString &cwd )
+{
+ return ::wxSetWorkingDirectory( cwd );
+}
+
+void wxFileName::AssignHomeDir()
+{
+ AssignDir(wxFileName::GetHomeDir());
+}
+
+wxString wxFileName::GetHomeDir()
+{
+ return ::wxGetHomeDir();
+}
+
+
+// ----------------------------------------------------------------------------
+// CreateTempFileName
+// ----------------------------------------------------------------------------
+
+#if wxUSE_FILE || wxUSE_FFILE
+
+
+#if !defined wx_fdopen && defined HAVE_FDOPEN
+ #define wx_fdopen fdopen
+#endif
+
+// NB: GetTempFileName() under Windows creates the file, so using
+// O_EXCL there would fail
+#ifdef __WINDOWS__
+ #define wxOPEN_EXCL 0
+#else
+ #define wxOPEN_EXCL O_EXCL
+#endif
+
+
+#ifdef wxOpenOSFHandle
+#define WX_HAVE_DELETE_ON_CLOSE
+// On Windows create a file with the FILE_FLAGS_DELETE_ON_CLOSE flags.
+//
+static int wxOpenWithDeleteOnClose(const wxString& filename)
+{
+ DWORD access = GENERIC_READ | GENERIC_WRITE;
+
+ DWORD disposition = OPEN_ALWAYS;
+
+ DWORD attributes = FILE_ATTRIBUTE_TEMPORARY |
+ FILE_FLAG_DELETE_ON_CLOSE;
+
+ HANDLE h = ::CreateFile(filename, access, 0, NULL,
+ disposition, attributes, NULL);
+
+ return wxOpenOSFHandle(h, wxO_BINARY);
+}
+#endif // wxOpenOSFHandle
+
+
+// Helper to open the file
+//
+static int wxTempOpen(const wxString& path, bool *deleteOnClose)
+{
+#ifdef WX_HAVE_DELETE_ON_CLOSE
+ if (*deleteOnClose)
+ return wxOpenWithDeleteOnClose(path);
+#endif
+
+ *deleteOnClose = false;
+
+ return wxOpen(path, wxO_BINARY | O_RDWR | O_CREAT | wxOPEN_EXCL, 0600);
+}
+
+
+#if wxUSE_FFILE
+// Helper to open the file and attach it to the wxFFile
+//
+static bool wxTempOpen(wxFFile *file, const wxString& path, bool *deleteOnClose)
+{
+#ifndef wx_fdopen
+ *deleteOnClose = false;
+ return file->Open(path, _T("w+b"));
+#else // wx_fdopen
+ int fd = wxTempOpen(path, deleteOnClose);
+ if (fd == -1)
+ return false;
+ file->Attach(wx_fdopen(fd, "w+b"));
+ return file->IsOpened();
+#endif // wx_fdopen
+}
+#endif // wxUSE_FFILE
+
+
+#if !wxUSE_FILE
+ #define WXFILEARGS(x, y) y
+#elif !wxUSE_FFILE
+ #define WXFILEARGS(x, y) x
+#else
+ #define WXFILEARGS(x, y) x, y
+#endif
+
+
+// Implementation of wxFileName::CreateTempFileName().
+//
+static wxString wxCreateTempImpl(
+ const wxString& prefix,
+ WXFILEARGS(wxFile *fileTemp, wxFFile *ffileTemp),
+ bool *deleteOnClose = NULL)
+{
+#if wxUSE_FILE && wxUSE_FFILE
+ wxASSERT(fileTemp == NULL || ffileTemp == NULL);
+#endif
+ wxString path, dir, name;
+ bool wantDeleteOnClose = false;
+
+ if (deleteOnClose)
+ {
+ // set the result to false initially
+ wantDeleteOnClose = *deleteOnClose;
+ *deleteOnClose = false;
+ }
+ else
+ {
+ // easier if it alwasys points to something
+ deleteOnClose = &wantDeleteOnClose;
+ }
+
+ // use the directory specified by the prefix
+ wxFileName::SplitPath(prefix, &dir, &name, NULL /* extension */);
+
+ if (dir.empty())
+ {
+ dir = wxFileName::GetTempDir();
+ }
+
+#if defined(__WXWINCE__)
+ path = dir + wxT("\\") + name;
+ int i = 1;
+ while (wxFileName::FileExists(path))
+ {
+ path = dir + wxT("\\") + name ;
+ path << i;
+ i ++;
+ }
+
+#elif defined(__WINDOWS__) && !defined(__WXMICROWIN__)
+ if ( !::GetTempFileName(dir, name, 0, wxStringBuffer(path, MAX_PATH + 1)) )
+ {
+ wxLogLastError(_T("GetTempFileName"));
+
+ path.clear();
+ }
+
+#else // !Windows
+ path = dir;
+
+ if ( !wxEndsWithPathSeparator(dir) &&
+ (name.empty() || !wxIsPathSeparator(name[0u])) )
+ {
+ path += wxFILE_SEP_PATH;
+ }
+
+ path += name;
+
+#if defined(HAVE_MKSTEMP)
+ // scratch space for mkstemp()
+ path += _T("XXXXXX");
+
+ // we need to copy the path to the buffer in which mkstemp() can modify it
+ wxCharBuffer buf( wxConvFile.cWX2MB( path ) );
+
+ // cast is safe because the string length doesn't change
+ int fdTemp = mkstemp( (char*)(const char*) buf );
+ 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 // mkstemp() succeeded
+ {
+ path = wxConvFile.cMB2WX( (const char*) buf );
+
+ #if wxUSE_FILE
+ // avoid leaking the fd
+ if ( fileTemp )
+ {
+ fileTemp->Attach(fdTemp);
+ }
+ else
+ #endif
+
+ #if wxUSE_FFILE
+ if ( ffileTemp )
+ {
+ #ifdef wx_fdopen
+ ffileTemp->Attach(wx_fdopen(fdTemp, "r+b"));
+ #else
+ ffileTemp->Open(path, _T("r+b"));
+ close(fdTemp);
+ #endif
+ }
+ else
+ #endif
+
+ {
+ close(fdTemp);
+ }
+ }
+#else // !HAVE_MKSTEMP
+
+#ifdef HAVE_MKTEMP
+ // same as above
+ path += _T("XXXXXX");
+
+ wxCharBuffer buf = wxConvFile.cWX2MB( path );
+ if ( !mktemp( (char*)(const char*) buf ) )
+ {
+ path.clear();
+ }
+ else
+ {
+ path = wxConvFile.cMB2WX( (const char*) buf );
+ }
+#else // !HAVE_MKTEMP (includes __DOS__)
+ // generate the unique file name ourselves
+ #if !defined(__DOS__) && !defined(__PALMOS__) && (!defined(__MWERKS__) || defined(__DARWIN__) )
+ path << (unsigned int)getpid();
+ #endif
+
+ wxString pathTry;
+
+ static const size_t numTries = 1000;
+ for ( size_t n = 0; n < numTries; n++ )
+ {
+ // 3 hex digits is enough for numTries == 1000 < 4096
+ pathTry = path + wxString::Format(_T("%.03x"), (unsigned int) n);
+ if ( !wxFileName::FileExists(pathTry) )
+ {
+ break;
+ }
+
+ pathTry.clear();
+ }
+
+ path = pathTry;
+#endif // HAVE_MKTEMP/!HAVE_MKTEMP
+
+#endif // HAVE_MKSTEMP/!HAVE_MKSTEMP
+
+#endif // Windows/!Windows
+
+ if ( path.empty() )
+ {
+ wxLogSysError(_("Failed to create a temporary file name"));
+ }
+ else
+ {
+ bool ok = true;
+
+ // open the file - of course, there is a race condition here, this is
+ // why we always prefer using mkstemp()...
+ #if wxUSE_FILE
+ if ( fileTemp && !fileTemp->IsOpened() )
+ {
+ *deleteOnClose = wantDeleteOnClose;
+ int fd = wxTempOpen(path, deleteOnClose);
+ if (fd != -1)
+ fileTemp->Attach(fd);
+ else
+ ok = false;
+ }
+ #endif
+
+ #if wxUSE_FFILE
+ if ( ffileTemp && !ffileTemp->IsOpened() )
+ {
+ *deleteOnClose = wantDeleteOnClose;
+ ok = wxTempOpen(ffileTemp, path, deleteOnClose);
+ }
+ #endif
+
+ if ( !ok )
+ {
+ // FIXME: If !ok here should we loop and try again with another
+ // file name? That is the standard recourse if open(O_EXCL)
+ // fails, though of course it should be protected against
+ // possible infinite looping too.
+
+ wxLogError(_("Failed to open temporary file."));
+
+ path.clear();
+ }
+ }
+
+ return path;
+}
+
+
+static bool wxCreateTempImpl(
+ const wxString& prefix,
+ WXFILEARGS(wxFile *fileTemp, wxFFile *ffileTemp),
+ wxString *name)
+{
+ bool deleteOnClose = true;
+
+ *name = wxCreateTempImpl(prefix,
+ WXFILEARGS(fileTemp, ffileTemp),
+ &deleteOnClose);
+
+ bool ok = !name->empty();
+
+ if (deleteOnClose)
+ name->clear();
+#ifdef __UNIX__
+ else if (ok && wxRemoveFile(*name))
+ name->clear();
+#endif
+
+ return ok;
+}
+
+
+static void wxAssignTempImpl(
+ wxFileName *fn,
+ const wxString& prefix,
+ WXFILEARGS(wxFile *fileTemp, wxFFile *ffileTemp))
+{
+ wxString tempname;
+ tempname = wxCreateTempImpl(prefix, WXFILEARGS(fileTemp, ffileTemp));
+
+ if ( tempname.empty() )
+ {
+ // error, failed to get temp file name
+ fn->Clear();
+ }
+ else // ok
+ {
+ fn->Assign(tempname);
+ }
+}
+
+
+void wxFileName::AssignTempFileName(const wxString& prefix)
+{
+ wxAssignTempImpl(this, prefix, WXFILEARGS(NULL, NULL));
+}
+
+/* static */
+wxString wxFileName::CreateTempFileName(const wxString& prefix)