X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e90c1d2a19361551eb07778280f22be3e759cf64..399b60a0ad232265cd74ce8bf6a53a1f2cc57ff2:/src/common/file.cpp?ds=sidebyside diff --git a/src/common/file.cpp b/src/common/file.cpp index 83d73611a0..93598c8bb0 100644 --- a/src/common/file.cpp +++ b/src/common/file.cpp @@ -122,8 +122,9 @@ #define R_OK 4 #endif -// there is no distinction between text and binary files under Unix -#ifdef __UNIX__ +// there is no distinction between text and binary files under Unix, so define +// O_BINARY as 0 if the system headers don't do it already +#if defined(__UNIX__) && !defined(O_BINARY) #define O_BINARY (0) #endif //__UNIX__ @@ -132,21 +133,15 @@ #endif // wxWindows -#include -#include -#include -#include +#include "wx/string.h" +#include "wx/intl.h" +#include "wx/file.h" +#include "wx/log.h" #ifndef MAX_PATH #define MAX_PATH 512 #endif -#ifdef __WXMAC__ - char gwxMacFileName[ MAX_PATH ] ; - char gwxMacFileName2[ MAX_PATH ] ; - char gwxMacFileName3[ MAX_PATH ] ; -#endif - // some broken compilers don't have 3rd argument in open() and creat() #ifdef __SALFORDC__ #define ACCESS(access) @@ -168,14 +163,22 @@ bool wxFile::Exists(const wxChar *name) #if wxUSE_UNICODE && wxMBFILES wxCharBuffer fname = wxConvFile.cWC2MB(name); +#ifdef __WXMAC__ + return !access(wxUnix2MacFilename( name ) , 0) && !stat(wxUnix2MacFilename( name ), &st) && (st.st_mode & S_IFREG); +#else return !access(fname, 0) && !stat(wxMBSTRINGCAST fname, &st) && (st.st_mode & S_IFREG); +#endif +#else +#ifdef __WXMAC__ + return !access(wxUnix2MacFilename( name ) , 0) && !stat(wxUnix2MacFilename( name ), &st) && (st.st_mode & S_IFREG); #else return !access(name, 0) && !stat((wxChar*) name, &st) && (st.st_mode & S_IFREG); #endif +#endif } bool wxFile::Access(const wxChar *name, OpenMode mode) @@ -192,7 +195,7 @@ bool wxFile::Access(const wxChar *name, OpenMode mode) break; default: - wxFAIL_MSG(T("bad wxFile::Access mode parameter.")); + wxFAIL_MSG(wxT("bad wxFile::Access mode parameter.")); } return access(wxFNCONV(name), how) == 0; @@ -216,10 +219,14 @@ 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 +#ifdef __WXMAC__ + int fd = open(wxUnix2MacFilename( szFileName ), O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL), access); +#else int fd = open(wxFNCONV(szFileName), - O_WRONLY | O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL) + O_BINARY | O_WRONLY | O_CREAT | + (bOverwrite ? O_TRUNC : O_EXCL) ACCESS(accessMode)); - +#endif if ( fd == -1 ) { wxLogSysError(_("can't create file '%s'"), szFileName); return FALSE; @@ -253,8 +260,11 @@ bool wxFile::Open(const wxChar *szFileName, OpenMode mode, int accessMode) break; } +#ifdef __WXMAC__ + int fd = open(wxUnix2MacFilename( szFileName ), flags, access); +#else int fd = open(wxFNCONV(szFileName), flags ACCESS(accessMode)); - +#endif if ( fd == -1 ) { wxLogSysError(_("can't open file '%s'"), szFileName); return FALSE; @@ -449,8 +459,7 @@ bool wxFile::Eof() const return FALSE; case -1: - wxLogSysError(_("can't determine if the end of file is reached on \ - descriptor %d"), m_fd); + wxLogSysError(_("can't determine if the end of file is reached on descriptor %d"), m_fd); break; default: @@ -481,7 +490,7 @@ 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 wxChar *szMktempSuffix = T("XXXXXX"); + static const wxChar *szMktempSuffix = wxT("XXXXXX"); m_strTemp << strName << szMktempSuffix; // can use the cast because length doesn't change mktemp(wxMBSTRINGCAST m_strTemp.mb_str()); @@ -489,21 +498,21 @@ bool wxTempFile::Open(const wxString& strName) // for now just create a file // future enhancements can be to set some extended attributes for file systems // OS/2 supports that have them (HPFS, FAT32) and security (HPFS386) - static const wxChar *szMktempSuffix = T("XXX"); + static const wxChar *szMktempSuffix = wxT("XXX"); m_strTemp << strName << szMktempSuffix; mkdir(m_strTemp.GetWriteBuf(MAX_PATH)); #else // Windows wxString strPath; wxSplitPath(strName, &strPath, NULL, NULL); if ( strPath.IsEmpty() ) - strPath = T('.'); // GetTempFileName will fail if we give it empty string + strPath = wxT('.'); // GetTempFileName will fail if we give it empty string #ifdef __WIN32__ - if ( !GetTempFileName(strPath, T("wx_"),0, m_strTemp.GetWriteBuf(MAX_PATH)) ) + if ( !GetTempFileName(strPath, wxT("wx_"),0, m_strTemp.GetWriteBuf(MAX_PATH)) ) #else // Not sure why MSVC++ 1.5 header defines first param as BYTE - bug? - if ( !GetTempFileName((BYTE) (DWORD)(const wxChar*) strPath, T("wx_"),0, m_strTemp.GetWriteBuf(MAX_PATH)) ) + if ( !GetTempFileName((BYTE) (DWORD)(const wxChar*) strPath, wxT("wx_"),0, m_strTemp.GetWriteBuf(MAX_PATH)) ) #endif - wxLogLastError(T("GetTempFileName")); + wxLogLastError(wxT("GetTempFileName")); m_strTemp.UngetWriteBuf(); #endif // Windows/Unix @@ -562,6 +571,7 @@ bool wxTempFile::Commit() { m_file.Close(); +#ifndef __WXMAC__ if ( wxFile::Exists(m_strName) && remove(m_strName.fn_str()) != 0 ) { wxLogSysError(_("can't remove file '%s'"), m_strName.c_str()); return FALSE; @@ -571,6 +581,17 @@ bool wxTempFile::Commit() wxLogSysError(_("can't commit changes to file '%s'"), m_strName.c_str()); return FALSE; } +#else + if ( wxFile::Exists(m_strName) && remove(wxUnix2MacFilename( m_strName )) != 0 ) { + wxLogSysError(_("can't remove file '%s'"), m_strName.c_str()); + return FALSE; + } + + if ( rename(wxUnix2MacFilename( m_strTemp ), wxUnix2MacFilename( m_strName )) != 0 ) { + wxLogSysError(_("can't commit changes to file '%s'"), m_strName.c_str()); + return FALSE; + } +#endif return TRUE; } @@ -578,8 +599,13 @@ bool wxTempFile::Commit() void wxTempFile::Discard() { m_file.Close(); +#ifndef __WXMAC__ if ( remove(m_strTemp.fn_str()) != 0 ) wxLogSysError(_("can't remove temporary file '%s'"), m_strTemp.c_str()); +#else + if ( remove( wxUnix2MacFilename(m_strTemp.fn_str())) != 0 ) + wxLogSysError(_("can't remove temporary file '%s'"), m_strTemp.c_str()); +#endif } #endif