X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/49d5d881d4cfacbf5a7b902612ac01a348f6809f..834362a2e400478c9e9022f17c515493eaeb1174:/src/common/file.cpp diff --git a/src/common/file.cpp b/src/common/file.cpp index 366a3842d7..8f1f1deb76 100644 --- a/src/common/file.cpp +++ b/src/common/file.cpp @@ -20,14 +20,15 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/defs.h" #ifdef __BORLANDC__ - #pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_FILE + // standard -#if defined(__WXMSW__) && !defined(__GNUWIN32__) +#if defined(__WXMSW__) && !defined(__GNUWIN32__) && !defined(__WXWINE__) #include #ifndef __SALFORDC__ @@ -156,16 +157,23 @@ // ---------------------------------------------------------------------------- // static functions // ---------------------------------------------------------------------------- -bool wxFile::Exists(const char *name) +bool wxFile::Exists(const wxChar *name) { struct stat st; +#if wxUSE_UNICODE && wxMBFILES + wxCharBuffer fname = wxConvFile.cWC2MB(name); + return !access(fname, 0) && + !stat(MBSTRINGCAST fname, &st) && + (st.st_mode & S_IFREG); +#else return !access(name, 0) && - !stat((char*) name, &st) && + !stat((wxChar*) name, &st) && (st.st_mode & S_IFREG); +#endif } -bool wxFile::Access(const char *name, OpenMode mode) +bool wxFile::Access(const wxChar *name, OpenMode mode) { int how = 0; @@ -179,10 +187,10 @@ bool wxFile::Access(const char *name, OpenMode mode) break; default: - wxFAIL_MSG("bad wxFile::Access mode parameter."); + wxFAIL_MSG(_T("bad wxFile::Access mode parameter.")); } - return access(name, how) == 0; + return access(wxFNCONV(name), how) == 0; } // ---------------------------------------------------------------------------- @@ -190,7 +198,7 @@ bool wxFile::Access(const char *name, OpenMode mode) // ---------------------------------------------------------------------------- // ctors -wxFile::wxFile(const char *szFileName, OpenMode mode) +wxFile::wxFile(const wxChar *szFileName, OpenMode mode) { m_fd = fd_invalid; m_error = FALSE; @@ -205,11 +213,11 @@ wxFile::~wxFile() } // create the file, fail if it already exists and bOverwrite -bool wxFile::Create(const char *szFileName, bool bOverwrite, int accessMode) +bool wxFile::Create(const wxChar *szFileName, bool bOverwrite, int accessMode) { // if bOverwrite we create a new file or truncate the existing one, // otherwise we only create the new file and fail if it already exists - int fd = open(szFileName, + int fd = open(wxFNCONV(szFileName), O_WRONLY | O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL) ACCESS(accessMode)); @@ -224,7 +232,7 @@ bool wxFile::Create(const char *szFileName, bool bOverwrite, int accessMode) } // open the file -bool wxFile::Open(const char *szFileName, OpenMode mode, int accessMode) +bool wxFile::Open(const wxChar *szFileName, OpenMode mode, int accessMode) { int flags = O_BINARY; @@ -246,7 +254,7 @@ bool wxFile::Open(const char *szFileName, OpenMode mode, int accessMode) break; } - int fd = open(szFileName, flags ACCESS(accessMode)); + int fd = open(wxFNCONV(szFileName), flags ACCESS(accessMode)); if ( fd == -1 ) { wxLogSysError(_("can't open file '%s'"), szFileName); @@ -474,51 +482,60 @@ bool wxTempFile::Open(const wxString& strName) // different partitions for example). Unfortunately, the only standard // (POSIX) temp file creation function tmpnam() can't do it. #if defined(__UNIX__) || defined(__WXSTUBS__)|| defined( __WXMAC__ ) - static const char *szMktempSuffix = "XXXXXX"; + static const wxChar *szMktempSuffix = _T("XXXXXX"); m_strTemp << strName << szMktempSuffix; - mktemp((char *)m_strTemp.c_str()); // will do because length doesn't change + mktemp(MBSTRINGCAST m_strTemp.mb_str()); // will do because length doesn't change #else // Windows wxString strPath; wxSplitPath(strName, &strPath, NULL, NULL); if ( strPath.IsEmpty() ) - strPath = '.'; // GetTempFileName will fail if we give it empty string + strPath = _T('.'); // GetTempFileName will fail if we give it empty string #ifdef __WIN32__ - if ( !GetTempFileName(strPath, "wx_",0, m_strTemp.GetWriteBuf(MAX_PATH)) ) + if ( !GetTempFileName(strPath, _T("wx_"),0, m_strTemp.GetWriteBuf(MAX_PATH)) ) #else // Not sure why MSVC++ 1.5 header defines first param as BYTE - bug? - if ( !GetTempFileName((BYTE) (const char*) strPath, "wx_",0, m_strTemp.GetWriteBuf(MAX_PATH)) ) + if ( !GetTempFileName((BYTE) (const wxChar*) strPath, _T("wx_"),0, m_strTemp.GetWriteBuf(MAX_PATH)) ) #endif - wxLogLastError("GetTempFileName"); + wxLogLastError(_T("GetTempFileName")); m_strTemp.UngetWriteBuf(); #endif // Windows/Unix int access = wxS_DEFAULT; #ifdef __UNIX__ // create the file with the same mode as the original one under Unix + mode_t umaskOld = 0; // just to suppress compiler warning + bool changedUmask; + struct stat st; - if ( stat(strName, &st) == 0 ) + if ( stat(strName.fn_str(), &st) == 0 ) { // this assumes that only lower bits of st_mode contain the access // rights, but it's true for at least all Unices which have S_IXXXX() // macros, so should not be less portable than using (not POSIX) // S_IFREG &c access = st.st_mode & 0777; + + // we want to create the file with exactly the same access rights as + // the original one, so disable the user's umask for the moment + umaskOld = umask(0); + changedUmask = TRUE; } else { - wxLogLastError("stat"); + // file probably didn't exist, just create with default mode _using_ + // user's umask (new files creation should respet umask) + changedUmask = FALSE; } - - // we want to create the file with exactly the same access rights as the - // original one, so disable the user's umask for the moment - mode_t umaskOld = umask(0); #endif // Unix - bool ok = m_file.Open(m_strTemp, wxFile::write, access); + bool ok = m_file.Open(m_strTemp, wxFile::write, access); #ifdef __UNIX__ - // restore umask now that the file is created - (void)umask(umaskOld); + if ( changedUmask ) + { + // restore umask now that the file is created + (void)umask(umaskOld); + } #endif // Unix return ok; @@ -538,12 +555,12 @@ bool wxTempFile::Commit() { m_file.Close(); - if ( wxFile::Exists(m_strName) && remove(m_strName) != 0 ) { + if ( wxFile::Exists(m_strName) && remove(m_strName.fn_str()) != 0 ) { wxLogSysError(_("can't remove file '%s'"), m_strName.c_str()); return FALSE; } - if ( rename(m_strTemp, m_strName) != 0 ) { + if ( rename(m_strTemp.fn_str(), m_strName.fn_str()) != 0 ) { wxLogSysError(_("can't commit changes to file '%s'"), m_strName.c_str()); return FALSE; } @@ -554,6 +571,8 @@ bool wxTempFile::Commit() void wxTempFile::Discard() { m_file.Close(); - if ( remove(m_strTemp) != 0 ) + if ( remove(m_strTemp.fn_str()) != 0 ) wxLogSysError(_("can't remove temporary file '%s'"), m_strTemp.c_str()); } + +#endif \ No newline at end of file