]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
Blob support fixes - still does not work, but getting there
[wxWidgets.git] / src / common / filefn.cpp
index 721448750dbce5dc51178799de807bbc3edada02..4cfc2036a1ae32872942498038db8053feafaf73 100644 (file)
@@ -57,6 +57,7 @@
 #else
     #include <stat.h>
     #include <unistd.h>
+    #include <unix.h>
 #endif
 
 #ifdef __UNIX__
 
 extern wxChar *wxBuffer;
 
-#ifdef __WXMAC__
-#include "morefile.h"
-#include "moreextr.h"
-#include "fullpath.h"
-#include "fspcompa.h"
+#if defined(__WXMAC__) && !defined(__UNIX__)
+    #include "morefile.h"
+    #include "moreextr.h"
+    #include "fullpath.h"
+    #include "fspcompa.h"
 #endif
 
 IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
@@ -816,7 +817,7 @@ wxString wxPathOnly (const wxString& path)
 // and back again - or we get nasty problems with delimiters.
 // Also, convert to lower case, since case is significant in UNIX.
 
-#ifdef __WXMAC__
+#if defined(__WXMAC__) && !defined(__UNIX__)
 
 static char sMacFileNameConversion[ 1000 ] ;
 
@@ -995,12 +996,19 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil
 
 // Copy files
 bool
-wxCopyFile (const wxString& file1, const wxString& file2)
+wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
 {
+#if defined(__WIN32__)
+    // CopyFile() copies file attributes and modification time too, so use it
+    // instead of our code if available
+    //
+    // NB: 3rd parameter is bFailIfExists i.e. the inverse of overwrite
+    return ::CopyFile(file1, file2, !overwrite) != 0;
+#else // !Win32
     wxStructStat fbuf;
 
     // get permissions of file1
-    if ( wxStat(file1, &fbuf) != 0 )
+    if ( wxStat(OS_FILENAME(file1), &fbuf) != 0 )
     {
         // the file probably doesn't exist or we haven't the rights to read
         // from it anyhow
@@ -1016,7 +1024,7 @@ wxCopyFile (const wxString& file1, const wxString& file2)
 
     // remove file2, if it exists. This is needed for creating
     // file2 with the correct permissions in the next step
-    if ( wxFileExists(file2) && !wxRemoveFile(file2) )
+    if ( wxFileExists(file2)  && (!overwrite || !wxRemoveFile(file2)))
     {
         wxLogSysError(_("Impossible to overwrite the file '%s'"),
                       file2.c_str());
@@ -1032,7 +1040,7 @@ wxCopyFile (const wxString& file1, const wxString& file2)
     // create file2 with the same permissions than file1 and open it for
     // writing
     wxFile fileOut;
-    if ( !fileOut.Create(file2, TRUE, fbuf.st_mode & 0777) )
+    if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) )
         return FALSE;
 
 #ifdef __UNIX__
@@ -1057,23 +1065,32 @@ wxCopyFile (const wxString& file1, const wxString& file2)
             return FALSE;
     }
 
-#ifndef __VISAGECPP__
-// no chmod in VA.  SHould be some permission API for HPFS386 partitions however
-    if ( chmod(file2, fbuf.st_mode) != 0 )
+    // we can expect fileIn to be closed successfully, but we should ensure
+    // that fileOut was closed as some write errors (disk full) might not be
+    // detected before doing this
+    if ( !fileIn.Close() || !fileOut.Close() )
+        return FALSE;
+
+#if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__)
+    // no chmod in VA.  Should be some permission API for HPFS386 partitions
+    // however
+    if ( chmod(OS_FILENAME(file2), fbuf.st_mode) != 0 )
     {
         wxLogSysError(_("Impossible to set permissions for the file '%s'"),
                       file2.c_str());
         return FALSE;
     }
-#endif
+#endif // OS/2 || Mac
+
     return TRUE;
+#endif // __WXMSW__ && __WIN32__
 }
 
 bool
 wxRenameFile (const wxString& file1, const wxString& file2)
 {
   // Normal system call
-  if ( wxRename (OS_FILENAME(file1), OS_FILENAME(file2)) == 0 )
+  if ( wxRename (file1, file2) == 0 )
     return TRUE;
 
   // Try to copy
@@ -1098,7 +1115,7 @@ bool wxRemoveFile(const wxString& file)
 
 bool wxMkdir(const wxString& dir, int perm)
 {
-#if defined( __WXMAC__ )
+#if defined(__WXMAC__) && !defined(__UNIX__)
   return (mkdir(wxUnix2MacFilename( dir ) , 0 ) == 0);
 #else // !Mac
     const wxChar *dirname = dir.c_str();
@@ -1663,7 +1680,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
   char *cbuf = new char[sz+1];
 #ifdef _MSC_VER
   if (_getcwd(cbuf, sz) == NULL) {
-#elif defined( __WXMAC__)
+#elif defined(__WXMAC__) && !defined(__UNIX__)
     enum
     {
         SFSaveDisk = 0x214, CurDirStore = 0x398
@@ -1681,17 +1698,41 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
 #else // wxUnicode
 #ifdef _MSC_VER
   if (_getcwd(buf, sz) == NULL) {
-#elif defined( __WXMAC__)
-    enum
-    {
-        SFSaveDisk = 0x214, CurDirStore = 0x398
-    };
-    FSSpec cwdSpec ;
-
-    FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ;
-    wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ;
-    strcpy( buf , res ) ;
-    if (0) {
+#elif defined(__WXMAC__) && !defined(__UNIX__)
+       FSSpec cwdSpec ;
+       FCBPBRec pb;
+       OSErr error;
+       Str255  fileName ;
+       pb.ioNamePtr = (StringPtr) &fileName;
+       pb.ioVRefNum = 0;
+       pb.ioRefNum = LMGetCurApRefNum();
+       pb.ioFCBIndx = 0;
+       error = PBGetFCBInfoSync(&pb);
+       if ( error == noErr ) 
+       {
+               cwdSpec.vRefNum = pb.ioFCBVRefNum;
+               cwdSpec.parID = pb.ioFCBParID;
+               cwdSpec.name[0] = 0 ;
+               wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ;
+               
+               strcpy( buf , res ) ;
+               buf[res.length()-1]=0 ;
+       }
+       else
+               buf[0] = 0 ;
+       /*
+       this version will not always give back the application directory on mac
+       enum 
+       { 
+               SFSaveDisk = 0x214, CurDirStore = 0x398 
+       };
+       FSSpec cwdSpec ;
+       
+       FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ;
+       wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ;
+       strcpy( buf , res ) ;
+       */
+       if (0) {
 #elif(__VISAGECPP__)
     APIRET rc;
     rc = ::DosQueryCurrentDir( 0 // current drive