]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filefn.cpp
Check accelerators before sending EVT_CHAR
[wxWidgets.git] / src / common / filefn.cpp
index 650dad3402a3b2858ad92ff75ff27f38a1b008cc..b7ce5c09ec5311cb028530af30751414a87d3f8d 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "wx/utils.h"
 #include "wx/intl.h"
 
 #include "wx/utils.h"
 #include "wx/intl.h"
-#include "wx/file.h"
+#include "wx/file.h" // This does include filefn.h
 #include "wx/filename.h"
 #include "wx/dir.h"
 
 #include "wx/filename.h"
 #include "wx/dir.h"
 
     #include  "wx/mac/private.h"  // includes mac headers
 #endif
 
     #include  "wx/mac/private.h"  // includes mac headers
 #endif
 
-#ifdef __WXWINCE__
-#include "wx/msw/wince/time.h"
-#include "wx/msw/private.h"
-#else
-#include <time.h>
-#endif
-
-#ifdef __WXWINCE__
-// Nothing
-#elif !defined(__MWERKS__)
-    #include <sys/types.h>
-    #include <sys/stat.h>
-#else
-#ifdef __MACH__
-#include <sys/types.h>
-#include <utime.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#else
-    #include <stat.h>
-    #include <unistd.h>
-    #include <unix.h>
-    #include <fcntl.h>
-#endif
-#endif
-
-#ifdef __OS2__
-// need to check for __OS2__ first since currently both
-// __OS2__ and __UNIX__ are defined.
-    #include <process.h>
-    #include "wx/os2/private.h"
-#ifdef __EMX__
-    #include <unistd.h>
-#endif
-#elif defined(__UNIX__)
-    #include <unistd.h>
-    #include <dirent.h>
-    #include <fcntl.h>
-#endif
-
-#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
-#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) && !defined(__WXWINCE__)
-    #include <direct.h>
-    #include <dos.h>
-    #include <io.h>
-#endif // __WINDOWS__
-#endif // native Win compiler
-
-#if defined(__DOS__)
-    #ifdef __WATCOMC__
-        #include <direct.h>
-        #include <dos.h>
-        #include <io.h>
-    #endif
-    #ifdef __DJGPP__
-        #include <unistd.h>
-    #endif
-#endif
-
-#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs
-                    // this (3.1 I believe) and how to test for it.
-                    // If this works for Borland 4.0 as well, then no worries.
-    #include <dir.h>
-#endif
-
-#ifdef __SALFORDC__
-    #include <dir.h>
-    #include <unix.h>
-#endif
-
 #include "wx/log.h"
 
 // No, Cygwin doesn't appear to have fnmatch.h after all.
 #include "wx/log.h"
 
 // No, Cygwin doesn't appear to have fnmatch.h after all.
     #include "wx/msw/wrapwin.h"
     #include "wx/msw/mslu.h"
 
     #include "wx/msw/wrapwin.h"
     #include "wx/msw/mslu.h"
 
-    // for _getcwd
-    #ifdef __MINGW32__
-        #include <io.h>
-    #endif
-
     // sys/cygwin.h is needed for cygwin_conv_to_full_win32_path()
     //
     // note that it must be included after <windows.h>
     // sys/cygwin.h is needed for cygwin_conv_to_full_win32_path()
     //
     // note that it must be included after <windows.h>
@@ -179,7 +104,7 @@ static wxChar wxFileFunctionsBuffer[4*_MAXPATHLEN];
 // VisualAge C++ V4.0 cannot have any external linkage const decs
 // in headers included by more than one primary source
 //
 // VisualAge C++ V4.0 cannot have any external linkage const decs
 // in headers included by more than one primary source
 //
-const off_t wxInvalidOffset = (off_t)-1;
+const int wxInvalidOffset = -1;
 #endif
 
 // ----------------------------------------------------------------------------
 #endif
 
 // ----------------------------------------------------------------------------
@@ -288,7 +213,7 @@ void wxPathList::AddEnvList (const wxString& envVariable)
 void wxPathList::EnsureFileAccessible (const wxString& path)
 {
     wxString path_only(wxPathOnly(path));
 void wxPathList::EnsureFileAccessible (const wxString& path)
 {
     wxString path_only(wxPathOnly(path));
-    if ( !path_only.IsEmpty() )
+    if ( !path_only.empty() )
     {
         if ( !Member(path_only) )
             Add(path_only);
     {
         if ( !Member(path_only) )
             Add(path_only);
@@ -373,14 +298,18 @@ wxFileExists (const wxString& filename)
     return (ret != (DWORD)-1) && !(ret & FILE_ATTRIBUTE_DIRECTORY);
 #else // !__WIN32__
     wxStructStat st;
     return (ret != (DWORD)-1) && !(ret & FILE_ATTRIBUTE_DIRECTORY);
 #else // !__WIN32__
     wxStructStat st;
-    return wxStat(filename, &st) == 0 && (st.st_mode & S_IFREG);
+#ifndef wxNEED_WX_UNISTD_H
+    return wxStat( filename.fn_str() , &st) == 0 && (st.st_mode & S_IFREG);
+#else
+    return wxStat( filename , &st) == 0 && (st.st_mode & S_IFREG);
+#endif
 #endif // __WIN32__/!__WIN32__
 }
 
 bool
 wxIsAbsolutePath (const wxString& filename)
 {
 #endif // __WIN32__/!__WIN32__
 }
 
 bool
 wxIsAbsolutePath (const wxString& filename)
 {
-    if (filename != wxT(""))
+    if (!filename.empty())
     {
 #if defined(__WXMAC__) && !defined(__DARWIN__)
         // Classic or Carbon CodeWarrior like
     {
 #if defined(__WXMAC__) && !defined(__DARWIN__)
         // Classic or Carbon CodeWarrior like
@@ -432,17 +361,16 @@ void wxStripExtension(wxChar *buffer)
 
 void wxStripExtension(wxString& buffer)
 {
 
 void wxStripExtension(wxString& buffer)
 {
-  size_t len = buffer.Length();
-  size_t i = len-1;
-  while (i > 0)
-  {
-    if (buffer.GetChar(i) == wxT('.'))
+    //RN:  Be careful about the handling the case where
+    //buffer.Length() == 0
+    for(size_t i = buffer.Length() - 1; i != wxString::npos; --i)
     {
     {
-      buffer = buffer.Left(i);
-      break;
+        if (buffer.GetChar(i) == wxT('.'))
+        {
+          buffer = buffer.Left(i);
+          break;
+        }
     }
     }
-    i --;
-  }
 }
 
 // Destructive removal of /./ and /../ stuff
 }
 
 // Destructive removal of /./ and /../ stuff
@@ -504,7 +432,7 @@ wxChar *wxRealPath (wxChar *path)
 // Must be destroyed
 wxChar *wxCopyAbsolutePath(const wxString& filename)
 {
 // Must be destroyed
 wxChar *wxCopyAbsolutePath(const wxString& filename)
 {
-  if (filename == wxT(""))
+  if (filename.empty())
     return (wxChar *) NULL;
 
   if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) {
     return (wxChar *) NULL;
 
   if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) {
@@ -564,9 +492,9 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name)
     trimchars[3] = 0;
 
 #ifdef __WXMSW__
     trimchars[3] = 0;
 
 #ifdef __WXMSW__
-     const wxChar     SEP = wxT('\\');
+    const wxChar     SEP = wxT('\\');
 #else
 #else
-     const wxChar     SEP = wxT('/');
+    const wxChar     SEP = wxT('/');
 #endif
     buf[0] = wxT('\0');
     if (name == NULL || *name == wxT('\0'))
 #endif
     buf[0] = wxT('\0');
     if (name == NULL || *name == wxT('\0'))
@@ -660,7 +588,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name)
         if (nm[1] == SEP || nm[1] == 0)
         {        /* ~/filename */
         // FIXME: wxGetUserHome could return temporary storage in Unicode mode
         if (nm[1] == SEP || nm[1] == 0)
         {        /* ~/filename */
         // FIXME: wxGetUserHome could return temporary storage in Unicode mode
-            if ((s = WXSTRINGCAST wxGetUserHome(wxT(""))) != NULL) {
+            if ((s = WXSTRINGCAST wxGetUserHome(wxEmptyString)) != NULL) {
                 if (*++nm)
                     nm++;
             }
                 if (*++nm)
                     nm++;
             }
@@ -719,7 +647,7 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin
 {
   static wxChar dest[_MAXPATHLEN];
 
 {
   static wxChar dest[_MAXPATHLEN];
 
-  if (filename == wxT(""))
+  if (filename.empty())
     return (wxChar *) NULL;
 
   wxStrcpy (dest, WXSTRINGCAST filename);
     return (wxChar *) NULL;
 
   wxStrcpy (dest, WXSTRINGCAST filename);
@@ -755,7 +683,7 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin
   if (wxStrncmp(dest, val, len) == 0)
   {
     wxStrcpy(wxFileFunctionsBuffer, wxT("~"));
   if (wxStrncmp(dest, val, len) == 0)
   {
     wxStrcpy(wxFileFunctionsBuffer, wxT("~"));
-    if (user != wxT(""))
+    if (!user.empty())
            wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user);
     wxStrcat(wxFileFunctionsBuffer, dest + len);
     wxStrcpy (dest, wxFileFunctionsBuffer);
            wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user);
     wxStrcat(wxFileFunctionsBuffer, dest + len);
     wxStrcpy (dest, wxFileFunctionsBuffer);
@@ -847,7 +775,7 @@ wxPathOnly (wxChar *path)
 // Return just the directory, or NULL if no directory
 wxString wxPathOnly (const wxString& path)
 {
 // Return just the directory, or NULL if no directory
 wxString wxPathOnly (const wxString& path)
 {
-    if (path != wxT(""))
+    if (!path.empty())
     {
         wxChar buf[_MAXPATHLEN];
 
     {
         wxChar buf[_MAXPATHLEN];
 
@@ -900,7 +828,7 @@ wxString wxPathOnly (const wxString& path)
         }
 #endif
     }
         }
 #endif
     }
-    return wxString(wxT(""));
+    return wxEmptyString;
 }
 
 // Utility for converting delimiters in DOS filenames to UNIX style
 }
 
 // Utility for converting delimiters in DOS filenames to UNIX style
@@ -915,9 +843,9 @@ wxString wxPathOnly (const wxString& path)
 #define kDefaultPathStyle kCFURLHFSPathStyle
 #endif
 
 #define kDefaultPathStyle kCFURLHFSPathStyle
 #endif
 
-wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent ) 
+wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent )
 {
 {
-       CFURLRef fullURLRef;
+    CFURLRef fullURLRef;
     fullURLRef = CFURLCreateFromFSRef(NULL, fsRef);
     if ( additionalPathComponent )
     {
     fullURLRef = CFURLCreateFromFSRef(NULL, fsRef);
     if ( additionalPathComponent )
     {
@@ -926,19 +854,19 @@ wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathCompon
             additionalPathComponent,false);
         CFRelease( parentURLRef ) ;
     }
             additionalPathComponent,false);
         CFRelease( parentURLRef ) ;
     }
-       CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, kDefaultPathStyle);
-       CFRelease( fullURLRef ) ;
-       return wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding());
+    CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, kDefaultPathStyle);
+    CFRelease( fullURLRef ) ;
+    return wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding());
 }
 
 }
 
-OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef ) 
+OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef )
 {
     OSStatus err = noErr ;
 {
     OSStatus err = noErr ;
-       CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, wxMacCFStringHolder(path ,wxLocale::GetSystemEncoding() ) , kDefaultPathStyle, false);
-       if ( NULL != url )
-       {
-           if ( CFURLGetFSRef(url, fsRef) == false )
-               err = fnfErr ;
+    CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, wxMacCFStringHolder(path ,wxLocale::GetSystemEncoding() ) , kDefaultPathStyle, false);
+    if ( NULL != url )
+    {
+        if ( CFURLGetFSRef(url, fsRef) == false )
+            err = fnfErr ;
         CFRelease( url ) ;
     }
     else
         CFRelease( url ) ;
     }
     else
@@ -948,7 +876,7 @@ OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef )
     return err ;
 }
 
     return err ;
 }
 
-wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname ) 
+wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname )
 {
     CFStringRef cfname = CFStringCreateWithCharacters( kCFAllocatorDefault,
                                                       uniname->unicode,
 {
     CFStringRef cfname = CFStringCreateWithCharacters( kCFAllocatorDefault,
                                                       uniname->unicode,
@@ -986,7 +914,7 @@ wxDos2UnixFilename (wxChar *s)
           *s = _T('/');
 #ifdef __WXMSW__
         else
           *s = _T('/');
 #ifdef __WXMSW__
         else
-          *s = wxTolower (*s);        // Case INDEPENDENT
+          *s = (wxChar)wxTolower (*s);        // Case INDEPENDENT
 #endif
         s++;
       }
 #endif
         s++;
       }
@@ -1096,11 +1024,9 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
         return false;
     }
 
         return false;
     }
 
-#ifdef __UNIX__
     // reset the umask as we want to create the file with exactly the same
     // permissions as the original one
     // 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__
+    wxCHANGE_UMASK(0);
 
     // create file2 with the same permissions than file1 and open it for
     // writing
 
     // create file2 with the same permissions than file1 and open it for
     // writing
@@ -1109,11 +1035,6 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
     if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) )
         return false;
 
     if ( !fileOut.Create(file2, overwrite, 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;
     // copy contents of file1 to file2
     char buf[4096];
     size_t count;
@@ -1216,11 +1137,11 @@ bool wxMkdir(const wxString& dir, int perm)
     #error "Unsupported DOS compiler!"
   #endif
 #else  // !MSW, !DOS and !OS/2 VAC++
     #error "Unsupported DOS compiler!"
   #endif
 #else  // !MSW, !DOS and !OS/2 VAC++
-    (void)perm;
+    wxUnusedVar(perm);
 #ifdef __WXWINCE__
     if ( !CreateDirectory(dirname, NULL) )
 #else
 #ifdef __WXWINCE__
     if ( !CreateDirectory(dirname, NULL) )
 #else
-    if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 )
+    if ( wxMkDir(dir.fn_str()) != 0 )
 #endif
 #endif // !MSW/MSW
     {
 #endif
 #endif // !MSW/MSW
     {
@@ -1323,7 +1244,7 @@ static wxString gs_dirPath;
 wxString wxFindFirstFile(const wxChar *spec, int flags)
 {
     wxSplitPath(spec, &gs_dirPath, NULL, NULL);
 wxString wxFindFirstFile(const wxChar *spec, int flags)
 {
     wxSplitPath(spec, &gs_dirPath, NULL, NULL);
-    if ( gs_dirPath.IsEmpty() )
+    if ( gs_dirPath.empty() )
         gs_dirPath = wxT(".");
     if ( !wxEndsWithPathSeparator(gs_dirPath ) )
         gs_dirPath << wxFILE_SEP_PATH;
         gs_dirPath = wxT(".");
     if ( !wxEndsWithPathSeparator(gs_dirPath ) )
         gs_dirPath << wxFILE_SEP_PATH;
@@ -1348,7 +1269,7 @@ wxString wxFindFirstFile(const wxChar *spec, int flags)
 
     wxString result;
     gs_dir->GetFirst(&result, wxFileNameFromPath(wxString(spec)), dirFlags);
 
     wxString result;
     gs_dir->GetFirst(&result, wxFileNameFromPath(wxString(spec)), dirFlags);
-    if ( result.IsEmpty() )
+    if ( result.empty() )
     {
         wxDELETE(gs_dir);
         return result;
     {
         wxDELETE(gs_dir);
         return result;
@@ -1364,7 +1285,7 @@ wxString wxFindNextFile()
     wxString result;
     gs_dir->GetNext(&result);
 
     wxString result;
     gs_dir->GetNext(&result);
 
-    if ( result.IsEmpty() )
+    if ( result.empty() )
     {
         wxDELETE(gs_dir);
         return result;
     {
         wxDELETE(gs_dir);
         return result;
@@ -1426,7 +1347,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
         if ( getcwd( lbuf , sizeof( lbuf ) ) )
         {
             wxString res( lbuf , *wxConvCurrent ) ;
         if ( getcwd( lbuf , sizeof( lbuf ) ) )
         {
             wxString res( lbuf , *wxConvCurrent ) ;
-                   wxStrcpy( buf , res ) ;                     
+            wxStrcpy( buf , res ) ;
             ok = true;
         }
         else
             ok = true;
         }
         else
@@ -1435,12 +1356,12 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
         APIRET rc;
         ULONG ulDriveNum = 0;
         ULONG ulDriveMap = 0;
         APIRET rc;
         ULONG ulDriveNum = 0;
         ULONG ulDriveMap = 0;
-       rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap);
+        rc = ::DosQueryCurrentDisk(&ulDriveNum, &ulDriveMap);
         ok = rc == 0;
         ok = rc == 0;
-       if (ok)
-       {
-           sz -= 3;
-           rc = ::DosQueryCurrentDir( 0 // current drive
+        if (ok)
+        {
+            sz -= 3;
+            rc = ::DosQueryCurrentDir( 0 // current drive
                                       ,cbuf + 3
                                       ,(PULONG)&sz
                                      );
                                       ,cbuf + 3
                                       ,(PULONG)&sz
                                      );
@@ -1517,7 +1438,7 @@ bool wxSetWorkingDirectory(const wxString& d)
 #elif defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__)
     return (chdir(wxFNSTRINGCAST d.fn_str()) == 0);
 #elif defined(__WINDOWS__)
 #elif defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__)
     return (chdir(wxFNSTRINGCAST d.fn_str()) == 0);
 #elif defined(__WINDOWS__)
-    
+
 #ifdef __WIN32__
 #ifdef __WXWINCE__
     // No equivalent in WinCE
 #ifdef __WIN32__
 #ifdef __WXWINCE__
     // No equivalent in WinCE
@@ -1531,11 +1452,11 @@ bool wxSetWorkingDirectory(const wxString& d)
     if (isDriveSpec)
     {
         wxChar firstChar = d[0];
     if (isDriveSpec)
     {
         wxChar firstChar = d[0];
-        
+
         // To upper case
         if (firstChar > 90)
             firstChar = firstChar - 32;
         // To upper case
         if (firstChar > 90)
             firstChar = firstChar - 32;
-        
+
         // To a drive number
         unsigned int driveNo = firstChar - 64;
         if (driveNo > 0)
         // To a drive number
         unsigned int driveNo = firstChar - 64;
         if (driveNo > 0)
@@ -1545,10 +1466,10 @@ bool wxSetWorkingDirectory(const wxString& d)
         }
     }
     bool success = (chdir(WXSTRINGCAST d) == 0);
         }
     }
     bool success = (chdir(WXSTRINGCAST d) == 0);
-    
+
     return success;
 #endif
     return success;
 #endif
-    
+
 #endif
 }
 
 #endif
 }
 
@@ -1649,13 +1570,13 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename)
             {
                 wxLogLastError(_T("FileTimeToLocalFileTime"));
             }
             {
                 wxLogLastError(_T("FileTimeToLocalFileTime"));
             }
-            
+
             SYSTEMTIME st;
             if ( !::FileTimeToSystemTime(&ftLocal, &st) )
             {
                 wxLogLastError(_T("FileTimeToSystemTime"));
             }
             SYSTEMTIME st;
             if ( !::FileTimeToSystemTime(&ftLocal, &st) )
             {
                 wxLogLastError(_T("FileTimeToSystemTime"));
             }
-            
+
             dateTime.Set(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear,
                 st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
             return dateTime.GetTicks();
             dateTime.Set(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear,
                 st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
             return dateTime.GetTicks();