X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/49d5d881d4cfacbf5a7b902612ac01a348f6809f..cc345f789777f7a06ea5e549f6df338925378c07:/src/common/file.cpp diff --git a/src/common/file.cpp b/src/common/file.cpp index 366a3842d7..6b65c35e82 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__ @@ -59,6 +60,11 @@ #ifdef __GNUWIN32__ #include #endif +#elif (defined(__WXPM__)) + #include + #include + #define W_OK 2 + #define R_OK 4 #elif (defined(__WXSTUBS__)) // Have to ifdef this for different environments #include @@ -156,16 +162,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 +192,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 +203,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; @@ -198,18 +211,12 @@ wxFile::wxFile(const char *szFileName, OpenMode mode) Open(szFileName, mode); } -// dtor -wxFile::~wxFile() -{ - Close(); -} - // 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 +231,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 +253,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); @@ -342,25 +349,25 @@ off_t wxFile::Seek(off_t ofs, wxSeekMode mode) { wxASSERT( IsOpened() ); - int flag = -1; + int origin; switch ( mode ) { + default: + wxFAIL_MSG(_("unknown seek origin")); + case wxFromStart: - flag = SEEK_SET; + origin = SEEK_SET; break; case wxFromCurrent: - flag = SEEK_CUR; + origin = SEEK_CUR; break; case wxFromEnd: - flag = SEEK_END; + origin = SEEK_END; break; - - default: - wxFAIL_MSG(_("unknown seek origin")); } - int iRc = lseek(m_fd, ofs, flag); + int iRc = lseek(m_fd, ofs, origin); if ( iRc == -1 ) { wxLogSysError(_("can't seek on file descriptor %d"), m_fd); return wxInvalidOffset; @@ -474,51 +481,67 @@ 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 +#elif defined(__WXPM__) + // 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"); + m_strTemp << strName << szMktempSuffix; + mkdir(m_strTemp.GetWriteBuf(MAX_PATH)); #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 +561,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 +577,9 @@ 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 +