]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
wxADJUST_MIN definition (forgot to ci last time)
[wxWidgets.git] / src / common / filefn.cpp
index 633b21aecab870ef9dfa748848f88a8ad8d5b07b..6d2afb1a79614a39efede738b76ec2f59813e28d 100644 (file)
@@ -31,7 +31,8 @@
 
 #include "wx/utils.h"
 #include "wx/intl.h"
-#include "wx/ffile.h"
+#include "wx/file.h"
+#include "wx/filename.h"
 
 // there are just too many of those...
 #ifdef __VISUALC__
@@ -56,6 +57,7 @@
 #else
     #include <stat.h>
     #include <unistd.h>
+    #include <unix.h>
 #endif
 
 #ifdef __UNIX__
@@ -71,6 +73,7 @@
 #if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__)
     #include <direct.h>
     #include <dos.h>
+    #include <io.h>
 #endif // __WINDOWS__
 #endif // native Win compiler
 
@@ -988,7 +991,6 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil
 
   fclose (fp3);
   bool result = wxRenameFile(outfile, file3);
-  delete[] outfile;
   return result;
 }
 
@@ -996,14 +998,50 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil
 bool
 wxCopyFile (const wxString& file1, const wxString& file2)
 {
-    wxFFile fileIn(file1, "rb");
+    wxStructStat fbuf;
+
+    // get permissions of file1
+    if ( wxStat(file1, &fbuf) != 0 )
+    {
+        // the file probably doesn't exist or we haven't the rights to read
+        // from it anyhow
+        wxLogSysError(_("Impossible to get permissions for file '%s'"),
+                      file1.c_str());
+        return FALSE;
+    }
+
+    // open file1 for reading
+    wxFile fileIn(file1, wxFile::read);
     if ( !fileIn.IsOpened() )
         return FALSE;
 
-    wxFFile fileOut(file2, "wb");
-    if ( !fileOut.IsOpened() )
+    // remove file2, if it exists. This is needed for creating
+    // file2 with the correct permissions in the next step
+    if ( wxFileExists(file2) && !wxRemoveFile(file2) )
+    {
+        wxLogSysError(_("Impossible to overwrite the file '%s'"),
+                      file2.c_str());
         return FALSE;
+    }
+
+#ifdef __UNIX__
+    // reset the umask as we want to create the file with exactly the same
+    // permissions as the original one
+    mode_t oldUmask = umask( 0 );
+#endif // __UNIX__
+
+    // create file2 with the same permissions than file1 and open it for
+    // writing
+    wxFile fileOut;
+    if ( !fileOut.Create(file2, TRUE, fbuf.st_mode & 0777) )
+        return FALSE;
+
+#ifdef __UNIX__
+    /// restore the old umask
+    umask(oldUmask);
+#endif // __UNIX__
 
+    // copy contents of file1 to file2
     char buf[4096];
     size_t count;
     for ( ;; )
@@ -1020,6 +1058,15 @@ 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 )
+    {
+        wxLogSysError(_("Impossible to set permissions for the file '%s'"),
+                      file2.c_str());
+        return FALSE;
+    }
+#endif
     return TRUE;
 }
 
@@ -1636,16 +1683,40 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
 #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) {
+       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
@@ -1789,56 +1860,7 @@ void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName,
     // it can be empty, but it shouldn't be NULL
     wxCHECK_RET( pszFileName, wxT("NULL file name in wxSplitPath") );
 
-    const wxChar *pDot = wxStrrchr(pszFileName, wxFILE_SEP_EXT);
-
-#ifdef __WXMSW__
-    // under Windows we understand both separators
-    const wxChar *pSepUnix = wxStrrchr(pszFileName, wxFILE_SEP_PATH_UNIX);
-    const wxChar *pSepDos = wxStrrchr(pszFileName, wxFILE_SEP_PATH_DOS);
-    const wxChar *pLastSeparator = pSepUnix > pSepDos ? pSepUnix : pSepDos;
-#else // assume Unix
-    const wxChar *pLastSeparator = wxStrrchr(pszFileName, wxFILE_SEP_PATH_UNIX);
-
-    if ( pDot )
-    {
-        if ( (pDot == pszFileName) || (*(pDot - 1) == wxFILE_SEP_PATH_UNIX) )
-        {
-            // under Unix, dot may be (and commonly is) the first character of the
-            // filename, don't treat the entire filename as extension in this case
-            pDot = NULL;
-        }
-    }
-#endif // MSW/Unix
-
-    if ( pDot && (pDot < pLastSeparator) )
-    {
-        // the dot is part of the path, not the start of the extension
-        pDot = NULL;
-    }
-
-    if ( pstrPath )
-    {
-        if ( pLastSeparator )
-            *pstrPath = wxString(pszFileName, pLastSeparator - pszFileName);
-        else
-            pstrPath->Empty();
-    }
-
-    if ( pstrName )
-    {
-        const wxChar *start = pLastSeparator ? pLastSeparator + 1 : pszFileName;
-        const wxChar *end = pDot ? pDot : pszFileName + wxStrlen(pszFileName);
-
-        *pstrName = wxString(start, end - start);
-    }
-
-    if ( pstrExt )
-    {
-        if ( pDot )
-            *pstrExt = wxString(pDot + 1);
-        else
-            pstrExt->Empty();
-    }
+    wxFileName::SplitPath(pszFileName, pstrPath, pstrName, pstrExt);
 }
 
 time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename)