]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/file.cpp
Stupid bug: using LastError() instead of Error()
[wxWidgets.git] / src / common / file.cpp
index 6b65c35e828f9bd977c3d460b134b04e96e78d65..ef24f40f8396bea670b4ea771d4f92039ac8f07b 100644 (file)
     #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__
 
 #endif
 
 // wxWindows
-#include  <wx/string.h>
-#include  <wx/intl.h>
-#include  <wx/file.h>
-#include  <wx/log.h>
+#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(MBSTRINGCAST fname, &st) &&
+           !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;
@@ -481,28 +491,29 @@ 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;
-    mktemp(MBSTRINGCAST m_strTemp.mb_str()); // will do because length doesn't change
+    // can use the cast because length doesn't change
+    mktemp(wxMBSTRINGCAST m_strTemp.mb_str());
 #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");
+    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) (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
 
@@ -561,6 +572,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;
@@ -570,6 +582,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;
 }
@@ -577,8 +600,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