X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/844f90fba68fc9fbd3e839825d406839ee9fb9fb..bb84929ec5b27eae5433982703dd6d0df89bfc2d:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 1046ffd340..721448750d 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -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__ @@ -71,6 +72,7 @@ #if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) #include #include + #include #endif // __WINDOWS__ #endif // native Win compiler @@ -995,14 +997,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 ( ;; ) @@ -1019,6 +1057,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; } @@ -1788,56 +1835,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)